089 resource_realms isolation next

This commit is contained in:
msyu
2025-04-16 11:26:49 +03:00
parent 70e4471893
commit 0e12575f85
8 changed files with 119 additions and 64 deletions
+50 -8
View File
@@ -7,6 +7,7 @@
<!--- <cffunction name="post" hint="Создание новой операции с параметрами. Принимаются CFS параметры, генерируются RFS параметры. Запускается операция отдельным вызовом. До запуска CFS параметры могут корректироваться (а надо?). Запущенная операция навсегда становится Read Only (при желании можем реализовать ее клонирование). Можем реализовать корректировку параметров, но непонятно, зачем. Когда мы конфигурируем инстанс, на самом деле мы задаем CFS параметры операции create. Можно править параметры, а можно пересоздать операцию с новыми параметрами. Предусмотреть удаление (метод DELETE) незапущенной операции?"> --->
<cffunction name="post" hint="Создание новой операции. Отдельно загружаются CFS параметры, генерируются RFS параметры. Запускается операция отдельным вызовом. До запуска CFS параметры могут корректироваться (а надо?). Запущенная операция вместе с параметрами навсегда становится Read Only (при желании можем реализовать ее клонирование). Можем реализовать корректировку параметров, но непонятно, зачем. Когда мы конфигурируем инстанс, на самом деле мы задаем CFS параметры операции create. Можно править параметры, а можно пересоздать операцию с новыми параметрами. Предусмотреть удаление (метод DELETE) незапущенной операции?">
<cfargument name="instanceUid" type="string" required=true hint="type:guid"/>
<cfargument name="operation" type="string" required=true hint="type:string decsiption: operation name, e.g. create"/>
@@ -30,7 +31,9 @@
<!--- *** Добавить проверку разрешенных переходов, например, create нельзя сделать на развернутом экземпляре
*** Вероятно, допустимые переходы нужно либо специфицировать в документации, либо явно опубликовать (инстанс может публиковать список допустимых операций) --->
<cfset checkResourceRealmId(arguments.resourceRealmId, arguments.usrId, arguments.instanceUid)/>
<cfif listFind("create,redeploy",arguments.operation)>
<cfset checkResourceRealmId(arguments.resourceRealmId, arguments.instanceUid)/>
</cfif>
<cfcatch type="invalidParamValue">
<cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/>
@@ -68,21 +71,60 @@
/>
</cffunction>
<cffunction name="checkResourceRealmId">
<cffunction name="checkResourceRealmId" returntype="void">
<!--- В данном случае мы проверяем соответствие платформы сервису, а не операции, поэтому вопрос, нужен ли для данной операции параметр resourceRealm, надо решать вне этой функции --->
<cfargument name="resourceRealmId" type="numeric" required=true/>
<cfargument name="usrId" type="numeric" required=true/>
<cfargument name="instanceUid" type="guid" required=true/>
<cfargument name="instanceUid" type="guid" required=true/>
<cfset var local={}/>
<cfreturn/> <!--- *************** --->
<cfif NOT resourceRealmId GT 0>
<cfthrow type="InvalidParamValue" message="resource realm undefined" detail="Не выбрана ресурсная платформа"/>
<cfthrow type="InvalidParamValue" message="Resource realm undefined" detail="Не выбрана ресурсная платформа"/><!--- *** для многих операций она и не нужна --->
</cfif>
Проверить соответствие сервису
Проверить доступ (это предварительная проверка! настоящая проверка перед запуском операции)
<cfquery name="local.qContract">
select c.contract_id
from instance e
join specification_item si on (e.specification_item_id=si.specification_item_id)
join specification s on (si.specification_id=s.specification_id)
join contract c on (s.contract_id=c.contract_id)
where e.instance_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceUid#" null=#!isValid("guid",arguments.instanceUid)#/>
</cfquery>
<cfquery name="local.qCheckResourceRealmType">
select r.resource_realm_type_id
from resource_realm r
join resource_realm_type t on (r.resource_realm_type_id=t.resource_realm_type_id)
join svc s on (t.resource_realm_type_id=s.resource_realm_type_id)
join instance e on (s.svc_id=e.service_id)
where r.resource_realm_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.resourceRealmId# null=#!isValid("integer",arguments.resourceRealmId)#/>
AND e.instance_uid=<cfqueryparam cfsqltype="cf_sql_other" value=#arguments.instanceUid# null=#!isValid("guid", arguments.instanceUid)#/>
</cfquery>
<cfif local.qCheckResourceRealmType.recordCount EQ 0>
<cfthrow type="InvalidParamValue" message="Resource realm does not match service" detail="Ресурсная платформа не соответствует сервису"/>
</cfif>
<cfquery name="local.qCheckResourceRealmAccess">
select r.resource_realm_id
from resource_realm r
join resource_realm_access a on (r.resource_realm_id=a.resource_realm_id)
where r.resource_realm_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.resourceRealmId# null=#!isValid("integer",arguments.resourceRealmId)#/>
AND (a.contract_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#local.qContract.contract_id#/>
OR a.contract_id=0)
AND a.is_enabled
</cfquery>
<cfif local.qCheckResourceRealmAccess.recordCount EQ 0>
<cfthrow type="InvalidParamValue" message="Access to the resource realm denied for current contract" detail="У текущего договора id=#local.qContract.contract_id# нет доступа к выбранной ресурсной платформе"/>
</cfif>
<!---
Проверить доступ (это предварительная проверка! настоящая проверка перед запуском операции)
Итого: фильтрация выпадающего списка
Проверка атрибута операции (из которого получается RFS параметр)
Проверка RFS параметров перед запуском операции
(Можно еще вставить параноидальную проверку при сабмите, когда мы формируем параметры запроса)
(Можно еще вставить параноидальную проверку в cmdb-api, чтобы застраховаться от дефектов админки)
--->
<cfreturn/>
</cffunction>