Collections functions
Encryption functions
General functions
Theme permission functions
Resource functions

get_resource_access()

Parameters

ColumnTypeDefaultDescription
$resource

Location

include/resource_functions.php lines 4347 to 4566

Definition

 
function get_resource_access($resource)
    {
    global 
$customgroupaccess,$customuseraccess$internal_share_access$k,$uploader_view_override$userref,
        
$prevent_open_access_on_edit_for_active$search_filter_nodes$open_access_for_contributor,
        
$userref,$usergroup$usersearchfilter$search_filter_strict$search_all_workflow_states,
        
$userderestrictfilter$userdata;
    
# $resource may be a resource_data array from a search, in which case, many of the permissions checks are already done.    
        
    # Returns the access that the currently logged-in user has to $resource.
    # Return values:
    # 0 = Full Access (download all sizes)
    # 1 = Restricted Access (download only those sizes that are set to allow restricted downloads)
    # 2 = Confidential (no access)
    
    # Load the 'global' access level set on the resource
    # In the case of a search, resource type and global,group and user access are passed through to this point, to avoid multiple unnecessary get_resource_data queries.
    # passthru signifies that this is the case, so that blank values in group or user access mean that there is no data to be found, so don't check again .
    
$passthru="no";

    
// get_resource_data doesn't contain permissions, so fix for the case that such an array could be passed into this function unintentionally.
    
if (is_array($resource) && !isset($resource['group_access']) && !isset($resource['user_access'])){$resource=$resource['ref'];}
    
    if (!
is_array($resource))
        {
        
$resourcedata=get_resource_data($resource,true);
        if(!
$resourcedata)
            { return 
RESOURCE_ACCESS_INVALID_REQUEST; }
        }
    else
        {
        
$resourcedata=$resource;
        
$passthru="yes";
        }
                
    
$ref=$resourcedata['ref'];
    
$access=$resourcedata["access"];
    
$resource_type=$resourcedata['resource_type'];
    
    
// Set a couple of flags now that we can check later on if we need to check whether sharing is permitted based on whether access has been specifically granted to user/group
    
$customgroupaccess=false;
    
$customuseraccess=false;
    
    if(
'' != $k)
        {

        
# External access - check how this was shared.
        
$extaccess sql_value("SELECT access `value` FROM external_access_keys WHERE resource = '{$ref}' AND access_key = '" escape_check($k) . "' AND (expires IS NULL OR expires > NOW())", -1);

        if(-
!= $extaccess && (!$internal_share_access || ($internal_share_access && $extaccess $access)))
            {
            return (int) 
$extaccess;
            }
        }
    
    if (
checkperm("z" $resourcedata['archive']) && !($uploader_view_override && $resourcedata['created_by'] == $userref))
        {
        
// User has no access to this archive state 
        
return 2;
        }
    
    if (
checkperm("v"))
        {
        
# Permission to access all resources
        # Always return 0
        
return 0
        }    

    if (
$access==3)
        {
        
$customgroupaccess=true;
        
# Load custom access level
        
if ($passthru=="no"){ 
            
$access=get_custom_access($resource,$usergroup);
            } 
        else {
            
$access=$resource['group_access'];
        }
    }

    if (
$access == && get_edit_access($ref,$resourcedata['archive'],false,$resourcedata) && !$prevent_open_access_on_edit_for_active)
        {
        
# If access is restricted and user has edit access, grant open access.
        
$access 0;
        }

    if (
$open_access_for_contributor && $resourcedata['created_by'] == $userref)
        {
        
# If user has contributed resource, grant open access and ignore any further filters.
        
return 0;
        }

    
# Check for user-specific and group-specific access (overrides any other restriction)
    
    // We need to check for custom access either when access is set to be custom or
    // when the user group has restricted access to all resource types or specific resource types
    // are restricted
    
if ($access!=|| !checkperm('g') || checkperm('X' $resource_type))
        {
        if (
$passthru=="no")
            {
            
$userspecific=get_custom_access_user($resource,$userref);
            
$groupspecific=get_custom_access($resource,$usergroup,false);    
            } 
        else
            {
            
$userspecific=$resourcedata['user_access'];
            
$groupspecific=$resourcedata['group_access'];
            }
        }
    
    if (isset(
$userspecific) && $userspecific!="")
        {
        
$customuseraccess=true;
        return (int) 
$userspecific;
        }
    if (isset(
$groupspecific) && $groupspecific!="")
        {
        
$customgroupaccess=true;
        return (int) 
$groupspecific;
        }
        
    if (
checkperm('T'.$resource_type))
        {
        
// this resource type is always confidential/hidden for this user group
        
return 2;
        }
        
    if ((
trim($usersearchfilter)!="") && $search_filter_strict)
        {
        
# A search filter has been set. Perform filter processing to establish if the user can view this resource.        
        # Apply filters by searching for the resource, utilising the existing filter matching in do_search to avoid duplication of logic.

        
$search_all_workflow_states_cache $search_all_workflow_states;
        
$search_all_workflow_states TRUE;
        
$results=do_search("!resource" $ref);
        
$search_all_workflow_states $search_all_workflow_states_cache;
        if (
count($results)==0) {return 2;} # Not found in results, so deny
        
}

    
/*
    Restricted access to all available resources
    OR Restricted access to resources in a particular workflow state
    OR Restricted access to resources of a particular resource type
    UNLESS user/ group has been granted custom (override) access
    */
    
if (
        
$access == 0
        
&& ((!checkperm("g") || checkperm("rws{$resourcedata['archive']}") || checkperm('X'.$resource_type))
        && !
$customgroupaccess
        
&& !$customuseraccess)
        )
        {
        
$access 1;
        }

    
// Check for a derestrict filter, this allows exceptions for users without the 'g' permission who normally have restricted accesss to all available resources)
    
if ($access==&& !checkperm("g") && !checkperm("rws{$resourcedata['archive']}") && !checkperm('X'.$resource_type) && trim($userderestrictfilter) != "")
        {
        if(
$search_filter_nodes 
            
&& strlen(trim($userderestrictfilter)) > 0
            
&& !is_numeric($userderestrictfilter)
            && 
trim($userdata[0]["derestrict_filter"]) != ""
            
&& $userdata[0]["derestrict_filter_id"] != -1
        
)
            {
            
// Migrate unless marked not to due to failure (flag will be reset if group is edited)
            
$migrateresult migrate_filter($userderestrictfilter);
            
$notification_users get_notification_users();
            global 
$userdata$lang$baseurl;
            if(
is_numeric($migrateresult))
                {
                
// Successfully migrated - now use the new filter
                
sql_query("UPDATE usergroup SET derestrict_filter_id='" $migrateresult "' WHERE ref='" $usergroup "'");
                
debug("FILTER MIGRATION: Migrated derestrict_filter_id filter - '" $userderestrictfilter "' filter id#" $migrateresult);
                
$userderestrictfilter $migrateresult;
                }
            elseif(
is_array($migrateresult))
                {
                
debug("FILTER MIGRATION: Error migrating filter: '" $userderestrictfilter "' - " implode('\n' ,$migrateresult));
                
// Error - set flag so as not to reattempt migration and notify admins of failure
                
sql_query("UPDATE usergroup SET derestrict_filter_id='-1' WHERE ref='" $usergroup "'");
                
message_add(array_column($notification_users,"ref"), $lang["filter_migration"] . " - " $lang["filter_migrate_error"] . ": <br />" implode('\n' ,$migrateresult),generateURL($baseurl "/pages/admin/admin_group_management_edit.php",array("ref"=>$usergroup)));
                }
            }

        if(
$search_filter_nodes && is_numeric($userderestrictfilter) && $userderestrictfilter 0)
            {
            
$matchedfilter filter_check($userderestrictfilterget_resource_nodes($ref));
            }
        else
            {
            
# Old style filter 
            
if(!isset($metadata))
                {
                
#  load metadata if not already loaded
                
$metadata=get_resource_field_data($ref,false,false);
                }

            
$matchedfilter=false;
            for (
$n=0;$n<count($metadata);$n++)
                {
                
$name=$metadata[$n]["name"];
                
$value=$metadata[$n]["value"];
                if (
$name!="")
                    {
                    
$match=filter_match($userderestrictfilter,$name,$value);
                    if (
$match==1) {$matchedfilter=false;break;}
                    if (
$match==2) {$matchedfilter=true;} 
                    }
                }
            }
        if(
$matchedfilter)
            {
            
$access=0;
            
$customgroupaccess true;
            }
        }
        
    return (int) 
$access;
    }

This article was last updated 10th July 2020 20:35 Europe/London time based on the source file dated 10th July 2020 16:06 Europe/London time.