'NO-ACL' is more clear that we don't have an ACL for the given admin than three aster...
[mailer.git] / inc / libs / admins_functions.php
index 18d2d5c7155f108763a66f09376db8ff9426ffc2..c1987fb465b8c4cfd7b5841f26f25a63ab040f4f 100644 (file)
@@ -41,17 +41,21 @@ if (!defined('__SECURITY')) {
 }
 
 // Check ACL for menu combination
-function adminsCheckAdminAcl ($action, $what) {
-       // If action is login or logout allow allways!
-       $default = 'allow';
-       if (($action == 'login') || ($action == 'logout')) return true;
-
-       // Default is deny
-       $ret = false;
-
+function isAdminsAllowedByAcl ($action, $what) {
        // Get admin's id
        $adminId = getCurrentAdminId();
 
+       if (($action == 'login') || ($action == 'logout')) {
+               // If action is login or logout allow allways!
+               return true;
+       } elseif (isset($GLOBALS[__FUNCTION__][$adminId][$action][$what])) {
+               // If we have cache, use it
+               return $GLOBALS[__FUNCTION__][$adminId][$action][$what];
+       }
+
+       // But default result is failed
+       $GLOBALS[__FUNCTION__][$action][$what] = false;
+
        // Get admin's defult access right
        $default = getAdminDefaultAcl($adminId);
 
@@ -61,31 +65,43 @@ function adminsCheckAdminAcl ($action, $what) {
                $parent_action = getActionFromModuleWhat('admin', $what);
 
                // Check with this function...
-               $parent = adminsCheckAdminAcl($parent_action, '');
+               $parent = isAdminsAllowedByAcl($parent_action, '');
        } else {
                // Anything else is true!
                $parent = false;
        }
 
        // Shall I test for a main or sub menu? (action or what?)
-       $acl_mode = 'failed';
+       $aclMode = 'failed';
        if ((isExtensionInstalledAndNewer('cache', '0.1.2')) && (isset($GLOBALS['cache_array']['admin_acls'])) && (count($GLOBALS['cache_array']['admin_acls']) > 0)) {
                // Lookup in cache
-               if ((!empty($action)) && (isset($GLOBALS['cache_array']['admin_acls']['action_menu'][$adminId])) & ($GLOBALS['cache_array']['admin_acls']['action_menu'][$adminId] == $action)) {
+               if ((!empty($action)) && (isset($GLOBALS['cache_array']['admin_acls']['action_menu'][$adminId])) & (in_array($action, $GLOBALS['cache_array']['admin_acls']['action_menu'][$adminId]))) {
+                       // Search for it
+                       $key = array_search($action, $GLOBALS['cache_array']['admin_acls']['action_menu'][$adminId]);
+
                        // Main menu line found
-                       $acl_mode = $GLOBALS['cache_array']['admin_acls']['access_mode'][$adminId];
+                       $aclMode = $GLOBALS['cache_array']['admin_acls']['access_mode'][$adminId][$key];
+
+                       // Log debug message
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'action=' . $action . ',key=' . $key . ',acl_mode=' . $aclMode);
 
                        // Count cache hits
                        incrementStatsEntry('cache_hits');
-               } elseif ((!empty($what)) && (isset($GLOBALS['cache_array']['admin_acls']['what_menu'][$adminId])) && ($GLOBALS['cache_array']['admin_acls']['what_menu'][$adminId] == $what)) {
+               } elseif ((!empty($what)) && (isset($GLOBALS['cache_array']['admin_acls']['what_menu'][$adminId])) && (in_array($what, $GLOBALS['cache_array']['admin_acls']['what_menu'][$adminId]))) {
+                       // Search for it
+                       $key = array_search($action, $GLOBALS['cache_array']['admin_acls']['what_menu'][$adminId]);
+
                        // Check sub menu
-                       $acl_mode = $GLOBALS['cache_array']['admin_acls']['access_mode'][$adminId];
+                       $aclMode = $GLOBALS['cache_array']['admin_acls']['access_mode'][$adminId][$key];
+
+                       // Log debug message
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'what=' . $what . ',key=' . $key . ',acl_mode=' . $aclMode);
 
                        // Count cache hits
                        incrementStatsEntry('cache_hits');
                }
        } elseif (!isExtensionActive('cache')) {
-               // Old version, so load it from database
+               // Extension ext-cache is absent, so load it from database
                $result = false;
                if (!empty($action)) {
                        // Main menu
@@ -100,7 +116,7 @@ function adminsCheckAdminAcl ($action, $what) {
                // Is an entry found?
                if (SQL_NUMROWS($result) == 1) {
                        // Load ACL
-                       list($acl_mode) = SQL_FETCHROW($result);
+                       list($aclMode) = SQL_FETCHROW($result);
                } // END - if
 
                // Free memory
@@ -108,15 +124,15 @@ function adminsCheckAdminAcl ($action, $what) {
        }
 
        // Check ACL and (maybe) allow
-       //* DEBUG: */ debugOutput('default='.$default.',acl_mode='.$acl_mode.',parent='.intval($parent));
-       if (($default == 'allow') || (($default == 'deny') && ($acl_mode == 'allow')) || ($parent === true) || (($default == '***') && ($acl_mode == 'failed') && ($parent === false))) {
+       //* DEBUG: */ debugOutput('default='.$default.',acl_mode='.$aclMode.',parent='.intval($parent));
+       if ((($default == 'allow') && ($aclMode != 'deny')) || (($default == 'deny') && ($aclMode == 'allow')) || ($parent === true) || (($default == 'NO-ACL') && ($aclMode == 'failed') && ($parent === false))) {
                // Access is granted
-               $ret = true;
+               $GLOBALS[__FUNCTION__][$adminId][$action][$what] = true;
        } // END - if
 
        // Return value
-       //* DEBUG: */ debugOutput(__FUNCTION__.'['.__LINE__.']:act='.$action.',wht='.$what.',default='.$default.',acl_mode='.$acl_mode);
-       return $ret;
+       //* DEBUG: */ debugOutput(__FUNCTION__.'['.__LINE__.']:act='.$action.',wht='.$what.',default='.$default.',aclMode='.$aclMode);
+       return $GLOBALS[__FUNCTION__][$adminId][$action][$what];
 }
 
 // Create email link to admins's account
@@ -313,12 +329,12 @@ function adminsEditAdminAccount ($postData) {
                        // Shall we allow changing default ACL?
                        if ($currMode == 'allow') {
                                // Allow chaning it
-                               $content['mode']    = generateOptionList('/ARRAY/', array('allow', 'deny'), array('{--ADMIN_ADMINS_MODE_ALLOW--}', '{--ADMIN_ADMINS_MODE_DENY--}'), $content['mode']);
+                               $content['mode']    = generateOptionList('/ARRAY/', array('allow', 'deny'), array('{--ADMIN_ADMINS_ACCESS_MODE_ALLOW--}', '{--ADMIN_ADMINS_ACCESS_MODE_DENY--}'), $content['mode']);
                        } else {
                                // Don't allow it
                                $content['mode'] = ' ';
                        }
-                       $content['la_mode'] = generateOptionList('/ARRAY/', array('global', 'OLD', 'NEW'), array('{--ADMIN_ADMINS_LA_MODE_GLOBAL--}', '{--ADMIN_ADMINS_LA_MODE_OLD--}', '{--ADMINS_NEW_LA_SETTING--}'), $content['la_mode']);
+                       $content['la_mode'] = generateOptionList('/ARRAY/', array('global', 'OLD', 'NEW'), array('{--ADMIN_ADMINS_LA_MODE_GLOBAL--}', '{--ADMIN_ADMINS_LA_MODE_OLD--}', '{--ADMIN_ADMINS_LA_MODE_NEW--}'), $content['la_mode']);
 
                        // Load row template and switch color
                        $OUT .= loadTemplate('admin_edit_admins_row', true, $content);
@@ -347,7 +363,7 @@ function adminsDeleteAdminAccount ($postData) {
                        if (SQL_NUMROWS($result) == 1) {
                                // Entry found, so load data
                                $content = SQL_FETCHARRAY($result);
-                               $content['mode']    = '{--ADMIN_ADMINS_MODE_' . strtoupper($content['mode'])    . '--}';
+                               $content['mode']    = '{--ADMIN_ADMINS_ACCESS_MODE_' . strtoupper($content['mode'])    . '--}';
                                $content['la_mode'] = '{--ADMIN_ADMINS_LA_MODE_' . strtoupper($content['la_mode']) . '--}';
 
                                // Prepare some more data
@@ -400,8 +416,8 @@ function adminsListAdminAccounts() {
        $OUT = '';
        while ($content = SQL_FETCHARRAY($result)) {
                // Compile some variables
-               $content['mode']    = '{--ADMINS_' . strtoupper($content['mode'])    . '_MODE--}';
-               $content['la_mode'] = '{--ADMINS_' . strtoupper($content['la_mode']) . '_LA_SETTING--}';
+               $content['mode']    = '{--ADMIN_ADMINS_ACCESS_MODE_' . strtoupper($content['mode'])    . '--}';
+               $content['la_mode'] = '{--ADMIN_ADMINS_LA_MODE_' . strtoupper($content['la_mode']) . '--}';
 
                // Load row template and switch color
                $OUT .= loadTemplate('admin_list_admins_row', true, $content);
@@ -560,7 +576,7 @@ function getAdminLoginFailures ($adminId) {
        } // END - if
 
        // By default no admin is found
-       $data['login_failures'] = '-1';
+       $data['login_failures'] = -1;
 
        // Check cache
        if (isset($GLOBALS['cache_array']['admin']['login_failures'][$adminId])) {
@@ -596,7 +612,7 @@ function getAdminLastFailure ($adminId) {
        } // END - if
 
        // By default no admin is found
-       $data['last_failure'] = '-1';
+       $data['last_failure'] = -1;
 
        // Check cache
        if (isset($GLOBALS['cache_array']['admin']['last_failure'][$adminId])) {