/* Ċ Ġ* ĠTencent Ġis Ġplease d Ġto Ġsupport Ġthe Ġopen Ġsource Ġcommunity Ġby Ġmaking ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġavailable . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠTH L ĠA 2 9 ĠLimited , Ġa ĠTencent Ġcompany . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġis Ġlicensed Ġunder Ġthe ĠMIT Ġlicense . Ċ Ġ* Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠMIT ĠLicense Ġis Ġincluded Ġin Ġthis Ġfile . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTerms Ġof Ġthe ĠMIT ĠLicense : Ċ Ġ* Ġ------------------------------------------------ --- Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . tencent . bk repo . auth . service . b ki am Ċ Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . tencent . bk repo . auth . pojo . Iam Base Req Ċ import Ġcom . tencent . bk repo . auth . pojo . Iam Create Api Req Ċ import Ġcom . tencent . bk repo . auth . pojo . Iam Permission Url Req Ċ import Ġcom . tencent . bk repo . auth . util . Http Utils Ċ import Ġcom . tencent . bk repo . common . api . util . Json Utils . object Mapper Ċ import Ġokhttp 3 . MediaType Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . RequestBody Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Value Ċ import Ġjava . security . cert . Certificate Exception Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . net . ssl . SSL Context Ċ import Ġjavax . net . ssl . SS LS ocket Factory Ċ import Ġjavax . net . ssl . Trust Manager Ċ import Ġjavax . net . ssl . X 5 0 9 Trust Manager Ċ Ċ class ĠI am E sb Client Ġ{ ĊĠĠĠ Ġ@ Value ("\ ${ es b . code : }") ĊĠĠĠ Ġprivate Ġval Ġapp Code : ĠString Ġ= Ġ"" ĊĠĠĠ Ġ@ Value ("\ ${ es b . secret : }") ĊĠĠĠ Ġprivate Ġval Ġapp Secret : ĠString Ġ= Ġ"" ĊĠĠĠ Ġ@ Value ("\ ${ es b . iam . url : }") ĊĠĠĠ Ġprivate Ġval Ġiam Url : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġfun Ġcreate Relation Resource ( iam Create Api Req : ĠI am Create Api Req ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" create Relation Resource , Ġiam Create Api Req : Ġ$ iam Create Api Req ") ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġbuild Url (" api / c / comp api / v 2 / iam / authorization / resource _ creator _ action /") ĊĠĠĠĠĠĠĠ Ġlogger . debug (" create Relation Resource , Ġurl [$ url ]") ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠobjectMapper . writeValue AsString ( set Credentials ( iam Create Api Req , Ġapp Code , Ġapp Secret )) ĊĠĠĠĠĠĠĠ Ġlogger . debug (" v 3 Ġcreate Relation Resource Ġbody [$ content ]") ĊĠĠĠĠĠĠĠ Ġval Ġrequest Body Ġ= ĠRequest Body . create ( MediaType . parse (" application / json ; Ġcharset = utf - 8 "), Ġcontent ) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder (). url ( url ). post ( request Body ). build () ĊĠĠĠĠĠĠĠ Ġval Ġapi Response Ġ= ĠHttp Utils . do Request ( ok HttpClient , Ġrequest , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġiam Api Res Ġ= ĠobjectMapper . readValue < Map < String , ĠAny >>( api Response . content ) ĊĠĠĠĠĠĠĠ Ġif Ġ( iam Api Res [" code "] Ġ!= Ġ 0 Ġ|| Ġiam Api Res [" result "] Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" es bi am Ġrequest Ġfailed , Ġresponse : Ġ${ api Response . content }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Permission Url ( iam Permission Url : ĠI am Permission Url Req ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" get Permission Url , Ġiam Permission Url : Ġ$ iam Permission Url ") ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġbuild Url ("/ api / c / comp api / v 2 / iam / application /") ĊĠĠĠĠĠĠĠ Ġlogger . info (" get Permission Url , Ġurl :$ url ") ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠobjectMapper . writeValue AsString ( set Credentials ( iam Permission Url , Ġapp Code , Ġapp Secret )) ĊĠĠĠĠĠĠĠ Ġlogger . info (" get Permission Url , Ġcontent :$ content ") ĊĠĠĠĠĠĠĠ Ġval Ġrequest Body Ġ= ĠRequest Body . create ( MediaType . parse (" application / json ; Ġcharset = utf - 8 "), Ġcontent ) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder (). url ( url ). post ( request Body ). build () ĊĠĠĠĠĠĠĠ Ġval Ġapi Response Ġ= ĠHttp Utils . do Request ( ok HttpClient , Ġrequest , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġiam Api Res Ġ= ĠobjectMapper . readValue < Map < String , ĠAny >>( api Response . content ) ĊĠĠĠĠĠĠĠ Ġif Ġ( iam Api Res [" code "] Ġ!= Ġ 0 Ġ|| Ġiam Api Res [" result "] Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" es bi am Ġrequest Ġfailed , Ġresponse : Ġ${ api Response . content }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġiam Api Res [" data "]. toString (). substring After (" url =" ). substring Before Last (" }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Credentials ( iam Base Req : ĠI am Base Req , Ġapp Code : ĠString , Ġapp Secret : ĠString ): ĠI am Base Req Ġ{ ĊĠĠĠĠĠĠĠ Ġiam Base Req . bk _ app _ code Ġ= Ġapp Code ĊĠĠĠĠĠĠĠ Ġiam Base Req . bk _ app _ secret Ġ= Ġapp Secret ĊĠĠĠĠĠĠĠ Ġreturn Ġiam Base Req ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Url ( uri : ĠString ) Ġ= Ġ"${ iam Url . remove Suffix ("/") }/${ uri . remove Prefix ("/") }" ĊĊĠĠĠ Ġprivate Ġval Ġtrust All Certs Ġ= ĠarrayOf < Trust Manager >( object Ġ: ĠX 5 0 9 Trust Manager Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Throws ( Certificate Exception :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Client Trusted ( chain : ĠArray < java . security . cert . X 5 0 9 Certificate >, Ġauth Type : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno - op ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( Certificate Exception :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Server Trusted ( chain : ĠArray < java . security . cert . X 5 0 9 Certificate >, Ġauth Type : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno - op ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Accepted Iss u ers (): ĠArray < java . security . cert . X 5 0 9 Certificate > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠarrayOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġprivate Ġfun Ġssl Socket Factory (): ĠSSL Socket Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġssl Context Ġ= ĠSSL Context . getInstance (" SSL ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġssl Context . init ( null , Ġtrust All Certs , Ġjava . security . Secure Random ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġssl Context . socket Factory ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġok HttpClient Ġ= Ġokhttp 3 . Ok HttpClient . Builder () ĊĠĠĠĠĠĠĠ Ġ. connect Timeout ( 5 L , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġ. read Timeout ( 3 0 L , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġ. write Timeout ( 3 0 L , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġ. ssl Socket Factory ( ssl Socket Factory (), Ġtrust All Certs [ 0 ] Ġas ĠX 5 0 9 Trust Manager ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Iam E sb Client :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ