spec/lib/ac.cfm
2025-06-02 16:16:51 +03:00

79 lines
3.2 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!---
Access check aka проверка доступа.
Если доступа нет, код, заключенный внутри тега, не выполняется, текст не выводится.
Два варианта использования.
1. При заданном значении действия проверяется наличие этого доступа к объекту, ответ да-нет
2. Проверяется уровень доступа к заданному объекту
Для пустого объекта
Если задать строковый атрибут output, в переменную с таким именем запишется
TRUE(доступ разрешен)/FALSE(доступ запрещен).
Тег обязательно должен быть закрыт.
---><cfsilent>
<!--- проверка на закрытость тега - без закрытия возможна неоднозначность со вложенными тегами --->
<cfif NOT thisTag.hasEndTag>
<cfthrow
type="custom" message="Unclosed AC.CFM tag found."
detail="AC.CFM tag must be closed. Self-closed tag is acceptable, e.g.: &lt;cfmodule template=""mod/ac.cfm"" /&gt;.">
</cfif>
<cfif thisTag.ExecutionMode is 'start'>
<cfparam name="ATTRIBUTES.obj" type="string" default=""/><!---
объект, к которому проверяется доступ --->
<cfparam name="ATTRIBUTES.act" type="numeric" default="#request.PERMISSION_READ#"/><!---
действие, которое проверяется --->
<cfparam name="ATTRIBUTES.output" type="string" default=""/>
<cfparam name="ATTRIBUTES.permissionOut" type="string" default=""/>
<cfset permission=request.PERMISSION_NONE/>
<cfif ATTRIBUTES.obj EQ "">
<cfif #request.usrAuthenticated()#>
<cfset permission=request.PERMISSION_WRITE/>
<cfelse>
<cfset permission=request.PERMISSION_READ/>
</cfif>
<cfset permitted=(ATTRIBUTES.act EQ #request.PERMISSION_READ# OR #request.usrAuthenticated()#)/>
<cfelse>
<cftry>
<cfset permitted=(len(ATTRIBUTES.obj) GT 0)>
<!---*** Максимальный доступ для перечисленных объектов и ролей
Можно подумать о минимальном--->
<cfquery name="qACL" datasource="#request.DS#">
select coalesce(max(permission),0) as permission
from usr_role ur
join acl on acl.role_id=ur.role_id
where ur.usr_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#request.usr_id#">
and acl.obj in (<cfqueryparam cfsqltype="cf_sql_varchar" value="#ATTRIBUTES.obj#" list="true">)
</cfquery>
<cfset permitted=(qACL.permission GE ATTRIBUTES.act)>
<cfset permission=#qACL.permission#/>
<cfcatch type="database">
<cfset permitted="Yes"/><!---***--->
<cfrethrow/>
</cfcatch>
</cftry>
</cfif>
<cfif len(ATTRIBUTES.output)>
<cfset setVariable("CALLER.#ATTRIBUTES.output#", permitted)><!---boolean--->
</cfif>
<cfif len(ATTRIBUTES.permissionOut)>
<cfset setVariable("CALLER.#ATTRIBUTES.permissionOut#", permission)><!---integer 0 1 2--->
</cfif>
<cfif NOT permitted><cfexit method="EXITTAG"></cfif>
</cfif><!---thisTag.ExecutionMode is 'start'--->
</cfsilent>