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.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["Access-Control-Expose-Headers"] = "Location";
@@ -283,8 +283,8 @@
//writeDump(result); abort;
try {
var idpUserData=deserializeJson(result);
arguments.requestArguments.companyUid=idpUserData.userInfo.companyId;//GUID!
arguments.requestArguments.usrUid=idpUserData.userInfo.contactId;//userId; //GUID!
"arguments.requestArguments.companyUid"=idpUserData.userInfo.companyId;//GUID!
"arguments.requestArguments.usrUid"=idpUserData.userInfo.contactId;//userId; //GUID!
var usrCustomerInfo=getUsrCustomerInfo(idpUserData.userInfo.contactId, idpUserData.userInfo.companyId);
} catch (e) {
@@ -298,13 +298,13 @@
if (lCase(arguments.cfc) EQ 'notification_ls') { //*** костыль: для нотификаций можно адресоваться к пользователю без контракта
if (structIsEmpty(usrCustomerInfo)) {
arguments.requestArguments.usrId=-1; //Integer!
arguments.requestArguments.contragentId=-1; //Integer
arguments.requestArguments.contractId=-1; //Integer
arguments.requestArguments.specificationId=-1; //Integer
arguments.requestArguments.isImpersonated=false;
arguments.requestArguments.clientID="";
arguments.requestArguments.login="";
"arguments.requestArguments.usrId"=-1; //Integer!
"arguments.requestArguments.contragentId"=-1; //Integer
"arguments.requestArguments.contractId"=-1; //Integer
"arguments.requestArguments.specificationId"=-1; //Integer
"arguments.requestArguments.isImpersonated"=false;
"arguments.requestArguments.clientID"="";
"arguments.requestArguments.login"="";
return true;
}
@@ -312,27 +312,27 @@
if (structIsEmpty(usrCustomerInfo)) return representationOf("Cannot find default specification for current user #result#").withStatus(422); //это создает довольно много лишних движений при отладке
arguments.requestArguments.usrId=usrCustomerInfo.usrId; //Integer!
arguments.requestArguments.contragentId=usrCustomerInfo.contragentId; //Integer
arguments.requestArguments.contractId=usrCustomerInfo.contractId; //Integer
arguments.requestArguments.specificationId=usrCustomerInfo.specificationId; //Integer
"arguments.requestArguments.usrId"=usrCustomerInfo.usrId; //Integer
"arguments.requestArguments.contragentId"=usrCustomerInfo.contragentId; //Integer
"arguments.requestArguments.contractId"=usrCustomerInfo.contractId; //Integer
"arguments.requestArguments.specificationId"=usrCustomerInfo.specificationId; //Integer
try {
arguments.requestArguments.isImpersonated=idpUserData.impersonation.is_impersonated;
"arguments.requestArguments.isImpersonated"=idpUserData.impersonation.is_impersonated;
} catch (e) {
arguments.requestArguments.isImpersonated=false; // так себе решение, надо было бы NULL
"arguments.requestArguments.isImpersonated"=false; // так себе решение, надо было бы NULL
}
try {
arguments.requestArguments.clientID=idpUserData.userInfo.clientID;
"arguments.requestArguments.clientID"=idpUserData.userInfo.clientID;
} catch (e) {
arguments.requestArguments.clientID="";
"arguments.requestArguments.clientID"="";
}
try {
arguments.requestArguments.login=idpUserData.userInfo.login;
"arguments.requestArguments.login"=idpUserData.userInfo.login;
} catch (e) {
arguments.requestArguments.login="";
"arguments.requestArguments.login"="";
}
return true;
@@ -423,6 +423,10 @@
<cffunction name="getUsrCustomerInfo">
<!--- Может быть имперсонирована компания, а может контакт,
при этом если имперсонируется компания, то спецификацию и контракт нужно брать по компании
Кстати, зачем нужен вообще юзер, если компания всегда доступна, а вся информация висит на ней
Для того, чтобы разрешить ключ в целочисленный ключ CMDB--->
<cfargument name="usrUid"/>
<cfargument name="contragentUid"/>
@@ -443,20 +447,37 @@
<cfquery name="local.qGetContragentInfo">
select z.contragent_id, c.contract_id, s.specification_id
from contragent z
left outer join contract c on (z.contragent_id=c.contragent_id)
left outer join specification s on (c.contract_id=s.contract_id)
join contract c on (z.contragent_id=c.contragent_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)#/>
order by s.specification_id desc
limit 1;
</cfquery>
<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 !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">
select u.usr_id, u.contragent_id, k.contragent_id as c_contragent_id
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)#/>
limit 1;
</cfquery>
<cfif local.qGetUserInfo.recordCount EQ 0>
<cfthrow message="User Not Found in CMDB" detail="User with uuid=(#arguments.usrUid#) not found in CMDB"/>
</cfif>
+2
View File
@@ -36,6 +36,7 @@
<!--- <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>c.contract_id</m:field>
<m:field>c.contragent_id</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_set>
@@ -68,6 +69,7 @@
<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.arguments" = #arguments#/>
<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/>