/**
 * Determines if $viewer has access to $user's friends list
 *
 * @param ElggUser $user   User whose friends are to be displayed
 * @param ElggUser $viewer Viewer
 * @return bool
 */
function user_friends_can_view_friends(ElggUser $user, ElggUser $viewer = null)
{
    if (!isset($viewer)) {
        $viewer = elgg_get_logged_in_user_entity();
    }
    $permission = false;
    if ($viewer && elgg_check_access_overrides($viewer->guid)) {
        $permission = true;
    }
    $setting = elgg_get_plugin_user_setting('friend_list_visibility', $user->guid, 'user_friends');
    if (!isset($setting)) {
        $setting = elgg_get_plugin_setting('friend_list_visibility', 'user_friends', ACCESS_PUBLIC);
    }
    switch ((int) $setting) {
        case ACCESS_PRIVATE:
            $permission = $viewer && $user->canEdit($viewer->guid);
            break;
        case ACCESS_FRIENDS:
            $permission = $viewer && $user->isFriendsWith($viewer->guid);
            break;
        case ACCESS_LOGGED_IN:
            $permission = $viewer;
            break;
        case ACCESS_PUBLIC:
            $permission = true;
            break;
    }
    $params = array('viewer' => $viewer, 'user' => $user);
    return elgg_trigger_plugin_hook('permissions_check:view_friends_list', 'user', $params, $permission);
}
Exemple #2
0
 public function __construct($index, $searchtype = SEARCH_DEFAULT)
 {
     $this->searchtype = $searchtype;
     $this->params['index'] = $index;
     $this->params['body'] = array();
     $site = elgg_get_site_entity();
     $this->params['body']['query']['bool']['must'][] = array('term' => array('site_guid' => $site->guid));
     $user = elgg_get_logged_in_user_guid();
     $ignore_access = elgg_check_access_overrides($user);
     if ($ignore_access != true && !elgg_is_admin_logged_in()) {
         $this->access_array = get_access_array();
         $this->params['body']['query']['bool']['must'][] = array('terms' => array('access_id' => $this->access_array));
     }
     //@todo: implement $sort and $order
     $this->params['body']['sort'] = array('time_updated' => 'desc');
     $this->params['body']['facets'] = array();
     $this->params['body']['facets']['type']['terms'] = array('field' => '_type');
     $this->params['body']['facets']['subtype']['terms'] = array('field' => 'subtype');
 }
/**
 * Determines whether or not the specified user can edit the specified piece of extender
 *
 * @param int    $extender_id The ID of the piece of extender
 * @param string $type        'metadata' or 'annotation'
 * @param int    $user_guid   The GUID of the user
 *
 * @return bool
 * @deprecated 1.9 Use the appropriate canEdit() method on metadata or annotations
 */
function can_edit_extender($extender_id, $type, $user_guid = 0)
{
    elgg_deprecated_notice(__FUNCTION__ . ' is deprecated. Use \\ElggExtender::canEdit()', 1.9);
    // Since Elgg 1.0, Elgg has returned false from can_edit_extender()
    // if no user was logged in. This breaks the access override so we add this
    // special check here.
    if (!elgg_check_access_overrides($user_guid)) {
        if (!elgg_is_logged_in()) {
            return false;
        }
    }
    $user_guid = (int) $user_guid;
    $user = get_user($user_guid);
    if (!$user) {
        $user = elgg_get_logged_in_user_entity();
        $user_guid = elgg_get_logged_in_user_guid();
    }
    $functionname = "elgg_get_{$type}_from_id";
    if (is_callable($functionname)) {
        $extender = call_user_func($functionname, $extender_id);
    } else {
        return false;
    }
    if (!$extender instanceof \ElggExtender) {
        return false;
    }
    /* @var \ElggExtender $extender */
    // If the owner is the specified user, great! They can edit.
    if ($extender->getOwnerGUID() == $user_guid) {
        return true;
    }
    // If the user can edit the entity this is attached to, great! They can edit.
    $entity = $extender->getEntity();
    if ($entity->canEdit($user_guid)) {
        return true;
    }
    // Trigger plugin hook - note that $user may be null
    $params = array('entity' => $entity, 'user' => $user);
    return elgg_trigger_plugin_hook('permissions_check', $type, $params, false);
}
Exemple #4
0
/**
 * Overrides the access system if appropriate.
 *
 * Allows admin users and calls after {@link elgg_set_ignore_access} to
 * bypass the access system.
 *
 * Registered for the 'permissions_check', 'all' and the 
 * 'container_permissions_check', 'all' plugin hooks.
 *
 * Returns true to override the access system or null if no change is needed.
 *
 * @return true|null
 * @access private
 */
function elgg_override_permissions($hook, $type, $value, $params)
{
    $user = elgg_extract('user', $params);
    if ($user) {
        $user_guid = $user->getGUID();
    } else {
        $user_guid = elgg_get_logged_in_user_guid();
    }
    // don't do this so ignore access still works with no one logged in
    //if (!$user instanceof ElggUser) {
    //	return false;
    //}
    // check for admin
    if ($user_guid && elgg_is_admin_user($user_guid)) {
        return true;
    }
    // check access overrides
    if (elgg_check_access_overrides($user_guid)) {
        return true;
    }
    // consult other hooks
    return NULL;
}
Exemple #5
0
/**
 * Determines whether or not the specified user can edit the specified piece of extender
 *
 * @param int    $extender_id The ID of the piece of extender
 * @param string $type        'metadata' or 'annotation'
 * @param int    $user_guid   The GUID of the user
 *
 * @return bool
 */
function can_edit_extender($extender_id, $type, $user_guid = 0)
{
    // @todo Since Elgg 1.0, Elgg has returned false from can_edit_extender()
    // if no user was logged in. This breaks the access override. This is a
    // temporary work around. This function needs to be rewritten in Elgg 1.9
    if (!elgg_check_access_overrides($user_guid)) {
        if (!elgg_is_logged_in()) {
            return false;
        }
    }
    $user_guid = (int) $user_guid;
    $user = get_user($user_guid);
    if (!$user) {
        $user = elgg_get_logged_in_user_entity();
        $user_guid = elgg_get_logged_in_user_guid();
    }
    $functionname = "elgg_get_{$type}_from_id";
    if (is_callable($functionname)) {
        $extender = call_user_func($functionname, $extender_id);
    } else {
        return false;
    }
    if (!$extender instanceof ElggExtender) {
        return false;
    }
    /* @var ElggExtender $extender */
    // If the owner is the specified user, great! They can edit.
    if ($extender->getOwnerGUID() == $user_guid) {
        return true;
    }
    // If the user can edit the entity this is attached to, great! They can edit.
    if (can_edit_entity($extender->entity_guid, $user_guid)) {
        return true;
    }
    // Trigger plugin hook - note that $user may be null
    $params = array('entity' => $extender->getEntity(), 'user' => $user);
    return elgg_trigger_plugin_hook('permissions_check', $type, $params, false);
}
Exemple #6
0
function get_access_array($user_id, $site_id, $flush)
{
    global $CONFIG, $init_finished;
    $cache = _elgg_get_access_cache();
    if ($flush) {
        $cache->clear();
    }
    if ($user_id == 0) {
        $user_id = elgg_get_logged_in_user_guid();
    }
    if ($site_id == 0 && isset($CONFIG->site_guid)) {
        $site_id = $CONFIG->site_guid;
    }
    $user_id = (int) $user_id;
    $site_id = (int) $site_id;
    $hash = $user_id . $site_id . 'get_access_array';
    if ($cache[$hash]) {
        $access_array = $cache[$hash];
    } else {
        $access_array = array(ACCESS_PUBLIC);
        // The following can only return sensible data if the user is logged in. - @Matt - nope!
        if ($user_id) {
            $access_array[] = ACCESS_LOGGED_IN;
            // Get ACL memberships
            $query = "SELECT am.access_collection_id" . " FROM {$CONFIG->dbprefix}access_collection_membership am" . " LEFT JOIN {$CONFIG->dbprefix}access_collections ag ON ag.id = am.access_collection_id" . " WHERE am.user_guid = {$user_id} AND (ag.site_guid = {$site_id} OR ag.site_guid = 0)";
            $collections = get_data($query);
            if ($collections) {
                foreach ($collections as $collection) {
                    if (!empty($collection->access_collection_id)) {
                        $access_array[] = (int) $collection->access_collection_id;
                    }
                }
            }
            // Get ACLs owned.
            $query = "SELECT ag.id FROM {$CONFIG->dbprefix}access_collections ag ";
            $query .= "WHERE ag.owner_guid = {$user_id} AND (ag.site_guid = {$site_id} OR ag.site_guid = 0)";
            $collections = get_data($query);
            if ($collections) {
                foreach ($collections as $collection) {
                    if (!empty($collection->id)) {
                        $access_array[] = (int) $collection->id;
                    }
                }
            }
            $ignore_access = elgg_check_access_overrides($user_id);
            if ($ignore_access == true) {
                $access_array[] = ACCESS_PRIVATE;
            }
        }
        if ($init_finished) {
            $cache[$hash] = $access_array;
        }
    }
    $options = array('user_id' => $user_id, 'site_id' => $site_id);
    return elgg_trigger_plugin_hook('access:collections:read', 'user', $options, $access_array);
}
 /**
  * Returns the SQL where clause for enforcing read access to data.
  *
  * Note that if this code is executed in privileged mode it will return (1=1).
  * 
  * Otherwise it returns a where clause to retrieve the data that a user has
  * permission to read.
  *
  * Plugin authors can hook into the 'get_sql', 'access' plugin hook to modify,
  * remove, or add to the where clauses. The plugin hook will pass an array with the current
  * ors and ands to the function in the form:
  *  array(
  *      'ors' => array(),
  *      'ands' => array()
  *  )
  *
  * The results will be combined into an SQL where clause in the form:
  *  ((or1 OR or2 OR orN) AND (and1 AND and2 AND andN))
  * 
  * @param array $options Array in format:
  *
  * 	table_alias => STR Optional table alias. This is based on the select and join clauses.
  *                     Default is 'e'. 
  *
  *  user_guid => INT Optional GUID for the user that we are retrieving data for.
  *                   Defaults to the logged in user.
  * 
  *  use_enabled_clause => BOOL Optional. Should we append the enabled clause? The default 
  *                             is set by access_show_hidden_entities().
  * 
  *  access_column => STR Optional access column name. Default is 'access_id'.
  * 
  *  owner_guid_column => STR Optional owner_guid column. Default is 'owner_guid'.
  * 
  *  guid_column => STR Optional guid_column. Default is 'guid'.
  * 
  * @return string
  * @access private
  */
 function getWhereSql(array $options = array())
 {
     global $ENTITY_SHOW_HIDDEN_OVERRIDE;
     $defaults = array('table_alias' => 'e', 'user_guid' => _elgg_services()->session->getLoggedInUserGuid(), 'use_enabled_clause' => !$ENTITY_SHOW_HIDDEN_OVERRIDE, 'access_column' => 'access_id', 'owner_guid_column' => 'owner_guid', 'guid_column' => 'guid');
     $options = array_merge($defaults, $options);
     // just in case someone passes a . at the end
     $options['table_alias'] = rtrim($options['table_alias'], '.');
     foreach (array('table_alias', 'access_column', 'owner_guid_column', 'guid_column') as $key) {
         $options[$key] = sanitize_string($options[$key]);
     }
     $options['user_guid'] = sanitize_int($options['user_guid'], false);
     // only add dot if we have an alias or table name
     $table_alias = $options['table_alias'] ? $options['table_alias'] . '.' : '';
     $options['ignore_access'] = elgg_check_access_overrides($options['user_guid']);
     $clauses = array('ors' => array(), 'ands' => array());
     $prefix = _elgg_services()->db->getTablePrefix();
     if ($options['ignore_access']) {
         $clauses['ors'][] = '1 = 1';
     } else {
         if ($options['user_guid']) {
             // include content of user's friends
             $clauses['ors'][] = "{$table_alias}{$options['access_column']} = " . ACCESS_FRIENDS . "\n\t\t\t\tAND {$table_alias}{$options['owner_guid_column']} IN (\n\t\t\t\t\tSELECT guid_one FROM {$prefix}entity_relationships\n\t\t\t\t\tWHERE relationship = 'friend' AND guid_two = {$options['user_guid']}\n\t\t\t\t)";
             // include user's content
             $clauses['ors'][] = "{$table_alias}{$options['owner_guid_column']} = {$options['user_guid']}";
         }
     }
     // include standard accesses (public, logged in, access collections)
     if (!$options['ignore_access']) {
         $access_list = get_access_list($options['user_guid']);
         $clauses['ors'][] = "{$table_alias}{$options['access_column']} IN {$access_list}";
     }
     if ($options['use_enabled_clause']) {
         $clauses['ands'][] = "{$table_alias}enabled = 'yes'";
     }
     $clauses = _elgg_services()->hooks->trigger('get_sql', 'access', $options, $clauses);
     $clauses_str = '';
     if (is_array($clauses['ors']) && $clauses['ors']) {
         $clauses_str = '(' . implode(' OR ', $clauses['ors']) . ')';
     }
     if (is_array($clauses['ands']) && $clauses['ands']) {
         if ($clauses_str) {
             $clauses_str .= ' AND ';
         }
         $clauses_str .= '(' . implode(' AND ', $clauses['ands']) . ')';
     }
     return "({$clauses_str})";
 }
 public function addEntityAccessFilter($user_guid = 0)
 {
     $user_guid = sanitise_int($user_guid, false);
     if (empty($user_guid)) {
         $user_guid = elgg_get_logged_in_user_guid();
     }
     if (elgg_check_access_overrides($user_guid)) {
         return;
     }
     $access_filter = [];
     if (!empty($user_guid)) {
         // check for owned content
         $access_filter[]['term']['owner_guid'] = $user_guid;
         // add friends check
         $friends = elgg_get_entities_from_relationship(['type' => 'user', 'relationship' => 'friend', 'relationship_guid' => $user_guid, 'inverse_relationship' => true, 'limit' => false, 'callback' => function ($row) {
             return $row->guid;
         }]);
         if (!empty($friends)) {
             $access_filter[] = ['bool' => ['must' => ['term' => ['owner_guid' => $friends], 'term' => ['access_id' => ACCESS_FRIENDS]]]];
         }
     }
     // add acl filter
     $access_array = get_access_array($user_guid);
     if (!empty($access_array)) {
         $access_filter[]['terms']['access_id'] = $access_array;
     }
     if (empty($access_filter)) {
         return;
     }
     $filter['bool']['must'][]['bool']['should'] = $access_filter;
     $this->addFilter($filter);
 }
Exemple #9
0
/**
 * Check if the access system should be overridden.
 *
 * Allows admin users and calls after {@link elgg_set_ignore_access} to
 * by pass the access system.
 *
 * @return true|null
 * @since 1.7.0
 * @elgg_event_handler permissions_check all
 */
function elgg_override_permissions_hook()
{
    $user_guid = elgg_get_logged_in_user_guid();
    // check for admin
    if ($user_guid && elgg_is_admin_user($user_guid)) {
        return true;
    }
    // check access overrides
    if (elgg_check_access_overrides($user_guid)) {
        return true;
    }
    // consult other hooks
    return NULL;
}
/**
 * Override permissions system
 *
 * @return true|null
 */
function elgg_override_permissions_hook($hook, $type, $returnval, $params)
{
    $user_guid = get_loggedin_userid();
    // check for admin
    if ($user_guid && elgg_is_admin_user($user_guid)) {
        return true;
    }
    // check access overrides
    if (elgg_check_access_overrides($user_guid)) {
        return true;
    }
    // consult other hooks
    return NULL;
}
Exemple #11
0
/**
 * This function has been added here until we decide if it is going to roll into core or not
 * Add access restriction sql code to a given query.
 * Note that if this code is executed in privileged mode it will return blank.
 * @TODO: DELETE once Query classes are fully integrated
 *
 * @param string $table_prefix Optional table. prefix for the access code.
 * @param int $owner
 */
function get_access_sql_suffix_new($table_prefix_one = '', $table_prefix_two = '', $owner = null)
{
    global $ENTITY_SHOW_HIDDEN_OVERRIDE, $CONFIG;
    $sql = "";
    $friends_bit = "";
    $enemies_bit = "";
    if ($table_prefix_one) {
        $table_prefix_one = sanitise_string($table_prefix_one) . ".";
    }
    if ($table_prefix_two) {
        $table_prefix_two = sanitise_string($table_prefix_two) . ".";
    }
    if (!isset($owner)) {
        $owner = get_loggedin_userid();
    }
    if (!$owner) {
        $owner = -1;
    }
    $ignore_access = elgg_check_access_overrides($owner);
    $access = get_access_list($owner);
    if ($ignore_access) {
        $sql = " (1 = 1) ";
    } else {
        if ($owner != -1) {
            $friends_bit = "{$table_prefix_one}access_id = " . ACCESS_FRIENDS . "\n\t\t\tAND {$table_prefix_one}owner_guid IN (\n\t\t\t\tSELECT guid_one FROM {$CONFIG->dbprefix}entity_relationships\n\t\t\t\tWHERE relationship='friend' AND guid_two={$owner}\n\t\t\t)";
            $friends_bit = '(' . $friends_bit . ') OR ';
            if (isset($CONFIG->user_block_and_filter_enabled) && $CONFIG->user_block_and_filter_enabled) {
                // check to see if the user is in the entity owner's block list
                // or if the entity owner is in the user's filter list
                // if so, disallow access
                $enemies_bit = get_annotation_sql('elgg_block_list', "{$table_prefix_one}owner_guid", $owner, false);
                $enemies_bit = '(' . $enemies_bit . '	AND ' . get_annotation_sql('elgg_filter_list', $owner, "{$table_prefix_one}owner_guid", false) . ')';
            }
        }
    }
    if (empty($sql)) {
        $sql = " {$friends_bit} ({$table_prefix_one}access_id IN {$access}\n\t\t\tOR ({$table_prefix_one}owner_guid = {$owner})\n\t\t\tOR (\n\t\t\t\t{$table_prefix_one}access_id = " . ACCESS_PRIVATE . "\n\t\t\t\tAND {$table_prefix_one}owner_guid = {$owner}\n\t\t\t)\n\t\t)";
    }
    if ($enemies_bit) {
        $sql = "{$enemies_bit} AND ({$sql})";
    }
    if (!$ENTITY_SHOW_HIDDEN_OVERRIDE) {
        $sql .= " and {$table_prefix_two}enabled='yes'";
    }
    return '(' . $sql . ')';
}