package Ġno . nav . dag p enger . oidc Ċ Ċ import Ġio . ktor . client . HttpClient Ċ import Ġio . ktor . client . engine . HttpClient Engine Ċ import Ġio . ktor . client . engine . c io . C IO Ċ import Ġio . ktor . client . features . auth . Auth Ċ import Ġio . ktor . client . features . auth . providers . basic Ċ import Ġio . ktor . client . features . json . Jack son Serializer Ċ import Ġio . ktor . client . features . json . Json Feature Ċ import Ġio . ktor . client . features . logging . DEFAULT Ċ import Ġio . ktor . client . features . logging . LogLevel Ċ import Ġio . ktor . client . features . logging . Logger Ċ import Ġio . ktor . client . features . logging . Logging Ċ import Ġio . ktor . client . request . get Ċ import Ġio . ktor . client . request . parameter Ċ import Ġio . prometheus . client . Summary Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . time . Duration Ċ import Ġjava . time . LocalDateTime Ċ Ċ /** Ċ Ġ* Ġh enter Ġjwt Ġtoken Ġf ra ĠST S Ċ Ġ*/ Ċ Ċ private Ġval Ġrequest Latency Ġ= ĠSummary . build () ĊĠĠĠ Ġ. quant ile ( 0 . 5 , Ġ 0 . 0 5 ) Ġ// ĠAdd Ġ 5 0 th Ġpercent ile Ġ(= Ġmedian ) Ġwith Ġ 5 % Ġt oler ated Ġerror ĊĠĠĠ Ġ. quant ile ( 0 . 9 , Ġ 0 . 0 1 ) Ġ// ĠAdd Ġ 9 0 th Ġpercent ile Ġwith Ġ 1 % Ġt oler ated Ġerror ĊĠĠĠ Ġ. quant ile ( 0 . 9 9 , Ġ 0 . 0 0 1 ) Ġ// ĠAdd Ġ 9 9 th Ġpercent ile Ġwith Ġ 0 . 1 % Ġt oler ated Ġerror ĊĠĠĠ Ġ. name (" oidc _ requests _ latency _ seconds ") ĊĠĠĠ Ġ. help (" Request Ġlatency Ġin Ġseconds Ġfor ĠO id c Ġclient ") ĊĠĠĠ Ġ. register () Ċ Ċ class ĠSt s Oid c Client Ġconstructor ( ĊĠĠĠ Ġst s BaseUrl : ĠString , ĊĠĠĠ Ġprivate Ġval Ġusername : ĠString , ĊĠĠĠ Ġprivate Ġval Ġpassword : ĠString , ĊĠĠĠ Ġengine : ĠHttpClient Engine Ġ= ĠC IO . create () Ċ ) Ġ: ĠO id c Client Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġclient Ġ= ĠHttpClient ( engine ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinstall ( Json Feature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer Ġ= ĠJack son Serializer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinstall ( Auth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbasic Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Without Request Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġthis @ St s Oid c Client . username ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= Ġthis @ St s Oid c Client . password ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinstall ( Logging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger Ġ= ĠLogger . DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= ĠLogLevel . INFO ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġoid c Token : ĠO id c Token ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex () ĊĊĠĠĠ Ġprivate Ġval Ġst s Token Url : ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( sts BaseUrl . endsWith ("/ ")) Ġ"${ sts BaseUrl } rest / v 1 / sts / token /" Ġelse Ġ"$ sts BaseUrl / rest / v 1 / sts / token /" ĊĊĠĠĠ Ġoverride Ġfun Ġoid c Token (): ĠO id c Token Ġ= Ġrun Blocking Ġ{ Ġreturn @ run Blocking Ġget Oid c Token () Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Oid c Token (): ĠO id c Token Ġ{ ĊĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimer Ġ= Ġrequest Latency . start Timer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Oid c Token . isValid ( oidc Token )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoid c Token Ġ= Ġnew Oid c Token () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . observe Duration () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoid c Token !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġnew Oid c Token (): ĠO id c Token Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get < Oid c Token >( sts Token Url ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter (" grant _ type ", Ġ" client _ credentials ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter (" scope ", Ġ" openid ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. getOrElse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSt s Oid c ClientException ( it . localized Message , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSt s Oid c ClientException ( override Ġval Ġmessage : ĠString , Ġoverride Ġval Ġcause : ĠThrowable ) Ġ: ĊĠĠĠ ĠRuntimeException ( message , Ġcause ) Ċ Ċ data Ġclass ĠO id c Token ( ĊĠĠĠ Ġval Ġaccess _ token : ĠString , ĊĠĠĠ Ġval Ġtoken _ type : ĠString , ĊĠĠĠ Ġprivate Ġval Ġexpires _ in : ĠLong , ĊĠĠĠ Ġprivate Ġval Ġtime To Refresh : ĠLong Ġ= Ġ 6 0 Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġvalid : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠLocalDateTime . now () Ġ< Ġexpire Time ĊĠĠĠ Ġprivate Ġval Ġexpire Time : ĠLocalDateTime Ġ= ĊĠĠĠĠĠĠĠ ĠLocalDateTime . now (). plus ( Duration . of Seconds ( this . expires _ in Ġ- Ġtime To Refresh )) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠisValid ( token : ĠO id c Token ?) Ġ= Ġwhen Ġ( token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtoken . valid ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ