Nicen the rego form and add back the change password form
[matches/MCTX3420.git] / testing / MCTXWeb / public_html / users / models / funcs.php
1 <?php\r
2 /*\r
3 UserCake Version: 2.0.2\r
4 http://usercake.com\r
5 */\r
6 \r
7 //Functions that do not interact with DB\r
8 //------------------------------------------------------------------------------\r
9 \r
10 //Retrieve a list of all .php files in models/languages\r
11 function getLanguageFiles()\r
12 {\r
13         $directory = "models/languages/";\r
14         $languages = glob($directory . "*.php");\r
15         //print each file name\r
16         return $languages;\r
17 }\r
18 \r
19 //Retrieve a list of all .css files in models/site-templates \r
20 function getTemplateFiles()\r
21 {\r
22         $directory = "models/site-templates/";\r
23         $languages = glob($directory . "*.css");\r
24         //print each file name\r
25         return $languages;\r
26 }\r
27 \r
28 //Retrieve a list of all .php files in root files folder\r
29 function getPageFiles()\r
30 {\r
31         $directory = "";\r
32         $pages = glob($directory . "*.php");\r
33         //print each file name\r
34         foreach ($pages as $page){\r
35                 $row[$page] = $page;\r
36         }\r
37         return $row;\r
38 }\r
39 \r
40 //Destroys a session as part of logout\r
41 function destroySession($name)\r
42 {\r
43         if(isset($_SESSION[$name]))\r
44         {\r
45                 $_SESSION[$name] = NULL;\r
46                 unset($_SESSION[$name]);\r
47         }\r
48 }\r
49 \r
50 //Generate a unique code\r
51 function getUniqueCode($length = "")\r
52 {       \r
53         $code = md5(uniqid(rand(), true));\r
54         if ($length != "") return substr($code, 0, $length);\r
55         else return $code;\r
56 }\r
57 \r
58 //Generate an activation key\r
59 function generateActivationToken($gen = null)\r
60 {\r
61         do\r
62         {\r
63                 $gen = md5(uniqid(mt_rand(), false));\r
64         }\r
65         while(validateActivationToken($gen));\r
66         return $gen;\r
67 }\r
68 \r
69 //@ Thanks to - http://phpsec.org\r
70 function generateHash($plainText, $salt = null)\r
71 {\r
72         if ($salt === null)\r
73         {\r
74                 //$salt = substr(md5(uniqid(rand(), true)), 0, 25); // Original UserCake\r
75                 $random = file_get_contents("/dev/urandom", false, null, 0, 25); // Get random number\r
76                 $salt = '$6$'.bin2hex($random).'$'; // Make hex salt\r
77                 \r
78         }\r
79         //return $salt . sha1($salt . $plainText); // Original UserCake\r
80         return crypt($plainText, $salt);\r
81 }\r
82 \r
83 /**\r
84  * Generates a random password for emailing to new users.\r
85  * User should be asked to change the password.\r
86  */\r
87 function generatePassword()\r
88 {\r
89   $random = file_get_contents("/dev/urandom", false, null, 0, 25);\r
90   return bin2hex($random);\r
91 }\r
92 \r
93 //Checks if an email is valid\r
94 function isValidEmail($email)\r
95 {\r
96         if (filter_var($email, FILTER_VALIDATE_EMAIL)) {\r
97                 return true;\r
98         }\r
99         else {\r
100                 return false;\r
101         }\r
102 }\r
103 \r
104 //Inputs language strings from selected language.\r
105 function lang($key,$markers = NULL)\r
106 {\r
107         global $lang;\r
108         if($markers == NULL)\r
109         {\r
110                 $str = $lang[$key];\r
111         }\r
112         else\r
113         {\r
114                 //Replace any dyamic markers\r
115                 $str = $lang[$key];\r
116                 $iteration = 1;\r
117                 foreach($markers as $marker)\r
118                 {\r
119                         $str = str_replace("%m".$iteration."%",$marker,$str);\r
120                         $iteration++;\r
121                 }\r
122         }\r
123         //Ensure we have something to return\r
124         if($str == "")\r
125         {\r
126                 return ("No language key found");\r
127         }\r
128         else\r
129         {\r
130                 return $str;\r
131         }\r
132 }\r
133 \r
134 //Checks if a string is within a min and max length\r
135 function minMaxRange($min, $max, $what)\r
136 {\r
137         if(strlen(trim($what)) < $min)\r
138                 return true;\r
139         else if(strlen(trim($what)) > $max)\r
140                 return true;\r
141         else\r
142         return false;\r
143 }\r
144 \r
145 //Replaces hooks with specified text\r
146 function replaceDefaultHook($str)\r
147 {\r
148         global $default_hooks,$default_replace; \r
149         return (str_replace($default_hooks,$default_replace,$str));\r
150 }\r
151 \r
152 //Displays error and success messages\r
153 function resultBlock($errors,$successes){\r
154         //Error block\r
155         if(count($errors) > 0)\r
156         {\r
157                 echo "<div id='result' class='fail'>";\r
158     \r
159                 foreach($errors as $error)\r
160                 {\r
161                         echo "<p>".$error."</p>";\r
162                 }\r
163                 echo "</div>";\r
164         }\r
165         //Success block\r
166         if(count($successes) > 0)\r
167         {\r
168                 echo "<div id='success'>";\r
169                 foreach($successes as $success)\r
170                 {\r
171       echo "<p>".$success."</li>";\r
172                 }\r
173                 echo "</div>";\r
174         }\r
175 }\r
176 \r
177 function notificationBlock($errors, $successes) {\r
178   if (count($errors) > 0 || count($successes) > 0)\r
179   {\r
180     echo '\r
181           <div class="widget dismiss-container">\r
182             <div class="dismiss right">\r
183               <a href="#">Dismiss</a>\r
184             </div>\r
185             \r
186             <div class="title large">Notifications</div>\r
187     ';\r
188     \r
189     foreach ($errors as $error)\r
190     {\r
191       echo '<p class="fail">'.$error.'</p>';\r
192     }\r
193     \r
194     foreach ($successes as $success)\r
195     {\r
196       echo '<p>'.$success.'</p>';\r
197     }\r
198     \r
199     echo '\r
200           </div>\r
201           <script type="text/javascript">\r
202             $(".dismiss").click(function() {\r
203               $(".dismiss-container").css("display", "none");\r
204             })\r
205           </script>\r
206     ';\r
207   }\r
208 }\r
209 \r
210 //Completely sanitizes text\r
211 function sanitize($str)\r
212 {\r
213         return strtolower(strip_tags(trim(($str))));\r
214 }\r
215 \r
216 //Functions that interact mainly with .users table\r
217 //------------------------------------------------------------------------------\r
218 \r
219 //Delete a defined array of users\r
220 function deleteUsers($users) {\r
221         global $mysqli,$db_table_prefix; \r
222         $i = 0;\r
223         $stmt = $mysqli->prepare("DELETE FROM ".$db_table_prefix."users \r
224                 WHERE id = ?");\r
225         $stmt2 = $mysqli->prepare("DELETE FROM ".$db_table_prefix."user_permission_matches \r
226                 WHERE user_id = ?");\r
227         foreach($users as $id){\r
228                 $stmt->bind_param("i", $id);\r
229                 $stmt->execute();\r
230                 $stmt2->bind_param("i", $id);\r
231                 $stmt2->execute();\r
232                 $i++;\r
233         }\r
234         $stmt->close();\r
235         $stmt2->close();\r
236         return $i;\r
237 }\r
238 \r
239 //Check if a display name exists in the DB\r
240 function displayNameExists($displayname)\r
241 {\r
242         global $mysqli,$db_table_prefix;\r
243         $stmt = $mysqli->prepare("SELECT active\r
244                 FROM ".$db_table_prefix."users\r
245                 WHERE\r
246                 display_name = ?\r
247                 LIMIT 1");\r
248         $stmt->bind_param("s", $displayname);   \r
249         $stmt->execute();\r
250         $stmt->store_result();\r
251         $num_returns = $stmt->num_rows;\r
252         $stmt->close();\r
253         \r
254         if ($num_returns > 0)\r
255         {\r
256                 return true;\r
257         }\r
258         else\r
259         {\r
260                 return false;   \r
261         }\r
262 }\r
263 \r
264 //Check if an email exists in the DB\r
265 function emailExists($email)\r
266 {\r
267         global $mysqli,$db_table_prefix;\r
268         $stmt = $mysqli->prepare("SELECT active\r
269                 FROM ".$db_table_prefix."users\r
270                 WHERE\r
271                 email = ?\r
272                 LIMIT 1");\r
273         $stmt->bind_param("s", $email); \r
274         $stmt->execute();\r
275         $stmt->store_result();\r
276         $num_returns = $stmt->num_rows;\r
277         $stmt->close();\r
278         \r
279         if ($num_returns > 0)\r
280         {\r
281                 return true;\r
282         }\r
283         else\r
284         {\r
285                 return false;   \r
286         }\r
287 }\r
288 \r
289 //Check if a user name and email belong to the same user\r
290 function emailUsernameLinked($email,$username)\r
291 {\r
292         global $mysqli,$db_table_prefix;\r
293         $stmt = $mysqli->prepare("SELECT active\r
294                 FROM ".$db_table_prefix."users\r
295                 WHERE user_name = ?\r
296                 AND\r
297                 email = ?\r
298                 LIMIT 1\r
299                 ");\r
300         $stmt->bind_param("ss", $username, $email);     \r
301         $stmt->execute();\r
302         $stmt->store_result();\r
303         $num_returns = $stmt->num_rows;\r
304         $stmt->close();\r
305         \r
306         if ($num_returns > 0)\r
307         {\r
308                 return true;\r
309         }\r
310         else\r
311         {\r
312                 return false;   \r
313         }\r
314 }\r
315 \r
316 function permissionNameToId($permission)\r
317 {\r
318         global $mysqli,$db_table_prefix;\r
319         $stmt = $mysqli->prepare("SELECT id\r
320                 FROM ".$db_table_prefix."permissions\r
321                 WHERE\r
322                 name = ?\r
323                 LIMIT 1");\r
324         $stmt->bind_param("s", $permission);    \r
325         $stmt->execute();\r
326         $stmt->bind_result($id);\r
327   \r
328   while ($stmt->fetch()){\r
329                 $perm_id = $id;\r
330   }\r
331         $stmt->close();\r
332         \r
333   return $perm_id;\r
334 }\r
335 \r
336 function fetchAllUsersWithPerm($perm_name)\r
337 {\r
338         global $mysqli,$db_table_prefix; \r
339   \r
340   $perm_id = permissionNameToId($perm_name);\r
341         $stmt = $mysqli->prepare("SELECT \r
342                 p1.id\r
343                 FROM ".$db_table_prefix."users p1\r
344     WHERE EXISTS (SELECT * FROM ".$db_table_prefix."user_permission_matches\r
345                  WHERE user_id=p1.id AND permission_id=?)"\r
346   );\r
347   $stmt->bind_param("i", $perm_id); \r
348         $stmt->execute();\r
349         $stmt->bind_result($id);\r
350         \r
351         while ($stmt->fetch()){\r
352                 $row[] = $id;\r
353         }\r
354         $stmt->close();\r
355         return ($row);\r
356 }\r
357 \r
358 function fetchAllUsersWithoutPerm($perm_name)\r
359 {\r
360         global $mysqli,$db_table_prefix; \r
361   \r
362   $perm_id = permissionNameToId($perm_name);\r
363         $stmt = $mysqli->prepare("SELECT \r
364                 p1.id\r
365                 FROM ".$db_table_prefix."users p1\r
366     WHERE NOT EXISTS (SELECT * FROM ".$db_table_prefix."user_permission_matches\r
367                  WHERE user_id=p1.id AND permission_id=?)"\r
368   );\r
369   $stmt->bind_param("i", $perm_id); \r
370         $stmt->execute();\r
371         $stmt->bind_result($id);\r
372         \r
373         while ($stmt->fetch()){\r
374                 $row[] = $id;\r
375         }\r
376         $stmt->close();\r
377         return ($row);\r
378 }\r
379 \r
380 //Retrieve information for all users\r
381 function fetchAllUsers()\r
382 {\r
383         global $mysqli,$db_table_prefix; \r
384         $stmt = $mysqli->prepare("SELECT \r
385                 id,\r
386                 user_name,\r
387                 display_name,\r
388                 password,\r
389                 email,\r
390                 activation_token,\r
391                 last_activation_request,\r
392                 lost_password_request,\r
393                 active,\r
394                 title,\r
395                 sign_up_stamp,\r
396                 last_sign_in_stamp\r
397                 FROM ".$db_table_prefix."users");\r
398         $stmt->execute();\r
399         $stmt->bind_result($id, $user, $display, $password, $email, $token, $activationRequest, $passwordRequest, $active, $title, $signUp, $signIn);\r
400         \r
401         while ($stmt->fetch()){\r
402                 $row[] = array('id' => $id, 'user_name' => $user, 'display_name' => $display, 'password' => $password, 'email' => $email, 'activation_token' => $token, 'last_activation_request' => $activationRequest, 'lost_password_request' => $passwordRequest, 'active' => $active, 'title' => $title, 'sign_up_stamp' => $signUp, 'last_sign_in_stamp' => $signIn);\r
403         }\r
404         $stmt->close();\r
405         return ($row);\r
406 }\r
407 \r
408 //Yeah usercake... Fetches the user id from username\r
409 function fetchUserId($username)\r
410 {\r
411   global $mysqli,$db_table_prefix; \r
412   $stmt = $mysqli->prepare("SELECT \r
413                 id\r
414                 FROM ".$db_table_prefix."users\r
415                 WHERE\r
416                 user_name = ?\r
417                 LIMIT 1");\r
418                 $stmt->bind_param("s", $username);\r
419         \r
420         $stmt->execute();\r
421         $stmt->bind_result($id);\r
422         while ($stmt->fetch()){\r
423                 $user_id = $id;\r
424         }\r
425         $stmt->close();\r
426         return $user_id;\r
427 }\r
428 \r
429 //Retrieve complete user information by username, token or ID\r
430 function fetchUserDetails($username=NULL,$token=NULL, $id=NULL)\r
431 {\r
432         if($username!=NULL) {\r
433                 $column = "user_name";\r
434                 $data = $username;\r
435         }\r
436         elseif($token!=NULL) {\r
437                 $column = "activation_token";\r
438                 $data = $token;\r
439         }\r
440         elseif($id!=NULL) {\r
441                 $column = "id";\r
442                 $data = $id;\r
443         }\r
444         global $mysqli,$db_table_prefix; \r
445         $stmt = $mysqli->prepare("SELECT \r
446                 id,\r
447                 user_name,\r
448                 display_name,\r
449                 password,\r
450                 email,\r
451                 activation_token,\r
452                 last_activation_request,\r
453                 lost_password_request,\r
454                 active,\r
455                 title,\r
456                 sign_up_stamp,\r
457                 last_sign_in_stamp\r
458                 FROM ".$db_table_prefix."users\r
459                 WHERE\r
460                 $column = ?\r
461                 LIMIT 1");\r
462                 $stmt->bind_param("s", $data);\r
463         \r
464         $stmt->execute();\r
465         $stmt->bind_result($id, $user, $display, $password, $email, $token, $activationRequest, $passwordRequest, $active, $title, $signUp, $signIn);\r
466         while ($stmt->fetch()){\r
467                 $row = array('id' => $id, 'user_name' => $user, 'display_name' => $display, 'password' => $password, 'email' => $email, 'activation_token' => $token, 'last_activation_request' => $activationRequest, 'lost_password_request' => $passwordRequest, 'active' => $active, 'title' => $title, 'sign_up_stamp' => $signUp, 'last_sign_in_stamp' => $signIn);\r
468         }\r
469         $stmt->close();\r
470         return ($row);\r
471 }\r
472 \r
473 //Toggle if lost password request flag on or off\r
474 function flagLostPasswordRequest($username,$value)\r
475 {\r
476         global $mysqli,$db_table_prefix;\r
477         $stmt = $mysqli->prepare("UPDATE ".$db_table_prefix."users\r
478                 SET lost_password_request = ?\r
479                 WHERE\r
480                 user_name = ?\r
481                 LIMIT 1\r
482                 ");\r
483         $stmt->bind_param("ss", $value, $username);\r
484         $result = $stmt->execute();\r
485         $stmt->close();\r
486         return $result;\r
487 }\r
488 \r
489 //Check if a user is logged in\r
490 function isUserLoggedIn()\r
491 {\r
492         global $loggedInUser,$mysqli,$db_table_prefix;\r
493         $stmt = $mysqli->prepare("SELECT \r
494                 id,\r
495                 password\r
496                 FROM ".$db_table_prefix."users\r
497                 WHERE\r
498                 id = ?\r
499                 AND \r
500                 password = ? \r
501                 AND\r
502                 active = 1\r
503                 LIMIT 1");\r
504         $stmt->bind_param("is", $loggedInUser->user_id, $loggedInUser->hash_pw);        \r
505         $stmt->execute();\r
506         $stmt->store_result();\r
507         $num_returns = $stmt->num_rows;\r
508         $stmt->close();\r
509         \r
510         if($loggedInUser == NULL)\r
511         {\r
512                 return false;\r
513         }\r
514         else\r
515         {\r
516                 if ($num_returns > 0)\r
517                 {\r
518                         return true;\r
519                 }\r
520                 else\r
521                 {\r
522                         destroySession("userCakeUser");\r
523                         return false;   \r
524                 }\r
525         }\r
526 }\r
527 \r
528 //Change a user from inactive to active\r
529 function setUserActive($token)\r
530 {\r
531         global $mysqli,$db_table_prefix;\r
532         $stmt = $mysqli->prepare("UPDATE ".$db_table_prefix."users\r
533                 SET active = 1\r
534                 WHERE\r
535                 activation_token = ?\r
536                 LIMIT 1");\r
537         $stmt->bind_param("s", $token);\r
538         $result = $stmt->execute();\r
539         $stmt->close(); \r
540         return $result;\r
541 }\r
542 \r
543 //Change a user's display name\r
544 function updateDisplayName($id, $display)\r
545 {\r
546         global $mysqli,$db_table_prefix;\r
547         $stmt = $mysqli->prepare("UPDATE ".$db_table_prefix."users\r
548                 SET display_name = ?\r
549                 WHERE\r
550                 id = ?\r
551                 LIMIT 1");\r
552         $stmt->bind_param("si", $display, $id);\r
553         $result = $stmt->execute();\r
554         $stmt->close();\r
555         return $result;\r
556 }\r
557 \r
558 //Update a user's email\r
559 function updateEmail($id, $email)\r
560 {\r
561         global $mysqli,$db_table_prefix;\r
562         $stmt = $mysqli->prepare("UPDATE ".$db_table_prefix."users\r
563                 SET \r
564                 email = ?\r
565                 WHERE\r
566                 id = ?");\r
567         $stmt->bind_param("si", $email, $id);\r
568         $result = $stmt->execute();\r
569         $stmt->close(); \r
570         return $result;\r
571 }\r
572 \r
573 //Input new activation token, and update the time of the most recent activation request\r
574 function updateLastActivationRequest($new_activation_token,$username,$email)\r
575 {\r
576         global $mysqli,$db_table_prefix;        \r
577         $stmt = $mysqli->prepare("UPDATE ".$db_table_prefix."users\r
578                 SET activation_token = ?,\r
579                 last_activation_request = ?\r
580                 WHERE email = ?\r
581                 AND\r
582                 user_name = ?");\r
583         $stmt->bind_param("ssss", $new_activation_token, time(), $email, $username);\r
584         $result = $stmt->execute();\r
585         $stmt->close(); \r
586         return $result;\r
587 }\r
588 \r
589 //Generate a random password, and new token\r
590 function updatePasswordFromToken($pass,$token)\r
591 {\r
592         global $mysqli,$db_table_prefix;\r
593         $new_activation_token = generateActivationToken();\r
594         $stmt = $mysqli->prepare("UPDATE ".$db_table_prefix."users\r
595                 SET password = ?,\r
596                 activation_token = ?\r
597                 WHERE\r
598                 activation_token = ?");\r
599         $stmt->bind_param("sss", $pass, $new_activation_token, $token);\r
600         $result = $stmt->execute();\r
601         $stmt->close(); \r
602         return $result;\r
603 }\r
604 \r
605 //Update a user's title\r
606 function updateTitle($id, $title)\r
607 {\r
608         global $mysqli,$db_table_prefix;\r
609         $stmt = $mysqli->prepare("UPDATE ".$db_table_prefix."users\r
610                 SET \r
611                 title = ?\r
612                 WHERE\r
613                 id = ?");\r
614         $stmt->bind_param("si", $title, $id);\r
615         $result = $stmt->execute();\r
616         $stmt->close(); \r
617         return $result; \r
618 }\r
619 \r
620 //Check if a user ID exists in the DB\r
621 function userIdExists($id)\r
622 {\r
623         global $mysqli,$db_table_prefix;\r
624         $stmt = $mysqli->prepare("SELECT active\r
625                 FROM ".$db_table_prefix."users\r
626                 WHERE\r
627                 id = ?\r
628                 LIMIT 1");\r
629         $stmt->bind_param("i", $id);    \r
630         $stmt->execute();\r
631         $stmt->store_result();\r
632         $num_returns = $stmt->num_rows;\r
633         $stmt->close();\r
634         \r
635         if ($num_returns > 0)\r
636         {\r
637                 return true;\r
638         }\r
639         else\r
640         {\r
641                 return false;   \r
642         }\r
643 }\r
644 \r
645 //Checks if a username exists in the DB\r
646 function usernameExists($username)\r
647 {\r
648         global $mysqli,$db_table_prefix;\r
649         $stmt = $mysqli->prepare("SELECT active\r
650                 FROM ".$db_table_prefix."users\r
651                 WHERE\r
652                 user_name = ?\r
653                 LIMIT 1");\r
654         $stmt->bind_param("s", $username);      \r
655         $stmt->execute();\r
656         $stmt->store_result();\r
657         $num_returns = $stmt->num_rows;\r
658         $stmt->close();\r
659         \r
660         if ($num_returns > 0)\r
661         {\r
662                 return true;\r
663         }\r
664         else\r
665         {\r
666                 return false;   \r
667         }\r
668 }\r
669 \r
670 //Check if activation token exists in DB\r
671 function validateActivationToken($token,$lostpass=NULL)\r
672 {\r
673         global $mysqli,$db_table_prefix;\r
674         if($lostpass == NULL) \r
675         {       \r
676                 $stmt = $mysqli->prepare("SELECT active\r
677                         FROM ".$db_table_prefix."users\r
678                         WHERE active = 0\r
679                         AND\r
680                         activation_token = ?\r
681                         LIMIT 1");\r
682         }\r
683         else \r
684         {\r
685                 $stmt = $mysqli->prepare("SELECT active\r
686                         FROM ".$db_table_prefix."users\r
687                         WHERE active = 1\r
688                         AND\r
689                         activation_token = ?\r
690                         AND\r
691                         lost_password_request = 1 \r
692                         LIMIT 1");\r
693         }\r
694         $stmt->bind_param("s", $token);\r
695         $stmt->execute();\r
696         $stmt->store_result();\r
697                 $num_returns = $stmt->num_rows;\r
698         $stmt->close();\r
699         \r
700         if ($num_returns > 0)\r
701         {\r
702                 return true;\r
703         }\r
704         else\r
705         {\r
706                 return false;   \r
707         }\r
708 }\r
709 \r
710 //Functions that interact mainly with .permissions table\r
711 //------------------------------------------------------------------------------\r
712 \r
713 //Create a permission level in DB\r
714 function createPermission($permission) {\r
715         global $mysqli,$db_table_prefix; \r
716         $stmt = $mysqli->prepare("INSERT INTO ".$db_table_prefix."permissions (\r
717                 name\r
718                 )\r
719                 VALUES (\r
720                 ?\r
721                 )");\r
722         $stmt->bind_param("s", $permission);\r
723         $result = $stmt->execute();\r
724         $stmt->close(); \r
725         return $result;\r
726 }\r
727 \r
728 //Delete a permission level from the DB\r
729 function deletePermission($permission) {\r
730         global $mysqli,$db_table_prefix,$errors; \r
731         $i = 0;\r
732         $stmt = $mysqli->prepare("DELETE FROM ".$db_table_prefix."permissions \r
733                 WHERE id = ?");\r
734         $stmt2 = $mysqli->prepare("DELETE FROM ".$db_table_prefix."user_permission_matches \r
735                 WHERE permission_id = ?");\r
736         $stmt3 = $mysqli->prepare("DELETE FROM ".$db_table_prefix."permission_page_matches \r
737                 WHERE permission_id = ?");\r
738         foreach($permission as $id){\r
739                 if ($id == 1){\r
740                         $errors[] = lang("CANNOT_DELETE_NEWUSERS");\r
741                 }\r
742                 elseif ($id == 2){\r
743                         $errors[] = lang("CANNOT_DELETE_ADMIN");\r
744                 }\r
745                 else{\r
746                         $stmt->bind_param("i", $id);\r
747                         $stmt->execute();\r
748                         $stmt2->bind_param("i", $id);\r
749                         $stmt2->execute();\r
750                         $stmt3->bind_param("i", $id);\r
751                         $stmt3->execute();\r
752                         $i++;\r
753                 }\r
754         }\r
755         $stmt->close();\r
756         $stmt2->close();\r
757         $stmt3->close();\r
758         return $i;\r
759 }\r
760 \r
761 //Retrieve information for all permission levels\r
762 function fetchAllPermissions()\r
763 {\r
764         global $mysqli,$db_table_prefix; \r
765         $stmt = $mysqli->prepare("SELECT \r
766                 id,\r
767                 name\r
768                 FROM ".$db_table_prefix."permissions");\r
769         $stmt->execute();\r
770         $stmt->bind_result($id, $name);\r
771         while ($stmt->fetch()){\r
772                 $row[] = array('id' => $id, 'name' => $name);\r
773         }\r
774         $stmt->close();\r
775         return ($row);\r
776 }\r
777 \r
778 //Retrieve information for a single permission level\r
779 function fetchPermissionDetails($id)\r
780 {\r
781         global $mysqli,$db_table_prefix; \r
782         $stmt = $mysqli->prepare("SELECT \r
783                 id,\r
784                 name\r
785                 FROM ".$db_table_prefix."permissions\r
786                 WHERE\r
787                 id = ?\r
788                 LIMIT 1");\r
789         $stmt->bind_param("i", $id);\r
790         $stmt->execute();\r
791         $stmt->bind_result($id, $name);\r
792         while ($stmt->fetch()){\r
793                 $row = array('id' => $id, 'name' => $name);\r
794         }\r
795         $stmt->close();\r
796         return ($row);\r
797 }\r
798 \r
799 //Check if a permission level ID exists in the DB\r
800 function permissionIdExists($id)\r
801 {\r
802         global $mysqli,$db_table_prefix;\r
803         $stmt = $mysqli->prepare("SELECT id\r
804                 FROM ".$db_table_prefix."permissions\r
805                 WHERE\r
806                 id = ?\r
807                 LIMIT 1");\r
808         $stmt->bind_param("i", $id);    \r
809         $stmt->execute();\r
810         $stmt->store_result();\r
811         $num_returns = $stmt->num_rows;\r
812         $stmt->close();\r
813         \r
814         if ($num_returns > 0)\r
815         {\r
816                 return true;\r
817         }\r
818         else\r
819         {\r
820                 return false;   \r
821         }\r
822 }\r
823 \r
824 //Check if a permission level name exists in the DB\r
825 function permissionNameExists($permission)\r
826 {\r
827         global $mysqli,$db_table_prefix;\r
828         $stmt = $mysqli->prepare("SELECT id\r
829                 FROM ".$db_table_prefix."permissions\r
830                 WHERE\r
831                 name = ?\r
832                 LIMIT 1");\r
833         $stmt->bind_param("s", $permission);    \r
834         $stmt->execute();\r
835         $stmt->store_result();\r
836         $num_returns = $stmt->num_rows;\r
837         $stmt->close();\r
838         \r
839         if ($num_returns > 0)\r
840         {\r
841                 return true;\r
842         }\r
843         else\r
844         {\r
845                 return false;   \r
846         }\r
847 }\r
848 \r
849 //Change a permission level's name\r
850 function updatePermissionName($id, $name)\r
851 {\r
852         global $mysqli,$db_table_prefix;\r
853         $stmt = $mysqli->prepare("UPDATE ".$db_table_prefix."permissions\r
854                 SET name = ?\r
855                 WHERE\r
856                 id = ?\r
857                 LIMIT 1");\r
858         $stmt->bind_param("si", $name, $id);\r
859         $result = $stmt->execute();\r
860         $stmt->close(); \r
861         return $result; \r
862 }\r
863 \r
864 //Functions that interact mainly with .user_permission_matches table\r
865 //------------------------------------------------------------------------------\r
866 \r
867 //Match permission level(s) with user(s)\r
868 function addPermission($permission, $user) {\r
869         global $mysqli,$db_table_prefix; \r
870         $i = 0;\r
871         $stmt = $mysqli->prepare("INSERT INTO ".$db_table_prefix."user_permission_matches (\r
872                 permission_id,\r
873                 user_id\r
874                 )\r
875                 VALUES (\r
876                 ?,\r
877                 ?\r
878                 )");\r
879         if (is_array($permission)){\r
880                 foreach($permission as $id){\r
881                         $stmt->bind_param("ii", $id, $user);\r
882                         $stmt->execute();\r
883                         $i++;\r
884                 }\r
885         }\r
886         elseif (is_array($user)){\r
887                 foreach($user as $id){\r
888                         $stmt->bind_param("ii", $permission, $id);\r
889                         $stmt->execute();\r
890                         $i++;\r
891                 }\r
892         }\r
893         else {\r
894                 $stmt->bind_param("ii", $permission, $user);\r
895                 $stmt->execute();\r
896                 $i++;\r
897         }\r
898         $stmt->close();\r
899         return $i;\r
900 }\r
901 \r
902 //Retrieve information for all user/permission level matches\r
903 function fetchAllMatches()\r
904 {\r
905         global $mysqli,$db_table_prefix; \r
906         $stmt = $mysqli->prepare("SELECT \r
907                 id,\r
908                 user_id,\r
909                 permission_id\r
910                 FROM ".$db_table_prefix."user_permission_matches");\r
911         $stmt->execute();\r
912         $stmt->bind_result($id, $user, $permission);\r
913         while ($stmt->fetch()){\r
914                 $row[] = array('id' => $id, 'user_id' => $user, 'permission_id' => $permission);\r
915         }\r
916         $stmt->close();\r
917         return ($row);  \r
918 }\r
919 \r
920 //Retrieve list of permission levels a user has\r
921 function fetchUserPermissions($user_id)\r
922 {\r
923         global $mysqli,$db_table_prefix; \r
924         $stmt = $mysqli->prepare("SELECT\r
925                 id,\r
926                 permission_id\r
927                 FROM ".$db_table_prefix."user_permission_matches\r
928                 WHERE user_id = ?\r
929                 ");\r
930         $stmt->bind_param("i", $user_id);       \r
931         $stmt->execute();\r
932         $stmt->bind_result($id, $permission);\r
933         while ($stmt->fetch()){\r
934                 $row[$permission] = array('id' => $id, 'permission_id' => $permission);\r
935         }\r
936         $stmt->close();\r
937         if (isset($row)){\r
938                 return ($row);\r
939         }\r
940 }\r
941 \r
942 //Retrieve list of users who have a permission level\r
943 function fetchPermissionUsers($permission_id)\r
944 {\r
945         global $mysqli,$db_table_prefix; \r
946         $stmt = $mysqli->prepare("SELECT id, user_id\r
947                 FROM ".$db_table_prefix."user_permission_matches\r
948                 WHERE permission_id = ?\r
949                 ");\r
950         $stmt->bind_param("i", $permission_id); \r
951         $stmt->execute();\r
952         $stmt->bind_result($id, $user);\r
953         while ($stmt->fetch()){\r
954                 $row[$user] = array('id' => $id, 'user_id' => $user);\r
955         }\r
956         $stmt->close();\r
957         if (isset($row)){\r
958                 return ($row);\r
959         }\r
960 }\r
961 \r
962 //Unmatch permission level(s) from user(s)\r
963 function removePermission($permission, $user) {\r
964         global $mysqli,$db_table_prefix; \r
965         $i = 0;\r
966         $stmt = $mysqli->prepare("DELETE FROM ".$db_table_prefix."user_permission_matches \r
967                 WHERE permission_id = ?\r
968                 AND user_id =?");\r
969         if (is_array($permission)){\r
970                 foreach($permission as $id){\r
971                         $stmt->bind_param("ii", $id, $user);\r
972                         $stmt->execute();\r
973                         $i++;\r
974                 }\r
975         }\r
976         elseif (is_array($user)){\r
977                 foreach($user as $id){\r
978                         $stmt->bind_param("ii", $permission, $id);\r
979                         $stmt->execute();\r
980                         $i++;\r
981                 }\r
982         }\r
983         else {\r
984                 $stmt->bind_param("ii", $permission, $user);\r
985                 $stmt->execute();\r
986                 $i++;\r
987         }\r
988         $stmt->close();\r
989         return $i;\r
990 }\r
991 \r
992 //Functions that interact mainly with .configuration table\r
993 //------------------------------------------------------------------------------\r
994 \r
995 //Update configuration table\r
996 function updateConfig($id, $value)\r
997 {\r
998         global $mysqli,$db_table_prefix;\r
999         $stmt = $mysqli->prepare("UPDATE ".$db_table_prefix."configuration\r
1000                 SET \r
1001                 value = ?\r
1002                 WHERE\r
1003                 id = ?");\r
1004         foreach ($id as $cfg){\r
1005                 $stmt->bind_param("si", $value[$cfg], $cfg);\r
1006                 $stmt->execute();\r
1007         }\r
1008         $stmt->close(); \r
1009 }\r
1010 \r
1011 //Functions that interact mainly with .pages table\r
1012 //------------------------------------------------------------------------------\r
1013 \r
1014 //Add a page to the DB\r
1015 function createPages($pages) {\r
1016         global $mysqli,$db_table_prefix; \r
1017         $stmt = $mysqli->prepare("INSERT INTO ".$db_table_prefix."pages (\r
1018                 page\r
1019                 )\r
1020                 VALUES (\r
1021                 ?\r
1022                 )");\r
1023         foreach($pages as $page){\r
1024                 $stmt->bind_param("s", $page);\r
1025                 $stmt->execute();\r
1026         }\r
1027         $stmt->close();\r
1028 }\r
1029 \r
1030 //Delete a page from the DB\r
1031 function deletePages($pages) {\r
1032         global $mysqli,$db_table_prefix; \r
1033         $stmt = $mysqli->prepare("DELETE FROM ".$db_table_prefix."pages \r
1034                 WHERE id = ?");\r
1035         $stmt2 = $mysqli->prepare("DELETE FROM ".$db_table_prefix."permission_page_matches \r
1036                 WHERE page_id = ?");\r
1037         foreach($pages as $id){\r
1038                 $stmt->bind_param("i", $id);\r
1039                 $stmt->execute();\r
1040                 $stmt2->bind_param("i", $id);\r
1041                 $stmt2->execute();\r
1042         }\r
1043         $stmt->close();\r
1044         $stmt2->close();\r
1045 }\r
1046 \r
1047 //Fetch information on all pages\r
1048 function fetchAllPages()\r
1049 {\r
1050         global $mysqli,$db_table_prefix; \r
1051         $stmt = $mysqli->prepare("SELECT \r
1052                 id,\r
1053                 page,\r
1054                 private\r
1055                 FROM ".$db_table_prefix."pages");\r
1056         $stmt->execute();\r
1057         $stmt->bind_result($id, $page, $private);\r
1058         while ($stmt->fetch()){\r
1059                 $row[$page] = array('id' => $id, 'page' => $page, 'private' => $private);\r
1060         }\r
1061         $stmt->close();\r
1062         if (isset($row)){\r
1063                 return ($row);\r
1064         }\r
1065 }\r
1066 \r
1067 //Fetch information for a specific page\r
1068 function fetchPageDetails($id)\r
1069 {\r
1070         global $mysqli,$db_table_prefix; \r
1071         $stmt = $mysqli->prepare("SELECT \r
1072                 id,\r
1073                 page,\r
1074                 private\r
1075                 FROM ".$db_table_prefix."pages\r
1076                 WHERE\r
1077                 id = ?\r
1078                 LIMIT 1");\r
1079         $stmt->bind_param("i", $id);\r
1080         $stmt->execute();\r
1081         $stmt->bind_result($id, $page, $private);\r
1082         while ($stmt->fetch()){\r
1083                 $row = array('id' => $id, 'page' => $page, 'private' => $private);\r
1084         }\r
1085         $stmt->close();\r
1086         return ($row);\r
1087 }\r
1088 \r
1089 //Check if a page ID exists\r
1090 function pageIdExists($id)\r
1091 {\r
1092         global $mysqli,$db_table_prefix;\r
1093         $stmt = $mysqli->prepare("SELECT private\r
1094                 FROM ".$db_table_prefix."pages\r
1095                 WHERE\r
1096                 id = ?\r
1097                 LIMIT 1");\r
1098         $stmt->bind_param("i", $id);    \r
1099         $stmt->execute();\r
1100         $stmt->store_result();  \r
1101         $num_returns = $stmt->num_rows;\r
1102         $stmt->close();\r
1103         \r
1104         if ($num_returns > 0)\r
1105         {\r
1106                 return true;\r
1107         }\r
1108         else\r
1109         {\r
1110                 return false;   \r
1111         }\r
1112 }\r
1113 \r
1114 //Toggle private/public setting of a page\r
1115 function updatePrivate($id, $private)\r
1116 {\r
1117         global $mysqli,$db_table_prefix;\r
1118         $stmt = $mysqli->prepare("UPDATE ".$db_table_prefix."pages\r
1119                 SET \r
1120                 private = ?\r
1121                 WHERE\r
1122                 id = ?");\r
1123         $stmt->bind_param("ii", $private, $id);\r
1124         $result = $stmt->execute();\r
1125         $stmt->close(); \r
1126         return $result; \r
1127 }\r
1128 \r
1129 //Functions that interact mainly with .permission_page_matches table\r
1130 //------------------------------------------------------------------------------\r
1131 \r
1132 //Match permission level(s) with page(s)\r
1133 function addPage($page, $permission) {\r
1134         global $mysqli,$db_table_prefix; \r
1135         $i = 0;\r
1136         $stmt = $mysqli->prepare("INSERT INTO ".$db_table_prefix."permission_page_matches (\r
1137                 permission_id,\r
1138                 page_id\r
1139                 )\r
1140                 VALUES (\r
1141                 ?,\r
1142                 ?\r
1143                 )");\r
1144         if (is_array($permission)){\r
1145                 foreach($permission as $id){\r
1146                         $stmt->bind_param("ii", $id, $page);\r
1147                         $stmt->execute();\r
1148                         $i++;\r
1149                 }\r
1150         }\r
1151         elseif (is_array($page)){\r
1152                 foreach($page as $id){\r
1153                         $stmt->bind_param("ii", $permission, $id);\r
1154                         $stmt->execute();\r
1155                         $i++;\r
1156                 }\r
1157         }\r
1158         else {\r
1159                 $stmt->bind_param("ii", $permission, $page);\r
1160                 $stmt->execute();\r
1161                 $i++;\r
1162         }\r
1163         $stmt->close();\r
1164         return $i;\r
1165 }\r
1166 \r
1167 //Retrieve list of permission levels that can access a page\r
1168 function fetchPagePermissions($page_id)\r
1169 {\r
1170         global $mysqli,$db_table_prefix; \r
1171         $stmt = $mysqli->prepare("SELECT\r
1172                 id,\r
1173                 permission_id\r
1174                 FROM ".$db_table_prefix."permission_page_matches\r
1175                 WHERE page_id = ?\r
1176                 ");\r
1177         $stmt->bind_param("i", $page_id);       \r
1178         $stmt->execute();\r
1179         $stmt->bind_result($id, $permission);\r
1180         while ($stmt->fetch()){\r
1181                 $row[$permission] = array('id' => $id, 'permission_id' => $permission);\r
1182         }\r
1183         $stmt->close();\r
1184         if (isset($row)){\r
1185                 return ($row);\r
1186         }\r
1187 }\r
1188 \r
1189 //Retrieve list of pages that a permission level can access\r
1190 function fetchPermissionPages($permission_id)\r
1191 {\r
1192         global $mysqli,$db_table_prefix; \r
1193         $stmt = $mysqli->prepare("SELECT\r
1194                 id,\r
1195                 page_id\r
1196                 FROM ".$db_table_prefix."permission_page_matches\r
1197                 WHERE permission_id = ?\r
1198                 ");\r
1199         $stmt->bind_param("i", $permission_id); \r
1200         $stmt->execute();\r
1201         $stmt->bind_result($id, $page);\r
1202         while ($stmt->fetch()){\r
1203                 $row[$page] = array('id' => $id, 'permission_id' => $page);\r
1204         }\r
1205         $stmt->close();\r
1206         if (isset($row)){\r
1207                 return ($row);\r
1208         }\r
1209 }\r
1210 \r
1211 //Unmatched permission and page\r
1212 function removePage($page, $permission) {\r
1213         global $mysqli,$db_table_prefix; \r
1214         $i = 0;\r
1215         $stmt = $mysqli->prepare("DELETE FROM ".$db_table_prefix."permission_page_matches \r
1216                 WHERE page_id = ?\r
1217                 AND permission_id =?");\r
1218         if (is_array($page)){\r
1219                 foreach($page as $id){\r
1220                         $stmt->bind_param("ii", $id, $permission);\r
1221                         $stmt->execute();\r
1222                         $i++;\r
1223                 }\r
1224         }\r
1225         elseif (is_array($permission)){\r
1226                 foreach($permission as $id){\r
1227                         $stmt->bind_param("ii", $page, $id);\r
1228                         $stmt->execute();\r
1229                         $i++;\r
1230                 }\r
1231         }\r
1232         else {\r
1233                 $stmt->bind_param("ii", $permission, $user);\r
1234                 $stmt->execute();\r
1235                 $i++;\r
1236         }\r
1237         $stmt->close();\r
1238         return $i;\r
1239 }\r
1240 \r
1241 //Check if a user has access to a page\r
1242 function securePage($uri){\r
1243         \r
1244         //Separate document name from uri\r
1245         $tokens = explode('/', $uri);\r
1246         $page = $tokens[sizeof($tokens)-1];\r
1247         global $mysqli,$db_table_prefix,$loggedInUser;\r
1248         //retrieve page details\r
1249         $stmt = $mysqli->prepare("SELECT \r
1250                 id,\r
1251                 page,\r
1252                 private\r
1253                 FROM ".$db_table_prefix."pages\r
1254                 WHERE\r
1255                 page = ?\r
1256                 LIMIT 1");\r
1257         $stmt->bind_param("s", $page);\r
1258         $stmt->execute();\r
1259         $stmt->bind_result($id, $page, $private);\r
1260         while ($stmt->fetch()){\r
1261                 $pageDetails = array('id' => $id, 'page' => $page, 'private' => $private);\r
1262         }\r
1263         $stmt->close();\r
1264         //If page does not exist in DB, allow access\r
1265         if (empty($pageDetails)){\r
1266                 return true;\r
1267         }\r
1268         //If page is public, allow access\r
1269         elseif ($pageDetails['private'] == 0) {\r
1270                 return true;    \r
1271         }\r
1272         //If user is not logged in, deny access\r
1273         elseif(!isUserLoggedIn()) \r
1274         {\r
1275                 header("Location: login.php");\r
1276                 return false;\r
1277         }\r
1278         else {\r
1279                 //Retrieve list of permission levels with access to page\r
1280                 $stmt = $mysqli->prepare("SELECT\r
1281                         permission_id\r
1282                         FROM ".$db_table_prefix."permission_page_matches\r
1283                         WHERE page_id = ?\r
1284                         ");\r
1285                 $stmt->bind_param("i", $pageDetails['id']);     \r
1286                 $stmt->execute();\r
1287                 $stmt->bind_result($permission);\r
1288                 while ($stmt->fetch()){\r
1289                         $pagePermissions[] = $permission;\r
1290                 }\r
1291                 $stmt->close();\r
1292                 //Check if user's permission levels allow access to page\r
1293                 if ($loggedInUser->checkPermission($pagePermissions)){ \r
1294                         return true;\r
1295                 }\r
1296                 //Grant access if master user\r
1297                 elseif ($loggedInUser->user_id == $master_account){\r
1298                         return true;\r
1299                 }\r
1300                 else {\r
1301                         header("Location: index.php");\r
1302                         return false;   \r
1303                 }\r
1304         }\r
1305 }\r
1306 \r
1307 ?>\r

UCC git Repository :: git.ucc.asn.au