Collections functions
Encryption functions
General functions
Render functions
Theme permission functions
Video functions
Resource functions

get_edit_access()

Parameters

ColumnTypeDefaultDescription
$resource
$status -999
$metadata false
&$resourcedata ""

Location

include/resource_functions.php lines 5037 to 5168

Definition

 
function get_edit_access($resource,$status=-999,$metadata=false,&$resourcedata="")
    {
    
# For the provided resource and metadata, does the current user have edit access to this resource?
    # Checks the edit permissions (e0, e-1 etc.) and also the group edit filter which filters edit access based on resource metadata.
    
    
global $userref,$usergroup$usereditfilter,$edit_access_for_contributor,
    
$search_filter_nodes$userpermissions$lang$baseurl$userdata$edit_only_own_contributions;
    
$plugincustomeditaccess hook('customediteaccess','',array($resource,$status,$resourcedata));

    if(
$plugincustomeditaccess)
        {
        return (
'false' === $plugincustomeditaccess false true);
        }

    if (!
is_array($resourcedata) || !isset($resourcedata['resource_type'])) # Resource data  may not be passed 
        
{
        
$resourcedata=get_resource_data($resource);        
        }    
    if (
$status==-999# Archive status may not be passed 
        
{$status=$resourcedata["archive"];}
        
    if (
$resource==0-$userref) {return true;} # Can always edit their own user template.

    # If $edit_access_for_contributor is true in config then users can always edit their own resources.
    
if ($edit_access_for_contributor && $userref==$resourcedata["created_by"]) {return true;}

    if(
$edit_only_own_contributions && $userref != $resourcedata["created_by"])
        {
        return 
false;
        }
        
    
# Must have edit permission to this resource first and foremost, before checking the filter.
    
if ((!checkperm("e" $status) && !checkperm("ert" $resourcedata['resource_type']))
        ||
        (
checkperm("XE" $resourcedata['resource_type']))
        ||
        (
checkperm("XE") && !checkperm("XE-" $resourcedata['resource_type']))
        )
        {
        return 
false;
        }
    
    
# Cannot edit if z permission
    
if (checkperm("z" $status)) {return false;}

    
# Cannot edit if pending status (<0) and neither admin ('t') nor created by currentuser 
    #             and does not have force edit access to the resource type
    
if (    $status<&& !( checkperm("t") || $resourcedata['created_by'] == $userref 
         && !
checkperm("ert" $resourcedata['resource_type'])
       )
        {
        return 
false;
        } 
    
    
$gotmatch=false;
    
    if(
$search_filter_nodes 
        
&& strlen(trim($usereditfilter)) > 0
        
&& !is_numeric($usereditfilter)
        && 
trim($userdata[0]["edit_filter"]) != ""
        
&& $userdata[0]["edit_filter_id"] != -1
        
)
        {
        
// Migrate unless marked not to due to failure (flag will be reset if group is edited)
        
$migrateeditfilter edit_filter_to_restype_permission($usereditfilter$usergroup$userpermissionstrue);
        
$migrateresult migrate_filter($migrateeditfilter); 
        
$notification_users get_notification_users();
        if(
is_numeric($migrateresult))
            {
            
// Successfully migrated - now use the new filter
            
sql_query("UPDATE usergroup SET edit_filter_id='" $migrateresult "' WHERE ref='" $usergroup "'");
            
debug("FILTER MIGRATION: Migrated edit filter - '" $usereditfilter "' filter id#" $migrateresult);
            
$usereditfilter $migrateresult;
            }
        elseif(
is_array($migrateresult))
            {
            
debug("FILTER MIGRATION: Error migrating filter: '" $usereditfilter "' - " implode('\n' ,$migrateresult));
            
// Error - set flag so as not to reattempt migration and notify admins of failure
            
sql_query("UPDATE usergroup SET edit_filter_id='0' 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 (
trim($usereditfilter)=="" || ($status<&& $resourcedata['created_by'] == $userref)) # No filter set, or resource was contributed by user and is still in a User Contributed state in which case the edit filter should not be applied.
        
{
        
$gotmatch true;
        }
    elseif(
$search_filter_nodes && is_numeric($usereditfilter) && $usereditfilter 0)
        {
        
$gotmatch filter_check($usereditfilterget_resource_nodes($resource));
        }
    else
        {
        
# An old style edit filter has been set. Perform edit filter processing to establish if the user can edit this resource.
        # Always load metadata, because the provided metadata may be missing fields due to permissions.
        
$metadata=get_resource_field_data($resource,false,false);
                
        for (
$n=0;$n<count($metadata);$n++)
            {
            
$name=$metadata[$n]["name"];
            
$value=$metadata[$n]["value"];            
            if (
$name!="")
                {
                
$match=filter_match(trim($usereditfilter),$name,$value);
                if (
$match==1) {return false;} # The match for this field was incorrect, always fail in this event.
                
if ($match==2) {$gotmatch=true;} # The match for this field was correct.
                
}
            }

        
# Also check resource type, if specified.
        
if (strpos($usereditfilter,"resource_type")!==false)
            {
            
$resource_type=$resourcedata['resource_type'];

            
$match=filter_match(trim($usereditfilter),"resource_type",$resource_type);
            if (
$match==1) {return false;} # Resource type was specified but the value did not match. Disallow edit access.
            
if ($match==2) {$gotmatch=true;}
            }
        }

    if (
$gotmatch
        {
        
$gotmatch = !hook("denyafterusereditfilter");
        }
    
    if(
checkperm("ert" $resourcedata['resource_type']))
        {
        return 
true;
        }

    return 
$gotmatch;
    }

This article was last updated 27th November 2020 06:05 Europe/London time based on the source file dated 13th November 2020 16:50 Europe/London time.