PageRenderTime 26ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/s3db3.5.10/s3rl.php

https://github.com/drobbins/s3db
PHP | 455 lines | 300 code | 118 blank | 37 comment | 59 complexity | ad7a38f5065ae4ff7660be9dcd113110 MD5 | raw file
  1. <?php
  2. #this script accepts inputs of url,public key and, in case an update is attemtped, an encripted message as well
  3. #where should information on url and public key go? Special project where only admin can access.
  4. ini_set('display_errors',0);
  5. if($_REQUEST['su3d'])
  6. ini_set('display_errors',1);
  7. if($_REQUEST['url']!='' && $_REQUEST['publicKey']!='')
  8. {$case = 'registernewURL';
  9. }
  10. elseif(($_REQUEST['Did']!='' || $_REQUEST['url']!='') && !in_array('newUrl', array_keys($_REQUEST)))
  11. $case = 'findURL';
  12. elseif($_REQUEST['Did']!='' && in_array('newUrl', array_keys($_REQUEST)))
  13. $case = 'updateURL';
  14. else {
  15. echo 's3rl.php is a function to retrieve the url of a specific Did. For documentation and usage please refer to <a href="http://s3db.org/">s3db.org</a>';
  16. }
  17. $url =$_REQUEST['url'];
  18. $publicKey = urldecode($_REQUEST['publicKey']);
  19. $Did = ($_REQUEST['s3rl']!='')?$_REQUEST['s3rl']:$_REQUEST['Did'];
  20. $newUrl = $_REQUEST['newUrl'];
  21. $message = $_REQUEST['message'];
  22. $name = $_REQUEST['name'];
  23. $_REQUEST['description'] = is_base64_encoded($_REQUEST['description'])?base64_decode($_REQUEST['description']):$_REQUEST['description'];
  24. $description=$_REQUEST['description'];
  25. $format=$_REQUEST['format'];
  26. list($regValid, $msg) = registerURL(compact('url', 'publicKey', 'Did', 's3rl', 'newUrl', 'case', 'message','name','format'));
  27. if($regValid)
  28. { $Did = $msg['deployment_id'];
  29. $finName = $msg['name'];
  30. if($case == 'registernewURL')
  31. {echo formatReturn('0','URL registered', $_REQUEST['format'], array('deployment_id'=>$Did, 'name'=>$finName));
  32. }
  33. elseif($case == 'findURL')
  34. {
  35. $cols = array_keys($regs[1]);
  36. $data[0] = $regs[1];
  37. $format =($_REQUEST['format']=='')?'html':$_REQUEST['format'];
  38. $z = compact('data','cols', 'format');
  39. echo outputFormat($z);
  40. }
  41. elseif($case == 'updateURL')
  42. echo formatReturn($GLOBALS['error_codes']['success'],$msg,$format,array('newUrl'=>$newUrl));
  43. exit;
  44. }
  45. else {
  46. echo formatReturn($GLOBALS['error_codes']['wrong_input'],$msg,$format,'');
  47. exit;
  48. }
  49. function registerURL($U)
  50. {#this function call the db but it should NOT leave this one function
  51. extract($U);
  52. include_once('config.inc.php');
  53. $key=$GLOBALS['deployment_project']['key'];
  54. include 'core.header.php';
  55. #include (S3DB_SERVER_ROOT.'/webActions.php');
  56. #require_once(S3DB_SERVER_ROOT.'/s3dbcore/class.db.inc.php');
  57. #include_once(S3DB_SERVER_ROOT.'/s3dbcore/common_functions.inc.php');
  58. #include_once(S3DB_SERVER_ROOT.'/s3dbcore/callback.php');
  59. #Generate Did, and, since we're on it, name if empty
  60. if(!$Did && $case=='registernewURL')
  61. $Did = s3id();
  62. if(!$name && $case=='registernewURL'){
  63. $name = 'D'.$Did;
  64. $U['name']=$name;
  65. }
  66. $db = CreateObject('s3dbapi.db');
  67. $db->Halt_On_Error = 'no';
  68. $db->Host = $GLOBALS['s3db_info']['server']['db']['db_host'];
  69. $db->Type = $GLOBALS['s3db_info']['server']['db']['db_type'];
  70. $db->Database = $GLOBALS['s3db_info']['server']['db']['db_name'];
  71. $db->User = $GLOBALS['s3db_info']['server']['db']['db_user'];
  72. $db->Password = $GLOBALS['s3db_info']['server']['db']['db_pass'];
  73. $db->connect();
  74. $U['db']=$db;
  75. list($inputValid, $errMessage)=validate_register_inputs($U);
  76. if($inputValid){
  77. switch ($case) {
  78. case 'registernewURL':{
  79. $protocol = ($_SERVER['HTTPS']!='')?'https://':'http://';
  80. $url =ereg('localhost', $url)?$protocol.getClientIP().str_replace($protocol.'localhost', '', $url):$url;
  81. #echo $sql;exit;
  82. #echo $s3rl;exit;
  83. if($Did!=''){
  84. $sql = "select * from s3db_deployment where deployment_id = '".$Did."'";
  85. $db->query($sql, __LINE__, __FILE__);
  86. if($db->next_record())
  87. {
  88. return array(False, 'Did already exists. Please provide another one or leave that field blank for an arbitrary value');
  89. }
  90. }
  91. #if($Did!=''){
  92. $sql = "insert into s3db_deployment (deployment_id, url, publickey, message, created_on) values ('".$Did."', '".$url."', '".$publicKey."', '".random_string(20)."', now())";
  93. #echo $sql;
  94. $db->query($sql, __LINE__, __FILE__);
  95. $s3rl = $Did;
  96. #}
  97. #else{
  98. #include('s3id.php');
  99. #$sql = "insert into s3db_deployment (deployment_id, url, publickey, message, created_on) values ('".$Did."', '".$url."', '".$publicKey."', '".random_string(20)."', now())";
  100. #echo $sql;exit;
  101. #$db->query($sql, __LINE__, __FILE__);
  102. if($db->Errno==0){
  103. ##Now create an entry in the project of deployemnts;
  104. #create a remote user to access this entry
  105. $s3ql=compact('user_id','db');
  106. $s3ql['insert']='user';
  107. $s3ql['where']['user_id']=$url.((substr($url, strlen($url)-1,1)=='/')?'':'/').'U1';
  108. $s3ql['where']['permission_level']='111';
  109. $s3ql['format']='php';
  110. $done = unserialize(S3QLaction($s3ql));
  111. //$msg=html2cell($done);
  112. $msg=$done[0];
  113. if(ereg('^(4|9|0)$', $msg['error_code'])){
  114. $remoteUser = $s3ql['where']['user_id'];
  115. $user_id = '1';
  116. $s3ql=compact('user_id','db');
  117. $s3ql['insert']='item';
  118. $s3ql['where']['collection_id']=$GLOBALS['deployment_project']['collection_id'];
  119. $s3ql['where']['item_id']=$Did;
  120. $s3ql['where']['notes']=($name=='')?urlencode('Deployment '.$Did):$name;
  121. $s3ql['format']='php';
  122. $done = unserialize(S3QLaction($s3ql));
  123. $msg=$done[0];
  124. if($msg['error_code']=='0' || $msg['error_code']=='4')
  125. {
  126. $s3ql=compact('user_id','db');
  127. $s3ql['insert']='user';
  128. $s3ql['where']['item_id']=$msg['item_id'];
  129. $s3ql['where']['user_id']=$remoteUser;
  130. $s3ql['where']['permission_level']='222';
  131. $done = S3QLaction($s3ql);
  132. $item_id = $msg['item_id'];
  133. $msg=html2cell($done);$msg=$msg[2];
  134. #find the collectiont rules
  135. $s3ql=compact('user_id','db');
  136. $s3ql['from']='rules';
  137. $s3ql['where']['subject_id']=$GLOBALS['deployment_project']['collection_id'];
  138. $rules = S3QLaction($s3ql);
  139. if(!empty($rules)){
  140. $s3ql=compact('user_id','db');
  141. $s3ql['insert']='statement';
  142. $s3ql['where']['item_id']=$item_id;
  143. foreach ($rules as $key=>$rule_info) {
  144. if(in_array($rule_info['object'], array_keys($_GET))){
  145. $s3ql['where']['rule_id']=$rule_info['rule_id'];
  146. if($rule_info['object']=='keywords'){
  147. $keywords = explode(',', $_GET['keywords']);
  148. foreach ($keywords as $word) {
  149. if(is_base64_encoded($word)) $word = base64_decode($word);
  150. $s3ql['where']['value']=$word;
  151. $done = S3QLaction($s3ql);
  152. }
  153. }
  154. elseif($rule_info['object']=='url'){
  155. $s3ql['where']['value']=$url;
  156. $done = S3QLaction($s3ql);
  157. }
  158. elseif($rule_info['object']=='description'){
  159. $v=$_GET[$rule_info['object']];
  160. if(is_base64_encoded($v)) $v=base64_decode($v);
  161. $s3ql['where']['value']=$v;
  162. $done = S3QLaction($s3ql);
  163. }
  164. elseif($rule_info['object']=='name'){
  165. $s3ql['where']['value']=$name;
  166. $done = S3QLaction($s3ql);
  167. }
  168. else{
  169. $v=$_GET[$rule_info['object']];
  170. $s3ql['where']['value']=$v;
  171. $done = S3QLaction($s3ql);
  172. }
  173. }
  174. }
  175. }
  176. }
  177. }
  178. }
  179. #After registering url, return Did
  180. if($Did!='')
  181. return array(True, array('deployment_id'=>$Did,'name'=>$name));
  182. else {
  183. return array(False, '');
  184. }
  185. break;
  186. }
  187. case 'findURL':{
  188. ##Let's first check if there is already a deployment in this URL
  189. if($url!=''){
  190. $sql = "select * from s3db_deployment where url = '".$url."'";
  191. $db->query($sql, __LINE__, __FILE__);
  192. if($db->next_record())
  193. {
  194. $reg = array('deployment_id'=>$db->f('deployment_id'), 'url'=>$db->f('url'), 'modified_on'=>$db->f('modified_on'));
  195. return (array(True, $reg));
  196. }
  197. }
  198. elseif($Did!='') {
  199. $sql = "select * from s3db_deployment where deployment_id = '".str_replace('D', '', $Did)."'";
  200. $db->query($sql, __LINE__, __FILE__);
  201. if($db->next_record())
  202. {
  203. $reg = array('url'=>$db->f('url'),
  204. 'publicKey'=>$db->f('publickey'),
  205. 'modified_on'=>$db->f('modified_on'));
  206. return array(True, $reg);
  207. }
  208. else {
  209. return array(False, 'Did not found');
  210. }
  211. }
  212. break;
  213. }
  214. case 'updateURL':{
  215. #did the user send the decripted message already? Validate and change the message
  216. if($message!='') #check if it matches whatever is in store for this Did
  217. {
  218. $sql = "select * from s3db_deployment where deployment_id = '".str_replace('D', '', $Did)."'";
  219. $db->query($sql, __LINE__, __FILE__);
  220. if($db->next_record())
  221. {
  222. $oldUrl= $db->f('url');
  223. $storedMessage= $db->f('message');
  224. #do messages match?
  225. if($storedMessage!=$message)
  226. {
  227. #$sql = "update s3db_register set message= '".random_string(20)."' where deployment_id = '".str_replace('D', '', $Did)."'";
  228. return array(False, 'Error code:<error>3</error><description> Decripted Message does not match the request</description>');
  229. }
  230. else {
  231. #echo 'ahaa, you found it :-)';
  232. #update key
  233. $sql = "update s3db_deployment set url = '".$newUrl."', message= '".random_string(20)."', modified_on = now() where deployment_id = '".str_replace('D', '', $Did)."'";
  234. $db->query($sql, __LINE__, __FILE__);
  235. ##Now update the entry on s3db
  236. $sql = "update s3db_statement set url='".$newUrl."' where rule_id='' and item_id=''";
  237. $dbdata = get_object_vars($db);
  238. if($dbdata['Errno']=='0')
  239. return array(True, 'Error code:<error>0</error><description> URL updated</description>');
  240. else {
  241. return array(False, 'Error code:<error>1</error><description> Could not update URL</description>');
  242. }
  243. }
  244. }
  245. else {
  246. return array(False, 'Error code:<error>2</error> Could not find Did');
  247. }
  248. }
  249. else{
  250. #send a message to the url to make sure he is who he says he is
  251. $sql = "select * from s3db_deployment where deployment_id = '".ereg_replace('^D', '', $Did)."'";
  252. $db->query($sql);
  253. if($db->next_record())
  254. {
  255. $publicKey= $db->f('publickey');
  256. $message= $db->f('message');
  257. }
  258. else {
  259. return array(False, 'Could not find URL');
  260. }
  261. #encript it
  262. require_once 'pearlib/RSACrypt/RSA.php';
  263. $encripted = encrypt($message, $publicKey);
  264. if($encripted=='')
  265. $encripted = encrypt($message, urlencode($publicKey));
  266. $ErrMessage = "For authentication, please decript this message using your private key: <message>".rawurlencode($encripted)."</message><br />(Note: you might need to remove url encoding that your browser might have added before decoding. Plase refer to http://www.asciitable.com/ for the correct characters.)";
  267. echo formatReturn($GLOBALS['error_codes']['success'],$ErrMessage, $format, array('encripted'=>$encripted));
  268. exit;
  269. #echo "For authentication, please decript this message using your private key: <message>".rawurlencode($encripted)."</message>";
  270. #echo "<br />(Note: you might need to remove url encoding that your browser might have added before decoding. Plase refer to http://www.asciitable.com/ for the correct characters.)";
  271. # exit;
  272. }
  273. }
  274. }
  275. }
  276. else {
  277. echo formatReturn($GLOBALS['error_codes']['wrong_input'],$errMessage, $format, '');
  278. }
  279. }
  280. function encrypt($message, $publicKey)
  281. {
  282. $plain_text = $message;
  283. $public_key = $publicKey;
  284. $key = Crypt_RSA_Key::fromString($public_key);
  285. if($key->isError())
  286. {return("");}
  287. check_error($key);
  288. $rsa_obj = new Crypt_RSA;
  289. check_error($rsa_obj);
  290. $enc_text = $rsa_obj->encrypt($plain_text, $key);
  291. check_error($rsa_obj);
  292. return ($enc_text);
  293. }
  294. function getClientIP() {
  295. $ip;
  296. if (getenv("HTTP_CLIENT_IP"))
  297. $ip = getenv("HTTP_CLIENT_IP");
  298. else if(getenv("HTTP_X_FORWARDED_FOR"))
  299. $ip = getenv("HTTP_X_FORWARDED_FOR");
  300. else if(getenv("REMOTE_ADDR"))
  301. $ip = getenv("REMOTE_ADDR");
  302. else
  303. $ip = "UNKNOWN";
  304. return $ip;
  305. }
  306. function is_base64_encoded($data)
  307. {
  308. if (preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $data)) {
  309. return TRUE;
  310. } else {
  311. return FALSE;
  312. }
  313. };
  314. function validate_register_inputs($U)
  315. {
  316. extract($U);
  317. #Things to check: name; Did
  318. #Check name: name cannot be equal to a Did and must be unique
  319. if($name){
  320. $sql = "select * from s3db_deployment where deployment_id = '".ereg_replace('^D','',$name)."'";
  321. $db->query($sql);
  322. if($db->next_record()){
  323. return (array(false, "Deployment names cannot be equal to an existing deployment UID."));
  324. }
  325. else {
  326. #Ok, all clear, now let's check the uniqueness of the name
  327. $sql="select * from s3db_statement where rule_id = '".$GLOBALS['deployment_project']['name']['rule_id']."' and value = '".$U['name']."'";
  328. $db->query($sql);
  329. if($db->next_record()){
  330. return (array(false, "Deployment names must be unique. You may leave deployment name empty and a unique name will be generated."));
  331. }
  332. }
  333. return (array(true,"Name successfully validated."));
  334. }
  335. return (array(true));
  336. }
  337. ?>