215 impersonation bugfixes

This commit is contained in:
2026-03-15 17:05:43 +03:00
parent 4f624b06c4
commit 7f22e0df47
2 changed files with 52 additions and 28 deletions
+50 -28
View File
@@ -57,7 +57,7 @@
//variables.framework.docs={}; //variables.framework.docs={};
variables.framework.docs.APIName="svc-api"; variables.framework.docs.APIName="svc-api";
variables.framework.docs.APIVersion="0.214"; /*$ git config --global --unset user.password*/ variables.framework.docs.APIVersion="0.215"; /*$ git config --global --unset user.password*/
variables.framework.globalHeaders = structNew(); variables.framework.globalHeaders = structNew();
variables.framework.globalHeaders["Access-Control-Expose-Headers"] = "Location"; variables.framework.globalHeaders["Access-Control-Expose-Headers"] = "Location";
@@ -283,8 +283,8 @@
//writeDump(result); abort; //writeDump(result); abort;
try { try {
var idpUserData=deserializeJson(result); var idpUserData=deserializeJson(result);
arguments.requestArguments.companyUid=idpUserData.userInfo.companyId;//GUID! "arguments.requestArguments.companyUid"=idpUserData.userInfo.companyId;//GUID!
arguments.requestArguments.usrUid=idpUserData.userInfo.contactId;//userId; //GUID! "arguments.requestArguments.usrUid"=idpUserData.userInfo.contactId;//userId; //GUID!
var usrCustomerInfo=getUsrCustomerInfo(idpUserData.userInfo.contactId, idpUserData.userInfo.companyId); var usrCustomerInfo=getUsrCustomerInfo(idpUserData.userInfo.contactId, idpUserData.userInfo.companyId);
} catch (e) { } catch (e) {
@@ -298,13 +298,13 @@
if (lCase(arguments.cfc) EQ 'notification_ls') { //*** костыль: для нотификаций можно адресоваться к пользователю без контракта if (lCase(arguments.cfc) EQ 'notification_ls') { //*** костыль: для нотификаций можно адресоваться к пользователю без контракта
if (structIsEmpty(usrCustomerInfo)) { if (structIsEmpty(usrCustomerInfo)) {
arguments.requestArguments.usrId=-1; //Integer! "arguments.requestArguments.usrId"=-1; //Integer!
arguments.requestArguments.contragentId=-1; //Integer "arguments.requestArguments.contragentId"=-1; //Integer
arguments.requestArguments.contractId=-1; //Integer "arguments.requestArguments.contractId"=-1; //Integer
arguments.requestArguments.specificationId=-1; //Integer "arguments.requestArguments.specificationId"=-1; //Integer
arguments.requestArguments.isImpersonated=false; "arguments.requestArguments.isImpersonated"=false;
arguments.requestArguments.clientID=""; "arguments.requestArguments.clientID"="";
arguments.requestArguments.login=""; "arguments.requestArguments.login"="";
return true; return true;
} }
@@ -312,27 +312,27 @@
if (structIsEmpty(usrCustomerInfo)) return representationOf("Cannot find default specification for current user #result#").withStatus(422); //это создает довольно много лишних движений при отладке if (structIsEmpty(usrCustomerInfo)) return representationOf("Cannot find default specification for current user #result#").withStatus(422); //это создает довольно много лишних движений при отладке
arguments.requestArguments.usrId=usrCustomerInfo.usrId; //Integer! "arguments.requestArguments.usrId"=usrCustomerInfo.usrId; //Integer
arguments.requestArguments.contragentId=usrCustomerInfo.contragentId; //Integer "arguments.requestArguments.contragentId"=usrCustomerInfo.contragentId; //Integer
arguments.requestArguments.contractId=usrCustomerInfo.contractId; //Integer "arguments.requestArguments.contractId"=usrCustomerInfo.contractId; //Integer
arguments.requestArguments.specificationId=usrCustomerInfo.specificationId; //Integer "arguments.requestArguments.specificationId"=usrCustomerInfo.specificationId; //Integer
try { try {
arguments.requestArguments.isImpersonated=idpUserData.impersonation.is_impersonated; "arguments.requestArguments.isImpersonated"=idpUserData.impersonation.is_impersonated;
} catch (e) { } catch (e) {
arguments.requestArguments.isImpersonated=false; // так себе решение, надо было бы NULL "arguments.requestArguments.isImpersonated"=false; // так себе решение, надо было бы NULL
} }
try { try {
arguments.requestArguments.clientID=idpUserData.userInfo.clientID; "arguments.requestArguments.clientID"=idpUserData.userInfo.clientID;
} catch (e) { } catch (e) {
arguments.requestArguments.clientID=""; "arguments.requestArguments.clientID"="";
} }
try { try {
arguments.requestArguments.login=idpUserData.userInfo.login; "arguments.requestArguments.login"=idpUserData.userInfo.login;
} catch (e) { } catch (e) {
arguments.requestArguments.login=""; "arguments.requestArguments.login"="";
} }
return true; return true;
@@ -423,6 +423,10 @@
<cffunction name="getUsrCustomerInfo"> <cffunction name="getUsrCustomerInfo">
<!--- Может быть имперсонирована компания, а может контакт,
при этом если имперсонируется компания, то спецификацию и контракт нужно брать по компании
Кстати, зачем нужен вообще юзер, если компания всегда доступна, а вся информация висит на ней
Для того, чтобы разрешить ключ в целочисленный ключ CMDB--->
<cfargument name="usrUid"/> <cfargument name="usrUid"/>
<cfargument name="contragentUid"/> <cfargument name="contragentUid"/>
@@ -443,20 +447,37 @@
<cfquery name="local.qGetContragentInfo"> <cfquery name="local.qGetContragentInfo">
select z.contragent_id, c.contract_id, s.specification_id select z.contragent_id, c.contract_id, s.specification_id
from contragent z from contragent z
left outer join contract c on (z.contragent_id=c.contragent_id) join contract c on (z.contragent_id=c.contragent_id)
left outer join specification s on (c.contract_id=s.contract_id) join specification s on (c.contract_id=s.contract_id)
where z.external_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.contragentUid#" null=#!isValid('guid',arguments.contragentUid)#/> where z.external_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.contragentUid#" null=#!isValid('guid',arguments.contragentUid)#/>
order by s.specification_id desc order by s.specification_id desc
limit 1; limit 1;
</cfquery> </cfquery>
<cfif local.qGetContragentInfo.recordCount EQ 0> <cfif local.qGetContragentInfo.recordCount EQ 0>
<cfthrow message="Contragent Not Found in CMDB" detail="Contragent with uuid=(#arguments.contragentUid#) not found in CMDB"/> <!--- диагностика (тут можно не переживать за производительность, история редкая) --->
<cfquery name="local.qGetContragent">
select z.contragent_id
from contragent z
where z.external_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.contragentUid#" null=#!isValid('guid',arguments.contragentUid)#/>
</cfquery>
<cfif local.qGetContragent.recordCount EQ 0>
<cfthrow message="Contragent Not Found in CMDB" detail="Contragent with uuid=(#arguments.contragentUid#) not found in CMDB"/>
</cfif>
<cfquery name="local.qGetContract">
select z.contragent_id, c.contract_id
from contragent z
join contract c on (z.contragent_id=c.contragent_id)
where z.external_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.contragentUid#" null=#!isValid('guid',arguments.contragentUid)#/>
</cfquery>
<cfif local.qGetContract.recordCount EQ 0>
<cfthrow message="Contragent does not have a contract in CMDB" detail="No contract for contragent with uuid=(#arguments.contragentUid#) found in CMDB (contragent_id=#local.qGetContragent.contragent_id#)"/>
</cfif>
<cfthrow message="Contragent does not have a specification in CMDB" detail="No specification for contragent with uuid=(#arguments.contragentUid#) found in CMDB (contragent_id=#local.qGetContragent.contragent_id#)"/>
</cfif> </cfif>
<cfif !len(local.qGetContragentInfo.contract_id)>
<cfthrow message="Contragent does not have a contract in CMDB" detail="No contract for contragent with uuid=(#arguments.contragentUid#) found in CMDB (contragent_id=#local.qGetContragentInfo.contragent_id#)"/>
</cfif>
<cfquery name="local.qGetUserInfo"> <cfquery name="local.qGetUserInfo">
select u.usr_id, u.contragent_id, k.contragent_id as c_contragent_id select u.usr_id, u.contragent_id, k.contragent_id as c_contragent_id
from usr u from usr u
@@ -464,6 +485,7 @@
where u.idp_usr_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.usrUid#" null=#!isValid('guid',arguments.usrUid)#/> where u.idp_usr_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.usrUid#" null=#!isValid('guid',arguments.usrUid)#/>
limit 1; limit 1;
</cfquery> </cfquery>
<cfif local.qGetUserInfo.recordCount EQ 0> <cfif local.qGetUserInfo.recordCount EQ 0>
<cfthrow message="User Not Found in CMDB" detail="User with uuid=(#arguments.usrUid#) not found in CMDB"/> <cfthrow message="User Not Found in CMDB" detail="User with uuid=(#arguments.usrUid#) not found in CMDB"/>
</cfif> </cfif>
+2
View File
@@ -36,6 +36,7 @@
<!--- <m:field>s.specification</m:field> <!--- <m:field>s.specification</m:field>
<m:field>(select count(*) from specification_item i where i.specification_id=s.specification_id) as specification_item_count</m:field> ---> <m:field>(select count(*) from specification_item i where i.specification_id=s.specification_id) as specification_item_count</m:field> --->
<m:field>c.contract_id</m:field> <m:field>c.contract_id</m:field>
<m:field>c.contragent_id</m:field>
<!--- <m:field>c.contract</m:field> <!--- <m:field>c.contract</m:field>
<m:field>to_char(c.dt_contract, 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZHTZM') as dt_contract</m:field> ---> <m:field>to_char(c.dt_contract, 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZHTZM') as dt_contract</m:field> --->
</m:field_set> </m:field_set>
@@ -68,6 +69,7 @@
<cfset var resultCollection=[]/> <cfset var resultCollection=[]/>
<cfset "out.usr" = (local.qRead.recordCount GT 0) ? this.helper.appendRecord(structNew("linked"), "", local.titleMap, local.qRead, this.helper.snake2camel) : {}/> <cfset "out.usr" = (local.qRead.recordCount GT 0) ? this.helper.appendRecord(structNew("linked"), "", local.titleMap, local.qRead, this.helper.snake2camel) : {}/>
<cfset "out.arguments" = #arguments#/>
<cfset "out.defaultSpecification" = (local.qSpec.recordCount GT 0) ? this.helper.appendRecord(structNew("linked"), "", local.specTitleMap, local.qSpec, this.helper.snake2camel) : {}/> <cfset "out.defaultSpecification" = (local.qSpec.recordCount GT 0) ? this.helper.appendRecord(structNew("linked"), "", local.specTitleMap, local.qSpec, this.helper.snake2camel) : {}/>
<cfset "out.runDurationMs"=getTickCount()-request.startTickCount/> <cfset "out.runDurationMs"=getTickCount()-request.startTickCount/>