Oppaitime's version of Gazelle
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

permissions.class.php 3.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?
  2. class Permissions {
  3. /* Check to see if a user has the permission to perform an action
  4. * This is called by check_perms in util.php, for convenience.
  5. *
  6. * @param string PermissionName
  7. * @param string $MinClass Return false if the user's class level is below this.
  8. */
  9. public static function check_perms($PermissionName, $MinClass = 0) {
  10. if (G::$LoggedUser['EffectiveClass'] >= 1000) return true; // Sysops can do anything
  11. if (G::$LoggedUser['EffectiveClass'] < $MinClass) return false; // MinClass failure
  12. return G::$LoggedUser['Permissions'][$PermissionName] ?? false; // Return actual permission
  13. }
  14. /**
  15. * Gets the permissions associated with a certain permissionid
  16. *
  17. * @param int $PermissionID the kind of permissions to fetch
  18. * @return array permissions
  19. */
  20. public static function get_permissions($PermissionID) {
  21. $Permission = G::$Cache->get_value("perm_$PermissionID");
  22. if (empty($Permission)) {
  23. $QueryID = G::$DB->get_query_id();
  24. G::$DB->query("
  25. SELECT Level AS Class, `Values` AS Permissions, Secondary, PermittedForums
  26. FROM permissions
  27. WHERE ID = '$PermissionID'");
  28. $Permission = G::$DB->next_record(MYSQLI_ASSOC, ['Permissions']);
  29. G::$DB->set_query_id($QueryID);
  30. $Permission['Permissions'] = unserialize($Permission['Permissions']);
  31. G::$Cache->cache_value("perm_$PermissionID", $Permission, 2592000);
  32. }
  33. return $Permission;
  34. }
  35. /**
  36. * Get a user's permissions.
  37. *
  38. * @param $UserID
  39. * @param array|false $CustomPermissions
  40. * Pass in the user's custom permissions if you already have them.
  41. * Leave false if you don't have their permissions. The function will fetch them.
  42. * @return array Mapping of PermissionName=>bool/int
  43. */
  44. public static function get_permissions_for_user($UserID, $CustomPermissions = false) {
  45. $UserInfo = Users::user_info($UserID);
  46. // Fetch custom permissions if they weren't passed in.
  47. if ($CustomPermissions === false) {
  48. $QueryID = G::$DB->get_query_id();
  49. G::$DB->query('
  50. SELECT CustomPermissions
  51. FROM users_main
  52. WHERE ID = ' . (int)$UserID);
  53. list($CustomPermissions) = G::$DB->next_record(MYSQLI_NUM, false);
  54. G::$DB->set_query_id($QueryID);
  55. }
  56. if (!empty($CustomPermissions) && !is_array($CustomPermissions)) {
  57. $CustomPermissions = unserialize($CustomPermissions);
  58. }
  59. $Permissions = self::get_permissions($UserInfo['PermissionID']);
  60. // Manage 'special' inherited permissions
  61. $BonusPerms = [];
  62. $BonusCollages = 0;
  63. foreach ($UserInfo['ExtraClasses'] as $PermID => $Value) {
  64. $ClassPerms = self::get_permissions($PermID);
  65. $BonusCollages += $ClassPerms['Permissions']['MaxCollages'];
  66. unset($ClassPerms['Permissions']['MaxCollages']);
  67. $BonusPerms = array_merge($BonusPerms, $ClassPerms['Permissions']);
  68. }
  69. if (empty($CustomPermissions)) {
  70. $CustomPermissions = [];
  71. }
  72. $MaxCollages = ($Permissions['Permissions']['MaxCollages'] ?? 0) + $BonusCollages;
  73. if (isset($CustomPermissions['MaxCollages'])) {
  74. $MaxCollages += $CustomPermissions['MaxCollages'];
  75. unset($CustomPermissions['MaxCollages']);
  76. }
  77. $Permissions['Permissions']['MaxCollages'] = $MaxCollages;
  78. // Combine the permissions
  79. return array_merge(
  80. $Permissions['Permissions'],
  81. $BonusPerms,
  82. $CustomPermissions);
  83. }
  84. public static function is_mod($UserID) {
  85. return self::get_permissions_for_user($UserID)['users_mod'] ?? false;
  86. }
  87. }
  88. ?>