function ctools_access

Determine if the current user has access via a plugin.

Parameters

array $settings: An array of settings theoretically set by the user, including the array of plugins to check:

  • 'plugins': the array of plugin metadata info to check
  • 'logic': (optional) either 'and' or 'or', indicating how to combine restrictions. The 'or' case is not fully implemented and returns the input contexts unchanged.

array $contexts: An array of zero or more contexts that may be used to determine if the user has access.

Return value

bool TRUE if access is granted, FALSE if otherwise.

4 calls to ctools_access()
ctools_access_menu in ./ctools.module
Determine if the current user has access via a plugin.
ctools_context_handler_select in includes/context-task-handler.inc
Compare arguments to contexts for selection purposes.
ctools_ruleset_ctools_access_check in ctools_access_ruleset/plugins/access/ruleset.inc
Check for access.
page_manager_page_access_check in page_manager/plugins/tasks/page.inc
Callback to determine if a page is accessible.

File

includes/context.inc, line 1959

Code

function ctools_access($settings, $contexts = array()) {
    if (empty($settings['plugins'])) {
        return TRUE;
    }
    if (!isset($settings['logic'])) {
        $settings['logic'] = 'and';
    }
    if (!isset($contexts['logged-in-user'])) {
        $contexts['logged-in-user'] = ctools_access_get_loggedin_context();
    }
    foreach ($settings['plugins'] as $test) {
        $pass = FALSE;
        $plugin = ctools_get_access_plugin($test['name']);
        if ($plugin && ($function = ctools_plugin_get_function($plugin, 'callback'))) {
            // Do we need just some contexts or all of them?
            if (!empty($plugin['all contexts'])) {
                $test_contexts = $contexts;
            }
            else {
                $required_context = isset($plugin['required context']) ? $plugin['required context'] : array();
                $context = isset($test['context']) ? $test['context'] : array();
                $test_contexts = ctools_context_select($contexts, $required_context, $context);
            }
            $pass = $function($test['settings'], $test_contexts, $plugin);
            if (!empty($test['not'])) {
                $pass = !$pass;
            }
        }
        if ($pass && $settings['logic'] == 'or') {
            // Pass if 'or' and this rule passed.
            return TRUE;
        }
        elseif (!$pass && $settings['logic'] == 'and') {
            // Fail if 'and' and this rule failed.
            return FALSE;
        }
    }
    // Return TRUE if logic was and, meaning all rules passed.
    // Return FALSE if logic was or, meaning no rule passed.
    return $settings['logic'] === 'and';
}