<!--- 
	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>