// ĠCopyright Ġ 2 0 2 0 ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ // ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ċ package Ġsoftware . aws . tool k its . jetbrains . core . credentials . profiles Ċ Ċ import Ġcom . intellij . util . text . nul lize Ċ import Ġsoftware . amazon . aw ssdk . profiles . Profile Ċ import Ġsoftware . amazon . aw ssdk . profiles . Profile Property Ċ import Ġsoftware . aws . tool k its . resources . message Ċ Ċ fun ĠProfile . traverse Credential Chain ( profiles : ĠMap < String , ĠProfile >): ĠSequence < Profile > Ġ= Ġsequence Ġ{ ĊĠĠĠ Ġval Ġprofile Chain Ġ= Ġlinked Set Of < String >() ĊĠĠĠ Ġvar Ġcurrent Profile Ġ= Ġthis @ traverse Credential Chain ĊĊĠĠĠ Ġyield ( current Profile ) ĊĊĠĠĠ Ġwhile Ġ( current Profile . property Exists ( Profile Property . ROLE _ ARN )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Profile Name Ġ= Ġcurrent Profile . name () ĊĠĠĠĠĠĠĠ Ġif Ġ(! profile Chain . add ( current Profile Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchain Ġ= Ġprofile Chain . join ToString (" -> ", Ġpostfix Ġ= Ġ" ->$ current Profile Name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( message (" credentials . profile . circular _ profiles ", Ġname (), Ġchain )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsource Profile Ġ= Ġcurrent Profile . property ( Profile Property . SOURCE _ PROFILE ) ĊĠĠĠĠĠĠĠ Ġval Ġcredential Source Ġ= Ġcurrent Profile . property ( Profile Property . CRED ENTIAL _ SOURCE ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( source Profile . isPresent Ġ&& Ġcredential Source . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( message (" credentials . profile . assume _ role . duplicate _ source ", Ġcurrent Profile Name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( source Profile . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Profile Name Ġ= Ġsource Profile . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Profile Ġ= Ġprofiles [ source Profile Name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" credentials . profile . source _ profile _ not _ found ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Profile Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Profile Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( current Profile ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( credential Source . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ sequence ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( message (" credentials . profile . assume _ role . missing _ source ", Ġcurrent Profile Name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠProfile . property Exists ( propertyName : ĠString ): ĠBoolean Ġ= Ġthis . property ( propertyName ). isPresent Ċ Ċ fun ĠProfile . required Property ( propertyName : ĠString ): ĠString Ġ= Ġthis . property ( propertyName ) ĊĠĠĠ Ġ. filter Ġ{ Ġit . nul lize () Ġ!= Ġnull Ġ} ĊĠĠĠ Ġ. orElse Throw Ġ{ ĊĠĠĠĠĠĠĠ ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" credentials . profile . missing _ property ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . name (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpropertyName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ