cb.acl.php
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:10k
源码类别:

网络

开发平台:

Unix_Linux

  1. <?php
  2. /**
  3. * @version $Id: cb.acl.php 444 2008-02-07 02:25:39Z beat $
  4. * @package Community Builder
  5. * @subpackage cb.acl.php
  6. * @author Beat and mambojoe
  7. * @copyright (C) Beat, www.joomlapolis.com
  8. * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU/GPL version 2
  9. */
  10. // no direct access
  11. if ( ! ( defined( '_VALID_CB' ) || defined( '_JEXEC' ) || defined( '_VALID_MOS' ) ) ) { die( 'Direct Access to this location is not allowed.' ); }
  12. /**
  13.  * CB 1.x ACL functions:
  14.  */
  15. /**
  16.  * Checks if $oID userid is a moderator for CB
  17.  *
  18.  * @param int  $oID
  19.  * @return boolean   true is moderator, otherwise false
  20.  */
  21. function isModerator( $oID ) {
  22. global $ueConfig;
  23. static $uidArry = array(); // cache
  24. $oID = (int) $oID;
  25. if ( ! isset( $uidArry[$oID] ) ) {
  26. $uidArry[$oID] = ( $oID && in_array( userGID( $oID ), getParentGIDS( $ueConfig['imageApproverGid'] ) ) );
  27. }
  28. return $uidArry[$oID];
  29. }
  30. /**
  31.  * Gives ACL group id of userid $oID
  32.  *
  33.  * @param int $oID   user id
  34.  * @return int       ACL group id
  35.  */
  36. function userGID( $oID ){
  37.    global $_CB_database;
  38. static $uidArry = array(); // cache
  39. $oID = (int) $oID;
  40. if ( ! isset( $uidArry[$oID] ) ) {
  41.    if( $oID > 0 ) {
  42. $query = "SELECT gid FROM #__users WHERE id = ".(int) $oID;
  43. $_CB_database->setQuery( $query );
  44. $uidArry[$oID] = (int) $_CB_database->loadResult();
  45. } else {
  46. $uidArry[$oID] = 0;
  47. }
  48. }
  49. return $uidArry[$oID];
  50. }
  51. function allowAccess( $accessgroupid, $recurse, $usersgroupid) {
  52. if ($accessgroupid == -2 || ($accessgroupid == -1 && $usersgroupid > 0)) {
  53. //grant public access or access to all registered users
  54. return true;
  55. }
  56. else {
  57. //need to do more checking based on more restrictions
  58. if( $usersgroupid == $accessgroupid ) {
  59. //direct match
  60. return true;
  61. }
  62. else {
  63. if ($recurse=='RECURSE') {
  64. //check if there are children groups
  65. //$groupchildren=$_CB_framework->acl->get_group_children( $usersgroupid, 'ARO', $recurse );
  66. //print_r($groupchildren);
  67. $groupchildren=array();
  68. $groupchildren=getParentGIDS($accessgroupid);
  69. if ( is_array( $groupchildren ) && count( $groupchildren ) > 0) {
  70. if ( in_array($usersgroupid, $groupchildren) ) {
  71. //match
  72. return true;
  73. }
  74. }
  75. }
  76. }
  77. //deny access
  78. return false;
  79. }
  80. }
  81. function cbGetAllUsergroupsBelowMe( ) {
  82. global $_CB_framework;
  83. // ensure user can't add group higher than themselves
  84. if ( checkJversion() <= 0 ) {
  85. $my_groups  = $_CB_framework->acl->get_object_groups( 'users', $_CB_framework->myId(), 'ARO' );
  86. } else {
  87. $aro_id = $_CB_framework->acl->get_object_id( 'users', $_CB_framework->myId(), 'ARO' );
  88. $my_groups  = $_CB_framework->acl->get_object_groups( $aro_id, 'ARO' );
  89. }
  90. if (is_array( $my_groups ) && count( $my_groups ) > 0) {
  91. $ex_groups = $_CB_framework->acl->get_group_children( $my_groups[0], 'ARO', 'RECURSE' );
  92. if ( $ex_groups === null ) {
  93. $ex_groups = array(); // Mambo
  94. }
  95. } else {
  96. $ex_groups = array();
  97. }
  98. $gtree = $_CB_framework->acl->get_group_children_tree( null, 'USERS', false );
  99. // remove users 'above' me
  100. $i = 0;
  101. while ($i < count( $gtree )) {
  102. if (in_array( $gtree[$i]->value, $ex_groups )) {
  103. array_splice( $gtree, $i, 1 );
  104. } else {
  105. $i++;
  106. }
  107. }
  108. return $gtree;
  109. }
  110. function getChildGIDS( $gid ) {
  111. global $_CB_database;
  112. static $gidsArry = array(); // cache
  113. $gid = (int) $gid;
  114. if ( ! isset( $gidsArry[$gid] ) ) {
  115. if ( checkJversion() <= 0 ) {
  116.             $query = "SELECT g1.group_id, g1.name"
  117. ."n FROM #__core_acl_aro_groups g1"
  118. ."n LEFT JOIN #__core_acl_aro_groups g2 ON g2.lft >= g1.lft"
  119. ."n WHERE g2.group_id =" . (int) $gid
  120. ."n ORDER BY g1.name";
  121. } else {
  122.             $query = "SELECT g1.id AS group_id, g1.name"
  123. ."n FROM #__core_acl_aro_groups g1"
  124. ."n LEFT JOIN #__core_acl_aro_groups g2 ON g2.lft >= g1.lft"
  125. ."n WHERE g2.id =" . (int) $gid
  126. ."n ORDER BY g1.name";
  127. }
  128. $standardlist = array( -2 );
  129. if( $gid > 0) {
  130. $standardlist[] = -1;
  131. }
  132.         $_CB_database->setQuery( $query );
  133. $gidsArry[$gid] = $_CB_database->loadResultArray();
  134.        if ( ! is_array( $gidsArry[$gid] ) ) {
  135.         $gidsArry[$gid] = array();
  136.         }
  137. $gidsArry[$gid] = array_merge( $gidsArry[$gid], $standardlist );
  138. }
  139. return $gidsArry[$gid];
  140. }
  141. function getParentGIDS( $gid ) {
  142. global $_CB_database;
  143. static $gidsArry = array(); // cache
  144. $gid = (int) $gid;
  145. if ( ! isset( $gidsArry[$gid] ) ) {
  146. if ( checkJversion() <= 0 ) {
  147.            $query = "SELECT g1.group_id, g1.name"
  148. ."n FROM #__core_acl_aro_groups g1"
  149. ."n LEFT JOIN #__core_acl_aro_groups g2 ON g2.lft <= g1.lft"
  150. ."n WHERE g2.group_id =" . (int) $gid
  151. ."n ORDER BY g1.name";
  152. } else {
  153.            $query = "SELECT g1.id AS group_id, g1.name"
  154. ."n FROM #__core_acl_aro_groups g1"
  155. ."n LEFT JOIN #__core_acl_aro_groups g2 ON g2.lft <= g1.lft"
  156. ."n WHERE g2.id =" . (int) $gid
  157. ."n ORDER BY g1.name";
  158. }
  159.         $_CB_database->setQuery( $query );
  160. $gidsArry[$gid] = $_CB_database->loadResultArray();
  161.        if ( ! is_array( $gidsArry[$gid] ) ) {
  162.         $gidsArry[$gid] = array();
  163.         }
  164. }
  165. return $gidsArry[$gid];
  166. }
  167. /**
  168.  * Backend: Check if users are of lower permissions than current user (if not super-admin) and if the user himself is not included
  169.  *
  170.  * @param array of userId $cid
  171.  * @param string $actionName to insert in message.
  172.  * @return string of error if error, otherwise null
  173.  */
  174. function checkCBpermissions( $cid, $actionName, $allowActionToMyself = false ) {
  175. global $_CB_database, $_CB_framework;
  176. $msg = null;
  177. if (is_array( $cid ) && count( $cid ) ) {
  178. $obj = new moscomprofilerUser( $_CB_database );
  179. foreach ($cid as $id) {
  180. if ( $id != 0 ) {
  181. if ( $obj->load( (int) $id ) ) {
  182. if ( checkJversion() <= 0 ) {
  183. $groups  = $_CB_framework->acl->get_object_groups( 'users', $id, 'ARO' );
  184. } else {
  185. $aro_id = $_CB_framework->acl->get_object_id( 'users', $id, 'ARO' );
  186. $groups  = $_CB_framework->acl->get_object_groups( $aro_id, 'ARO' );
  187. }
  188. if ( isset( $groups[0] ) ) {
  189. $this_group = strtolower( $_CB_framework->acl->get_group_name( $groups[0], 'ARO' ) );
  190. } else {
  191. $this_group = 'Registered'; // minimal user group in case the ACL table entry is missing
  192. }
  193. } else {
  194. $msg .= "User not found. ";
  195. }
  196. } else {
  197. $this_group = 'Registered'; // minimal user group
  198. $obj->gid  = $_CB_framework->acl->get_group_id( $this_group, 'ARO' );
  199. }
  200. if ( ( ! $allowActionToMyself ) && ( $id == $_CB_framework->myId() ) ){
  201.   $msg .= "You cannot ".$actionName." Yourself! ";
  202.   } else {
  203.   $myGid = userGID( $_CB_framework->myId() );
  204.   if (($obj->gid == $myGid && !in_array($myGid, array(24, 25))) ||
  205.      ($id && $obj->gid && !in_array($obj->gid,getChildGIDS($myGid))))
  206.   {
  207. $msg .= "You cannot ".$actionName." a `".$this_group."`. Only higher-level users have this power. ";
  208.   }
  209. }
  210. }
  211. } else {
  212. $this_group  = 'Registered'; // minimal user group
  213. $gid  = $_CB_framework->acl->get_group_id( $this_group, 'ARO' );
  214. $myGid = userGID( $_CB_framework->myId() );
  215. if ( ( ( $gid == $myGid ) && ! in_array( $myGid, array( 24, 25 ) ) ) ||
  216.    ( $gid && ! in_array( $gid, getChildGIDS( $myGid ) ) ) )
  217. {
  218. $msg .= "You cannot ".$actionName." a `".$this_group."`. Only higher-level users have this power. ";
  219. }
  220. }
  221. return $msg;
  222. }
  223. /**
  224.  * Frontend: Check if task is enabled in front-end and if user is himself, or a moderator allowed to perform a task onto that other user in frontend
  225.  *
  226.  * @param  int    $uid              userid  !!! WARNING if is 0 it will assign $_CB_framework->myId() to it !!!
  227.  * @param  string $ueConfigVarName  $ueConfig variable name to be checked if == 0: mods disabled, == 1.: all CB mods, > 1: it's the GID (24 or 25 for now)
  228.  * @return string|null              null: allowed, string: not allowed, error string
  229.  */
  230. function cbCheckIfUserCanPerformUserTask( &$uid, $ueConfigVarName ) {
  231. global $_CB_framework, $ueConfig;
  232. if ( $uid == 0 ) {
  233. $uid = $_CB_framework->myId();
  234. }
  235. if ( $uid == 0 ) {
  236. $ret = false;
  237. } elseif ( $uid == $_CB_framework->myId() ) {
  238. // user can perform task on himself:
  239. $ret = null;
  240. } else {
  241. if ( ( ! isset( $ueConfig[$ueConfigVarName] ) ) || ( $ueConfig[$ueConfigVarName] == 0 ) ) {
  242. $ret = _UE_FUNCTIONALITY_DISABLED;
  243. } elseif ( $ueConfig[$ueConfigVarName] == 1 ) {
  244. // site moderators can act on non-pears and above:
  245. $isModerator = isModerator( $_CB_framework->myId() );
  246. if ( ! $isModerator ) {
  247. $ret = false;
  248. } else {
  249. $cbUserIsModerator = isModerator( $uid );
  250. if ( $cbUserIsModerator ) {
  251. // moderator acting on other moderator: only if level below him:
  252. $ret = checkCBpermissions( array($uid), "edit", true );
  253. } else {
  254. // moderator acts on normal user: ok
  255. $ret = null;
  256. }
  257. }
  258. } elseif ( $ueConfig[$ueConfigVarName] > 1 ) {
  259. if ( in_array( userGID( $_CB_framework->myId() ), getParentGIDS( $ueConfig[$ueConfigVarName] ) ) ) {
  260. $ret = null;
  261. } else {
  262. $ret = false;
  263. }
  264. } else {
  265. $ret = false; // Safeguard :)
  266. }
  267. }
  268. if ( $ret === false ) {
  269. $ret = _UE_NOT_AUTHORIZED;
  270. if ( $_CB_framework->myId() < 1 ) {
  271. $ret  .= '<br />' . _UE_DO_LOGIN;
  272. }
  273. }
  274. return $ret;
  275. }
  276. // ----- NO MORE CLASSES OR FUNCTIONS PASSED THIS POINT -----
  277. // Post class declaration initialisations
  278. // some version of PHP don't allow the instantiation of classes
  279. // before they are defined
  280. ?>