package Ġweb auth n kit . example Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . widget . EditText Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . j ared rum ml er . material spinner . Material Spinner Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . jetbrains . ank o .* Ċ import Ġweb auth n kit . core . data .* Ċ import Ġweb auth n kit . core . auth enticator . internal . ui . User Consent UI Ċ import Ġweb auth n kit . core . auth enticator . internal . ui . User Consent UI Factory Ċ import Ġweb auth n kit . core . client . Web Auth n Client Ċ import Ġweb auth n kit . core . util . ByteArray Util Ċ import Ġweb auth n kit . core . util . W AK Logger Ċ Ċ @ Experimental Cor outines Api Ċ @ Experimental Unsigned Types Ċ class ĠAuthentication Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠAuthentication Activity :: class . simple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġrelying Party Field : ĠĠĠĠ ĠEditText ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġchallenge Field : ĠĠĠĠĠĠĠ ĠEditText ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġcred Id Field : ĠĠĠĠĠĠĠĠĠĠ ĠEditText ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġuser Verification Spinner : ĠMaterial Spinner ? Ġ= Ġnull ĊĠĠĠ Ġval Ġuser Verification Options Ġ= ĠlistOf (" Required ", Ġ" Preferred ", Ġ" Dis cour aged ") ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠW AK Logger . d ( TAG , Ġ" onCreate ") ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" AUTHENT ICATION " ĊĊĠĠĠĠĠĠĠ Ġvertical Layout Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Ġ= Ġdip ( 1 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" R ely ing ĠParty " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelying Party Field Ġ= Ġedit Text Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Line Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelying Party Field !!. setText (" https :// example . org ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" Challenge Ġ( Hex )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchallenge Field Ġ= Ġedit Text Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Line Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchallenge Field !!. setText (" aed 9 c 7 8 9 5 4 3 b ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" Credential ĠId Ġ( Hex ) Ġ( Optional )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcred Id Field Ġ= Ġedit Text Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Line Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcred Id Field !!. setText ("") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspinner Width Ġ= Ġ 1 6 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelative Layout Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl params Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġmatch Parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġwrap Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmargin Ġ= Ġdip ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbackgroundColor Ġ= ĠColor . parse Color ("# eeee ee ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Ġ= Ġdip ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" UV " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. l params Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġwrap Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġwrap Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmargin Ġ= Ġdip ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalign Parent Left () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Vert ically () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Verification Spinner Ġ= Ġmaterial Spinner Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Ġ= Ġdip ( 1 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl params Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġdip ( spinner Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġwrap Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmargin Ġ= Ġdip ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalign Parent Right () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Vert ically () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Verification Spinner !!. set Items ( user Verification Options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonStart Clicked () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġrelying Party = Ġrelying Party Field !!. text . toString () ĊĠĠĠĠĠĠĠ Ġval Ġcred Id ĠĠĠĠĠ Ġ= Ġcred Id Field !!. text . toString () ĊĠĠĠĠĠĠĠ Ġval Ġchallenge ĠĠ Ġ= Ġchallenge Field !!. text . toString () ĊĊĠĠĠĠĠĠĠ Ġval Ġuser Verification Ġ Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( user Verification Options [ user Verification Spinner !!. selectedIndex ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Required " ĠĠĠ Ġ-> Ġ{ ĠUser Verification Requirement . Required ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Preferred " ĠĠ Ġ-> Ġ{ ĠUser Verification Requirement . Preferred ĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Dis cour aged " Ġ-> Ġ{ ĠUser Verification Requirement . Dis cour aged Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĠUser Verification Requirement . Preferred ĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Execute ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelying Party ĠĠĠĠ Ġ= Ġrelying Party , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchallenge ĠĠĠĠĠĠĠ Ġ= Ġchallenge , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcred Id ĠĠĠĠĠĠĠĠĠĠ Ġ= Ġcred Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Verification Ġ= Ġuser Verification ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Web Auth n Client (): ĠWeb Auth n Client Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġconsent UI Ġ= ĠUser Consent UI Factory . create ( this ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠWeb Auth n Client . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĠĠ Ġ= Ġ" https :// example . org ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui ĠĠĠĠĠĠ Ġ= Ġconsent UI !! ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠW AK Logger . d ( TAG , Ġ" on Activity Result ") ĊĠĠĠĠĠĠĠ Ġconsent UI ?. on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġif Ġ( consent UI Ġ!= Ġnull Ġ&& Ġconsent UI !!. on Activity Result ( request Code , ĠresultCode , Ġdata )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ ĠW AK Logger . d ( TAG , Ġ" onStart ") ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ ĠW AK Logger . d ( TAG , Ġ" on Stop ") ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . authentication _ activity _ menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== ĠR . id . web auth n _ authentication _ start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonStart Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġconsent UI : ĠUser Consent UI ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġweb Auth n Client : ĠWeb Auth n Client ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġon Execute ( re lying Party : ĠString , Ġchallenge : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcred Id : ĠString , Ġuser Verification : ĠUser Verification Requirement ) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠW AK Logger . d ( TAG , Ġ" on Execute ") ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠPublicKey Credential RequestOptions () ĊĠĠĠĠĠĠĠ Ġoptions . challenge ĠĠĠĠĠĠĠ Ġ= ĠByteArray Util . from Hex ( challenge ) ĊĠĠĠĠĠĠĠ Ġoptions . rp Id ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġrelying Party ĊĠĠĠĠĠĠĠ Ġoptions . user Verification Ġ= Ġuser Verification ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cred Id . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . add Allow Credential ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredential Id Ġ= ĠByteArray Util . from Hex ( cred Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport s ĠĠ Ġ= Ġmutable ListOf ( Authenticator Transport . Internal )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġweb Auth n Client Ġ= Ġcreate Web Auth n Client () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcred Ġ= Ġweb Auth n Client !!. get ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW AK Logger . d ( TAG , Ġ" CH ALL EN GE :" Ġ+ ĠByteArray Util . encode Base 6 4 URL ( options . challenge )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Result Activity ( cred ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠW AK Logger . w ( TAG , Ġ" failed Ġto Ġget ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Popup ( e . toString ()) ĊĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsent UI Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Error Popup ( msg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( msg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Result Activity ( cred : ĠGet Assertion Response ) Ġ{ ĊĠĠĠĠĠĠĠ ĠW AK Logger . d ( TAG , Ġ" show Ġresult Ġactivity ") ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠAuthentication Result Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" CRED _ ID ", Ġcred . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" CRED _ RAW ", ĠByteArray Util . to Hex ( cred . raw Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" CLIENT _ JSON ", Ġcred . response . client Data JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" AUTHENT IC ATOR _ DATA ", ĠByteArray Util . encode Base 6 4 URL ( cred . response . auth enticator Data )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" SIGNATURE ", ĠByteArray Util . encode Base 6 4 URL ( cred . response . signature )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" USER _ HANDLE ", ĠByteArray Util . encode Base 6 4 URL ( cred . response . user Handle !! )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW AK Logger . d ( TAG , Ġ" start Ġactivity ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ