$action_def){ $action = new ACLAction(); $query = "SELECT * FROM " . $action->table_name . " WHERE name='$action_name' AND category = '$category' AND acltype='$type' AND deleted=0 "; $result = $db->query($query); //only add if an action with that name and category don't exist $row=$db->fetchByAssoc($result); if ($row == null) { $action->name = $action_name; $action->category = $category; $action->aclaccess = $action_def['default']; $action->acltype = $type; $action->modified_user_id = 1; $action->created_by = 1; $action->save(); } } }else{ sugar_die("FAILED TO ADD: $category - TYPE $type NOT DEFINED IN modules/ACLActions/actiondefs.php"); } } /** * static removeActions($category, $type='module') * Removes all default actions for a category/type * * @param STRING $category - the category (e.g module name - Accounts, Contacts) * @param STRING $type - the type (e.g. 'module', 'field') */ function removeActions($category, $type='module'){ global $ACLActions; $db = DBManagerFactory::getInstance(); if(isset($ACLActions[$type])){ foreach($ACLActions[$type]['actions'] as $action_name =>$action_def){ $action = new ACLAction(); $query = "SELECT * FROM " . $action->table_name . " WHERE name='$action_name' AND category = '$category' AND acltype='$type' and deleted=0"; $result = $db->query($query); //only add if an action with that name and category don't exist $row=$db->fetchByAssoc($result); if ($row != null) { $action->mark_deleted($row['id']); } } }else{ sugar_die("FAILED TO REMOVE: $category : $name - TYPE $type NOT DEFINED IN modules/ACLActions/actiondefs.php"); } } /** * static AccessColor($access) * * returns the color associated with an access level * these colors exist in the definitions in modules/ACLActions/actiondefs.php * @param INT $access - the access level you want the color for * @return the color either name or hex representation or false if the level does not exist */ function AccessColor($access){ global $ACLActionAccessLevels; if(isset($ACLActionAccessLevels[$access])){ return $ACLActionAccessLevels[$access]['color']; } return false; } /** * static AccessName($access) * * returns the translated name associated with an access level * these label definitions exist in the definitions in modules/ACLActions/actiondefs.php * @param INT $access - the access level you want the color for * @return the translated access level name or false if the level does not exist */ function AccessName($access){ global $ACLActionAccessLevels; if(isset($ACLActionAccessLevels[$access])){ return translate($ACLActionAccessLevels[$access]['label'], 'ACLActions'); } return false; } /** * static AccessLabel($access) * * returns the label associated with an access level * these label definitions exist in the definitions in modules/ACLActions/actiondefs.php * @param INT $access - the access level you want the color for * @return the access level label or false if the level does not exist */ function AccessLabel($access){ global $ACLActionAccessLevels; if(isset($ACLActionAccessLevels[$access])){ $label=preg_replace('/(LBL_ACCESS_)(.*)/', '$2', $ACLActionAccessLevels[$access]['label']); return strtolower($label); } return false; } /** * static getAccessOptions() * this is used for building select boxes * @return array containg access levels (ints) as keys and access names as values */ function getAccessOptions( $action, $type='module'){ global $ACLActions; $options = array(); if(empty($ACLActions[$type]['actions'][$action]['aclaccess']))return $options; foreach($ACLActions[$type]['actions'][$action]['aclaccess'] as $action){ $options[$action] = ACLAction::AccessName($action); } return $options; } /** * function static getDefaultActions() * This function will return a list of acl actions with their default access levels * * */ function getDefaultActions($type='module', $action=''){ $query = "SELECT * FROM acl_actions WHERE deleted=0 "; if(!empty($type)){ $query .= " AND acltype='$type'"; } if(!empty($action)){ $query .= "AND name='$action'"; } $query .= " ORDER BY category"; $db = DBManagerFactory::getInstance(); $result = $db->query($query); $default_actions = array(); while($row = $db->fetchByAssoc($result) ){ $acl = new ACLAction(); $acl->populateFromRow($row); $default_actions[] = $acl; } return $default_actions; } /** * static getUserActions($user_id,$refresh=false, $category='', $action='') * returns a list of user actions * @param GUID $user_id * @param BOOLEAN $refresh * @param STRING $category * @param STRING $action * @return ARRAY of ACLActionsArray */ function getUserActions($user_id,$refresh=false, $category='',$type='', $action=''){ //check in the session if we already have it loaded if(!$refresh && !empty($_SESSION['ACL'][$user_id])){ if(empty($category) && empty($action)){ return $_SESSION['ACL'][$user_id]; }else{ if(!empty($category) && isset($_SESSION['ACL'][$user_id][$category])){ if(empty($action)){ if(empty($type)){ return $_SESSION['ACL'][$user_id][$category]; } return $_SESSION['ACL'][$user_id][$category][$type]; }else if(!empty($type) && isset($_SESSION['ACL'][$user_id][$category][$type][$action])){ return $_SESSION['ACL'][$user_id][$category][$type][$action]; } } } } //if we don't have it loaded then lets check against the db $additional_where = ''; $db = DBManagerFactory::getInstance(); if(!empty($category)){ $additional_where .= " AND acl_actions.category = '$category' "; } if(!empty($action)){ $additional_where .= " AND acl_actions.name = '$action' "; } if(!empty($type)){ $additional_where .= " AND acl_actions.acltype = '$type' "; } $query = "SELECT acl_actions .*, acl_roles_actions.access_override FROM acl_actions LEFT JOIN acl_roles_users ON acl_roles_users.user_id = '$user_id' AND acl_roles_users.deleted = 0 LEFT JOIN acl_roles_actions ON acl_roles_actions.role_id = acl_roles_users.role_id AND acl_roles_actions.action_id = acl_actions.id AND acl_roles_actions.deleted=0 WHERE acl_actions.deleted=0 $additional_where ORDER BY category,name"; $result = $db->query($query); $selected_actions = array(); while($row = $db->fetchByAssoc($result) ){ $acl = new ACLAction(); $isOverride = false; $acl->populateFromRow($row); if(!empty($row['access_override'])){ $acl->aclaccess = $row['access_override']; $isOverride = true; } if(!isset($selected_actions[$acl->category])){ $selected_actions[$acl->category] = array(); } if(!isset($selected_actions[$acl->category][$acl->acltype][$acl->name]) || ($selected_actions[$acl->category][$acl->acltype][$acl->name]['aclaccess'] > $acl->aclaccess && $isOverride ) || (!empty($selected_actions[$acl->category][$acl->acltype][$acl->name]['isDefault']) && $isOverride ) ) { $selected_actions[$acl->category][$acl->acltype][$acl->name] = $acl->toArray(); $selected_actions[$acl->category][$acl->acltype][$acl->name]['isDefault'] = !$isOverride; } } //only set the session variable if it was a full list; if(empty($category) && empty($action)){ if(!isset($_SESSION['ACL'])){ $_SESSION['ACL'] = array(); } $_SESSION['ACL'][$user_id] = $selected_actions; }else{ if(empty($action) && !empty($category)){ if(!empty($type)){ $_SESSION['ACL'][$user_id][$category][$type] = $selected_actions[$category][$type];} $_SESSION['ACL'][$user_id][$category] = $selected_actions[$category]; }else{ if(!empty($action) && !empty($category) && !empty($type)){ $_SESSION['ACL'][$user_id][$category][$type][$action] = $selected_actions[$category][$action]; } } } return $selected_actions; } /** * (static/ non-static)function hasAccess($is_owner= false , $access = 0) * checks if a user has access to this acl if the user is an owner it will check if owners have access * * This function may either be used statically or not. If used staticlly a user must pass in an access level not equal to zero * @param boolean $is_owner * @param int $access * @return true or false */ function hasAccess($is_owner=false, $access = 0){ if($access != 0 && $access == ACL_ALLOW_ALL || ($is_owner && $access == ACL_ALLOW_OWNER))return true; if(isset($this) && isset($this->aclaccess)){ if($this->aclaccess == ACL_ALLOW_ALL || ($is_owner && $this->aclaccess == ACL_ALLOW_OWNER)) return true; } return false; } /** * static function userHasAccess($user_id, $category, $action, $is_owner = false) * * @param GUID $user_id the user id who you want to check access for * @param STRING $category the category you would like to check access for * @param STRING $action the action of that category you would like to check access for * @param BOOLEAN OPTIONAL $is_owner if the object is owned by the user you are checking access for */ function userHasAccess($user_id, $category, $action,$type='module', $is_owner = false){ global $current_user; if($current_user->isAdminForModule($category)&& !isset($_SESSION['ACL'][$user_id][$category][$type][$action]['aclaccess'])){ return true; } //check if we don't have it set in the cache if not lets reload the cache if(ACLAction::getUserAccessLevel($user_id, $category, 'access', $type) < ACL_ALLOW_ENABLED) return false; if(empty($_SESSION['ACL'][$user_id][$category][$type][$action])){ ACLAction::getUserActions($user_id, false); } if(!empty($_SESSION['ACL'][$user_id][$category][$type][$action])){ return ACLAction::hasAccess($is_owner, $_SESSION['ACL'][$user_id][$category][$type][$action]['aclaccess']); } return false; } /** * function getUserAccessLevel($user_id, $category, $action,$type='module') * returns the access level for a given category and action * * @param GUID $user_id * @param STRING $category * @param STRING $action * @param STRING $type * @return INT (ACCESS LEVEL) */ function getUserAccessLevel($user_id, $category, $action,$type='module'){ if(empty($_SESSION['ACL'][$user_id][$category][$type][$action])){ ACLAction::getUserActions($user_id, false); } if(!empty($_SESSION['ACL'][$user_id][$category][$type][$action])){ return $_SESSION['ACL'][$user_id][$category][$type][$action]['aclaccess']; } } /** * STATIC function userNeedsOwnership($user_id, $category, $action,$type='module') * checks if a user should have ownership to do an action * * @param GUID $user_id * @param STRING $category * @param STRING $action * @param STRING $type * @return boolean */ function userNeedsOwnership($user_id, $category, $action,$type='module'){ //check if we don't have it set in the cache if not lets reload the cache if(empty($_SESSION['ACL'][$user_id][$category][$type][$action])){ ACLAction::getUserActions($user_id, false); } if(!empty($_SESSION['ACL'][$user_id][$category][$type][$action])){ return $_SESSION['ACL'][$user_id][$category][$type][$action]['aclaccess'] == ACL_ALLOW_OWNER; } return false; } /** * * static pass by ref setupCategoriesMatrix(&$categories) * takes in an array of categories and modifes them adding display information * * @param unknown_type $categories */ function setupCategoriesMatrix(&$categories){ global $ACLActions, $current_user; $names = array(); $disabled = array(); foreach($categories as $cat_name=>$category){ foreach($category as $type_name=>$type){ foreach($type as $act_name=>$action){ $names[$act_name] = translate($ACLActions[$type_name]['actions'][$act_name]['label'], 'ACLActions'); $categories[$cat_name][$type_name][$act_name]['accessColor'] = ACLAction::AccessColor($action['aclaccess']); if($type_name== 'module'){ if($act_name != 'aclaccess' && $categories[$cat_name]['module']['access']['aclaccess'] == ACL_ALLOW_DISABLED){ $categories[$cat_name][$type_name][$act_name]['accessColor'] = 'darkgray'; $disabled[] = $cat_name; } } $categories[$cat_name][$type_name][$act_name]['accessName'] = ACLAction::AccessName($action['aclaccess']); $categories[$cat_name][$type_name][$act_name]['accessLabel'] = ACLAction::AccessLabel($action['aclaccess']); if($cat_name=='Users'&& $act_name=='admin'){ $categories[$cat_name][$type_name][$act_name]['accessOptions'][ACL_ALLOW_DEFAULT]=ACLAction::AccessName(ACL_ALLOW_DEFAULT);; $categories[$cat_name][$type_name][$act_name]['accessOptions'][ACL_ALLOW_DEV]=ACLAction::AccessName(ACL_ALLOW_DEV);; } else{ $categories[$cat_name][$type_name][$act_name]['accessOptions'] = ACLAction::getAccessOptions($act_name, $type_name); } } } } if(!is_admin($current_user)){ foreach($disabled as $cat_name){ unset($categories[$cat_name]); } } return $names; } /** * function toArray() * returns this acl as an array * * @return array of fields with id, name, access and category */ function toArray(){ $array_fields = array('id', 'aclaccess'); $arr = array(); foreach($array_fields as $field){ $arr[$field] = $this->$field; } return $arr; } /** * function fromArray($arr) * converts an array into an acl mapping name value pairs into files * * @param Array $arr */ function fromArray($arr){ foreach($arr as $name=>$value){ $this->$name = $value; } } /** * function clearSessionCache() * clears the session variable storing the cache information for acls * */ function clearSessionCache(){ unset($_SESSION['ACL']); } } ?>