import Ġorg . w 3 c . dom . get Ċ import Ġorg . w 3 c . dom . set Ċ import Ġkotlin . browser . localStorage Ċ import Ġkotlin . js . Promise Ċ Ċ enum Ġclass ĠRole Ġ{ ĊĠĠĠ ĠST UD ENT , ĊĠĠĠ ĠTE AC HER , ĊĠĠĠ ĠADMIN Ċ } Ċ Ċ @ Js Name (" Key cloak ") Ċ open Ġexternal Ġclass ĠInternal Key cloak ( conf Url : ĠString Ġ= Ġdefined Ex tern ally ) Ġ{ ĊĠĠĠ Ġval Ġauthenticated : ĠBoolean ĊĠĠĠ Ġval Ġtoken : ĠString ĊĠĠĠ Ġval Ġtoken Parsed : Ġdynamic ĊĊĠĠĠ Ġvar Ġon Token Expired : Ġdynamic ĊĠĠĠ Ġvar Ġon Auth Refresh Success : Ġdynamic ĊĊĠĠĠ Ġfun Ġcreate Account Url (): ĠString ĊĠĠĠ Ġfun Ġcreate Logout Url ( options : Ġdynamic Ġ= Ġdefined Ex tern ally ): ĠString ĊĠĠĠ Ġprotected Ġfun Ġinit ( options : Ġdynamic ): Ġdynamic ĊĠĠĠ Ġprotected Ġfun Ġupdate Token ( min Valid Sec : ĠInt ): Ġdynamic Ċ } Ċ Ċ // ĠEx pose Ġkey cloak Ġinstance Ġvia Ġa Ġsingleton Ċ // ĠNote : ĠDo Ġnot Ġoverride Ġmethods Ġor Ġdefine Ġmethods Ġwith Ġsame Ġname , Ġjavascript Ġfree zes Ġbecause Ġjavascript Ċ object ĠAuth Ġ: ĠInternal Key cloak ( App Properties . KEY CLO AK _ CONF _ URL ) Ġ{ ĊĠĠĠ Ġval ĠfirstName : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . token Parsed . given _ name . unsafe Cast < String >() ĊĠĠĠ Ġval ĠlastName : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . token Parsed . family _ name . unsafe Cast < String >() ĊĠĠĠ Ġval Ġemail : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . token Parsed . email . unsafe Cast < String >() ĊĊĠĠĠ Ġlateinit Ġvar Ġactive Role : ĠRole ĊĊĠĠĠ Ġfun Ġis Student (): ĠBoolean Ġ= Ġthis . token Parsed . easy _ role . includes (" student "). unsafe Cast < Boolean >() ĊĠĠĠ Ġfun Ġis Teacher (): ĠBoolean Ġ= Ġthis . token Parsed . easy _ role . includes (" teacher "). unsafe Cast < Boolean >() ĊĠĠĠ Ġfun Ġis Admin (): ĠBoolean Ġ= Ġthis . token Parsed . easy _ role . includes (" admin "). unsafe Cast < Boolean >() ĊĊĠĠĠ Ġfun Ġcan Toggle Role (): ĠBoolean Ġ= Ġ( is Teacher () Ġ|| Ġis Admin ()) Ġ&& Ġis Student () ĊĊĠĠĠ Ġfun Ġis Main Role Active (): ĠBoolean Ġ= Ġget Main Role () Ġ== Ġactive Role ĊĠĠĠ Ġfun Ġis Student Active (): ĠBoolean Ġ= Ġactive Role Ġ== ĠRole . ST UD ENT ĊĠĠĠ Ġfun Ġis Teacher Active (): ĠBoolean Ġ= Ġactive Role Ġ== ĠRole . TE AC HER ĊĠĠĠ Ġfun Ġis Admin Active (): ĠBoolean Ġ= Ġactive Role Ġ== ĠRole . ADMIN ĊĊĠĠĠ Ġfun Ġswitch Role To Student () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Student ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ{ ĠStr . something W ent Wrong () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Role Ġchange Ġto Ġstudent Ġbut Ġuser Ġis Ġnot Ġstudent ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġactive Role Ġ= ĠRole . ST UD ENT ĊĠĠĠĠĠĠĠ ĠlocalStorage [" active Role "] Ġ= Ġ" student " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġswitch Role To Main () Ġ{ ĊĠĠĠĠĠĠĠ Ġactive Role Ġ= Ġget Main Role () ĊĠĠĠĠĠĠĠ ĠlocalStorage . removeItem (" active Role ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinitialize (): ĠPromise < Boolean > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPromise Ġ{ Ġresolve , Ġreject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init ( obj Of (" on Load " Ġto Ġ" login - required ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. success Ġ{ Ġauthenticated : ĠBoolean Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" Authenticated : Ġ$ authenticated " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Role Ġ= Ġget Pers isted Role () Ġ?: Ġget Main Role () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ( authenticated ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreject ( RuntimeException (" Authentication Ġerror ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġmake S ure Token IsValid (): ĠPromise < Boolean > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPromise Ġ{ Ġresolve , Ġreject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . update Token ( App Properties . KEY CLO AK _ TOKEN _ MIN _ VALID _ SEC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. success Ġ{ Ġref reshed : ĠBoolean Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ( ref reshed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. error Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarn Ġ{ Ġ" Authentication Ġerror : Ġ$ error " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreject ( RuntimeException (" Authentication Ġerror ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Pers isted Role (): ĠRole ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpersisted Role Str Ġ= ĠlocalStorage [" active Role "] ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpersisted Role Str Ġ== Ġ" student " Ġ&& Ġis Student () Ġ-> ĠRole . ST UD ENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Main Role (): ĠRole Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġis Admin () Ġ-> ĠRole . ADMIN ĊĠĠĠĠĠĠĠ Ġis Teacher () Ġ-> ĠRole . TE AC HER ĊĠĠĠĠĠĠĠ Ġis Student () Ġ-> ĠRole . ST UD ENT ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" No Ġvalid Ġroles Ġfound : Ġ${ this . token Parsed . easy _ role }") ĊĠĠĠ Ġ} Ċ } Ċ