home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 April / CMCD0404.ISO / Software / Freeware / Programare / dotproject / includes / permissions.php < prev    next >
PHP Script  |  2003-09-19  |  5KB  |  177 lines

  1. <?php /* INCLUDES $Id: permissions.php,v 1.29 2003/09/19 16:04:33 gregorerhardt Exp $ */
  2. /*
  3.  * This page handles permissions
  4.  * 
  5.  * Permissions Theory:
  6.  * 
  7.  * Permissions are propagated and overwritten from most general
  8.  * to most specific items.
  9.  * 3 type of permissions are stored in the DB:
  10.  * - read
  11.  * - edit
  12.  * - denied
  13.  *
  14.  * This way, if you grant edit permissions on a project and
  15.  * deny access to an item of this project, you will be able
  16.  * to access any item excluding the one you denied.
  17.  * 
  18.  * Special asumptions:
  19.  * - if permissions array is empty => a user has no permissions at all (inactive)
  20.  * - if permissions were granted on a module => the same goes for its items
  21.  *
  22.  * Propagations:
  23.  * - all modules => all modules
  24.  * - module m => items of m
  25.  * - project p => tasks, files, events of project p
  26.  */
  27.  
  28. // Permission flags used in the DB
  29.  
  30. define( 'PERM_DENY', '0' );
  31. define( 'PERM_EDIT', '-1' );
  32. define( 'PERM_READ', '1' );
  33.  
  34. define( 'PERM_ALL', '-1' );
  35.  
  36. // TODO: getDeny* should return true/false instead of 1/0
  37.  
  38. function getReadableModule() {
  39.     $sql = "SELECT mod_directory FROM modules WHERE mod_active > 0 ORDER BY mod_ui_order";
  40.     $modules = db_loadColumn( $sql );
  41.     foreach ($modules as $mod) {
  42.         if (!getDenyRead($mod)) {
  43.             return $mod;
  44.         }
  45.     }
  46.     return null;
  47. }
  48.  
  49. /**
  50.  * This function is used to check permissions.
  51.  */
  52. function checkFlag($flag, $perm_type, $old_flag) {
  53.     if($old_flag) {
  54.         return (
  55.                 ($flag == PERM_DENY) ||    // permission denied
  56.                 ($perm_type == PERM_EDIT && $flag == PERM_READ)    // we ask for editing, but are only allowed to read
  57.                 ) ? 0 : 1;
  58.     } else {
  59.         if($perm_type == PERM_READ) {
  60.             return ($flag != PERM_DENY)?1:0;
  61.         } else {
  62.             // => $perm_type == PERM_EDIT
  63.             return ($flag == $perm_type)?1:0;
  64.         }
  65.     }
  66. }
  67.  
  68. /**
  69.  * This function checks certain permissions for
  70.  * a given module and optionally an item_id.
  71.  * 
  72.  * $perm_type can be PERM_READ or PERM_EDIT
  73.  */
  74. function isAllowed($perm_type, $mod, $item_id = 0) {
  75.     GLOBAL $perms;   
  76.     
  77.     /*** Special hardcoded permissions ***/
  78.     
  79.     if ($mod == 'public') return 1;
  80.     
  81.     /*** Manually granted permissions ***/
  82.  
  83.     // TODO: Check this
  84.     // If $perms['all'] or $perms[$mod] is not empty we have full permissions???
  85.     // If we just set a deny on a item we get read/edit permissions on the full module.
  86.     $allowed = ! empty( $perms['all'] ) | ! empty( $perms[$mod] );
  87.     
  88.     // check permission on all modules
  89.     if ( isset($perms['all']) && $perms['all'][PERM_ALL] ) {
  90.         $allowed = checkFlag($perms['all'][PERM_ALL], $perm_type, $allowed);
  91.     }
  92.  
  93.     // check permision on this module
  94.     if ( isset($perms[$mod]) && isset($perms[$mod][PERM_ALL]) ) {
  95.         $allowed = checkFlag($perms[$mod][PERM_ALL], $perm_type, $allowed);
  96.     }
  97.     
  98.     // check permision for the item on this module
  99.     if ($item_id > 0) {
  100.         if ( isset($perms[$mod][$item_id]) ) {
  101.             $allowed = checkFlag($perms[$mod][$item_id], $perm_type, $allowed);
  102.         }
  103.     }
  104.         
  105.     /*** Permission propagations ***/
  106.  
  107.     // 1.if we have access on the project => we have access on its tasks.
  108.     // 2.We do not have to check access over projects if we have permissions on that item yet
  109.     //   else we could destroy given permissions through denied permissions for the project
  110.     if ( $mod == 'tasks' && !$allowed == 1) {
  111.         if ( $item_id > 0 ) {            
  112.             // get task's project id
  113.             $sql = "SELECT task_project FROM tasks WHERE task_id = $item_id";
  114.             $project_id = db_loadResult($sql);
  115.             
  116.             // check task's permission
  117.             $allowed = isAllowed( $perm_type, "projects", $project_id, $allowed );
  118.         }
  119.     }
  120.     
  121.     /*** TODO: Specificaly denied items ***/
  122.     // echo "$perm_type $mod $item_id $allowed<br>";
  123.     
  124.     return $allowed;
  125. }
  126.  
  127. function getDenyRead( $mod, $item_id = 0 ) {
  128.     return !isAllowed(PERM_READ, $mod, $item_id);
  129. }
  130.  
  131. function getDenyEdit( $mod, $item_id=0 ) {
  132.     return !isAllowed(PERM_EDIT, $mod, $item_id);
  133. }
  134.  
  135. /**
  136.  * Return a join statement and a where clause filtering
  137.  * all items which for which no explicit read permission is granted.
  138.  */
  139. function winnow( $mod, $key, &$where, $alias = 'perm' ) {
  140.     GLOBAL $AppUI, $perms;
  141.  
  142.     // TODO: Should we also check empty( $perms['all'] ?
  143.     if( ! empty( $perms[$mod] ) && ! $perms[$mod]['-1'] ) {
  144.         // We have permissions for specific items => filter items
  145.         $sql = "\n  LEFT JOIN permissions AS $alias ON $alias.permission_item = $key ";
  146.         if ($where) {
  147.             $where .= "\n  AND";
  148.         }
  149.         $where .= "\n    $alias.permission_grant_on = '$mod'"
  150.             . "\n    AND $alias.permission_value != " . PERM_DENY
  151.             . "\n    AND $alias.permission_user = $AppUI->user_id";
  152.         return $sql;
  153.     } else {
  154.         if (!$where) {
  155.             $where = '1=1';  // dummy for handling 'AND $where' situations
  156.         }
  157.         return ' ';
  158.     }        
  159. }
  160.  
  161. // pull permissions into master array
  162. $sql = "
  163. SELECT permission_grant_on g, permission_item i, permission_value v
  164. FROM permissions
  165. WHERE permission_user = $AppUI->user_id
  166. ";
  167.  
  168. $perms = array();
  169. $res = db_exec( $sql );
  170.  
  171. // build the master permissions array
  172. while ($row = db_fetch_assoc( $res )) {
  173.     $perms[$row['g']][$row['i']] = $row['v'];
  174. }
  175.  
  176. ?>
  177.