/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 / 2 0 1 9 Ġe - voy age urs Ġtechnologies Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġai . to ck . bot . connector . teams . token Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . databind . Property Naming Strategy Ċ import Ġai . to ck . shared . Level Ċ import Ġai . to ck . shared . add Jack son Converter Ċ import Ġai . to ck . shared . create Ċ import Ġai . to ck . shared . jackson . mapper Ċ import Ġai . to ck . shared . long Property Ċ import Ġai . to ck . shared . ret rofit Builder WithTimeout And Logger Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . time . Instant Ċ import Ġjava . time . temporal . Ch rono Unit Ċ import Ġjava . util . Timer Ċ import Ġkotlin . concurrent . fixed Rate Timer Ċ Ċ /** Ċ Ġ* ĠHandle Ġthe Ġgeneration Ġand Ġthe Ġrefresh Ġof Ġthe Ġtoken Ġheader Ċ Ġ* ĠThis Ġtoken Ġis Ġmandatory Ġin Ġrequest Ġfrom Ġbot Ġto Ġteams Ġvia Ġm icrosoft - api Ċ Ġ*/ Ċ class ĠToken Handler ( private Ġval ĠappId : ĠString , Ġprivate Ġval Ġpassword : ĠString ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġtoken : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġtoken Expiration : ĠInstant ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġlog Level Ġ= Ġif Ġ( logger . isDebugEnabled ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLevel . BODY ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠLevel . BASIC ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġteams Mapper : ĠObjectMapper Ġ= Ġmapper . copy (). setProperty Naming Strategy ( Property Naming Strategy . S NA KE _ CASE ) ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtoken Timer Task : ĠTimer ĊĊĠĠĠ Ġvar Ġlogin Api : ĠLogin Microsoft Online Ġ= Ġretrofit Builder WithTimeout And Logger ( ĊĠĠĠĠĠĠĠ Ġlong Property (" to ck _ microsoft _ request _ timeout ", Ġ 3 0 0 0 0 ), ĊĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠ Ġlog Level ĊĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. baseUrl (" https :// login . microsoft online . com ") ĊĠĠĠĠĠĠĠ Ġ. add Jack son Converter ( teams Mapper ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠ Ġfun Ġcheck Token () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . token Ġ== Ġnull Ġ|| Ġis Token Expired ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Token () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Token Expired (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" IS ĠTOKEN ĠEX PI RED " Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Instant . now (). is After ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Expiration ?. minus ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCh rono Unit . SECONDS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Token () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġlogin Api . login ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠclientId Ġ= ĠappId , Ġclient Secret Ġ= Ġpassword ĊĠĠĠĠĠĠĠ Ġ). execute () ĊĠĠĠĠĠĠĠ Ġtoken Ġ= Ġresponse . body ()?. accessToken Ġ?: Ġerror (" empty Ġaccess Ġtoken ") ĊĠĠĠĠĠĠĠ Ġtoken Expiration Ġ= ĠInstant . now (). plus ( response . body ()?. expires In !! , ĠCh rono Unit . SECONDS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlaunch Token Collector ( connector Id : ĠString , Ġms Interval : ĠLong Ġ= Ġ 6 0 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 L ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtoken Timer Task Ġ= Ġfixed Rate Timer ( name Ġ= Ġ" microsoft - api - token - handling -$ connector Id ", Ġinitial Delay Ġ= Ġ 0 L , Ġperiod Ġ= Ġms Interval ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Token () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Token Collector () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(:: token Timer Task . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Timer Task . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Timer Task . purge () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Trying Ġto Ġstop Ġan Ġun initialized Ġtok ent im ert ask Ġ! ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ