/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 - present ĠRobert ĠJar os Ċ Ġ* Ċ Ġ* Ġ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 Ġio . k vision . remote Ċ Ċ import Ġkotlinx . coroutines . as Deferred Ċ import Ġkotlinx . serialization . Serializable Ċ Ċ /** Ċ Ġ* ĠA Ġsecurity Ġexception . Ċ Ġ*/ Ċ class ĠSecurity Exception ( message : ĠString ) Ġ: ĠException ( message ) Ċ Ċ /** Ċ Ġ* ĠUsername Ġand Ġpassword Ġcredentials . Ċ Ġ*/ Ċ @ Serializable Ċ data Ġclass ĠCredentials ( val Ġusername : ĠString ? Ġ= Ġnull , Ġval Ġpassword : ĠString ? Ġ= Ġnull ) Ċ Ċ /** Ċ Ġ* ĠForm Ġlogin Ġdispatcher . Ċ Ġ*/ Ċ class ĠLogin Service ( val Ġlogin Endpoint : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġlogin Agent Ġ= ĠCall Agent () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLogin Ġwith Ġa Ġform . ĊĠĠĠĠ Ġ* Ġ@ param Ġcredentials Ġusername Ġand Ġpassword Ġcredentials ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġlogin ( credentials : ĠCredentials ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( credentials ?. username Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Agent . remote Call ( login Endpoint , Ġobj Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . username Ġ= Ġcredentials . username ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . password Ġ= Ġcredentials . password ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠHttpMethod . POST , Ġ" application / x - www - form - urlencoded "). then Ġ{ Ġ_: Ġdynamic Ġ-> Ġtrue Ġ}. as Deferred (). await () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSecurity Exception (" Credentials Ġcannot Ġbe Ġempty ") ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠForm Ġlogin Ġdispatcher . Ċ Ġ*/ Ċ abstract Ġclass ĠSecurity Mgr Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġis LoggedIn Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExec utes Ġgiven Ġblock Ġof Ġcode Ġafter Ġsuccessful Ġauthentication . ĊĠĠĠĠ Ġ* Ġ@ param Ġblock Ġa Ġblock Ġof Ġcode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Nested Block Depth ", Ġ" Too Generic Exception Ca ught ") ĊĠĠĠ Ġsuspend Ġfun Ġ< T > Ġwith Auth ( block : Ġsuspend Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is LoggedIn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis LoggedIn Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Login () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠSecurity Exception Ġ|| Ġ! is LoggedIn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis LoggedIn Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! is LoggedIn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis LoggedIn Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Login () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLogin Ġuser . ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġlogin Ġis Ġsuccessful ĊĠĠĠĠ Ġ* Ġ@ throws ĠSecurity Exception Ġif Ġlogin Ġis Ġnot Ġsuccessful ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġlogin (): ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Ġcalled Ġafter Ġsuccessful Ġlogin . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġsuspend Ġfun Ġafter Login () Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Ġcalled Ġafter Ġerror . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġsuspend Ġfun Ġafter Error () Ġ{} Ċ } Ċ