'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 fad8a524ed21294c0d946ca23fa6c454bbb7c1a5..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
@@ -249,7 +265,7 @@ LIMIT 1",
                                $message = '{--ADMIN_ACCOUNT_SAVED--}';
                        } else {
                                // Passwords did not match
-                               $message = '{--ADMINS_ERROR_PASS_MISMATCH--}';
+                               $message = '{--ADMIN_ADMINS_ERROR_PASS_MISMATCH--}';
                        }
                } else {
                        // Update whole array
@@ -281,7 +297,7 @@ LIMIT 1",
 
        // Display message
        if (!empty($message)) {
-               loadTemplate('admin_settings_saved', false, $message);
+               displayMessage($message);
        } // END - if
 
        // Remove cache file
@@ -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('{--ADMINS_ALLOW_MODE--}', '{--ADMINS_DENY_MODE--}'), $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('{--ADMINS_GLOBAL_LA_SETTING--}', '{--ADMINS_OLD_LA_SETTING--}', '{--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,8 +363,8 @@ function adminsDeleteAdminAccount ($postData) {
                        if (SQL_NUMROWS($result) == 1) {
                                // Entry found, so load data
                                $content = SQL_FETCHARRAY($result);
-                               $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']) . '--}';
 
                                // Prepare some more data
                                $content['id'] = $id;
@@ -365,7 +381,7 @@ function adminsDeleteAdminAccount ($postData) {
                loadTemplate('admin_delete_admins', false, $OUT);
        } else {
                // Cannot delete last account!
-               loadTemplate('admin_settings_saved', false, '{--ADMIN_ADMINS_CANNOT_DELETE_LAST--}');
+               displayMessage('{--ADMIN_ADMINS_CANNOT_DELETE_LAST--}');
        }
 }
 
@@ -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])) {
@@ -624,83 +640,6 @@ function getAdminLastFailure ($adminId) {
        return $data['last_failure'];
 }
 
-//-----------------------------------------------------------------------------
-//                                Filter Functions
-//-----------------------------------------------------------------------------
-
-// Filter for adding extra data to the query
-function FILTER_ADD_EXTRA_SQL_DATA ($add = '') {
-       // Is the admins extension updated? (should be!)
-       if (isExtensionInstalledAndNewer('admins', '0.3.0')) $add .= ', `default_acl` AS def_acl';
-       if (isExtensionInstalledAndNewer('admins', '0.6.7')) $add .= ', `la_mode`';
-       if (isExtensionInstalledAndNewer('admins', '0.7.2')) $add .= ', `login_failures`, UNIX_TIMESTAMP(`last_failure`) AS last_failure';
-       if (isExtensionInstalledAndNewer('admins', '0.7.3')) $add .= ', `expert_settings`, `expert_warning`';
-
-       // Return it
-       return $add;
-}
-
-// Reset the login failures
-function FILTER_RESET_ADMINS_LOGIN_FAILURES ($data) {
-       // Store it in session
-       setSession('mailer_admin_failures'    , getAdminLoginFailures($data['id']));
-       setSession('mailer_admin_last_failure', getAdminLastFailure($data['id']));
-
-       // Prepare update data
-       $postData['login'][getCurrentAdminId()]          = $data['login'];
-       $postData['login_failures'][getCurrentAdminId()] = '0';
-       $postData['last_failure'][getCurrentAdminId()]   = null;
-
-       // Change it in the admin
-       adminsChangeAdminAccount($postData);
-
-       // Always make sure the cache is destroyed
-       rebuildCache('admin');
-
-       // Return the data for further processing
-       return $data;
-}
-
-// Count the login failure
-function FILTER_COUNT_ADMINS_LOGIN_FAILURE ($data) {
-       // Prepare update data
-       $postData['login'][getCurrentAdminId()]          = $data['login'];
-       $postData['login_failures'][getCurrentAdminId()] = '`login_failures`+1';
-       $postData['last_failure'][getCurrentAdminId()]   = 'NOW()';
-
-       // Change it in the admin
-       adminsChangeAdminAccount($postData);
-
-       // Always make sure the cache is destroyed
-       rebuildCache('admin');
-
-       // Return the data for further processing
-       return $data;
-}
-
-// Rehashes the given plain admin password and stores it the database
-function FILTER_REHASH_ADMINS_PASSWORD ($data) {
-       // Generate new hash
-       $newHash = generateHash($data['plain_pass']);
-
-       // Prepare update data
-       $postData['login'][getCurrentAdminId()]    = $data['login'];
-       $postData['password'][getCurrentAdminId()] = $newHash;
-
-       // Change it in the admin
-       adminsChangeAdminAccount($postData);
-
-       // Update cookie/session and data array
-       setAdminMd5(encodeHashForCookie($newHash));
-       $data['pass_hash'] = $newHash;
-
-       // Always make sure the cache is destroyed
-       rebuildCache('admin');
-
-       // Return the data for further processing
-       return $data;
-}
-
 // ---------------------------------------------------------------------------
 //                             Wrapper functions
 // ---------------------------------------------------------------------------