package Ġorg . jetbrains . ktor . tests . auth Ċ Ċ import Ġorg . apache . directory . api . ldap . util .* Ċ import Ġorg . apache . directory . server . annotations .* Ċ import Ġorg . apache . directory . server . core . inte g .* Ċ import Ġorg . apache . directory . server . core . inte g . Integration Utils .* Ċ import Ġorg . apache . directory . server . ldap .* Ċ import Ġorg . jetbrains . ktor . application .* Ċ import Ġorg . jetbrains . ktor . auth .* Ċ import Ġorg . jetbrains . ktor . auth . ldap .* Ċ import Ġorg . jetbrains . ktor . http .* Ċ import Ġorg . jetbrains . ktor . response .* Ċ import Ġorg . jetbrains . ktor . routing .* Ċ import Ġorg . jetbrains . ktor . testing .* Ċ import Ġorg . junit .* Ċ import Ġorg . junit . runner .* Ċ import Ġjava . net .* Ċ import Ġjava . util .* Ċ import Ġjavax . naming . directory .* Ċ import Ġjavax . naming . ldap .* Ċ import Ġkotlin . test .* Ċ Ċ @ RunWith ( Framework Runner :: class ) Ċ @ Create Ldap Server ( ĊĠĠĠĠĠĠĠ Ġtransport s Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCreate Transport ( protocol Ġ= Ġ" LDAP ") ĊĠĠĠĠĠĠĠ Ġ)) Ċ @ Ignore (" Ldap Auth Test Ġis Ġignored Ġbecause Ġit Ġis Ġvery Ġslow . ĠRun Ġit Ġexplicitly Ġwhen Ġyou Ġneed .") Ċ class ĠL dap Auth Test Ġ{ ĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnotice : Ġit Ġis Ġjust Ġa Ġtest : Ġnever Ġkeep Ġuser Ġpassword Ġbut Ġmessage Ġdigest Ġor Ġhash Ġwith Ġsalt ĊĠĠĠĠĠĠĠ Ġapply ( ldap Server . directory Service , ĠgetUser Add Ld if (" uid = user - test , ou = users , ou = system ", Ġ" test ". toByteArray (), Ġ" Test Ġuser ", Ġ" test ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Login ToServer () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . routing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbasic Authentication (" realm ") Ġ{ Ġcredential Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġldap Authenticate ( credential , Ġ" ldap :// $ localhost :${ ldap Server . port }", Ġ" uid =% s , ou = system ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text ( call . authentication . principal < UserId Principal >() ?. name Ġ?: Ġ" null ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Get , Ġ"/", Ġ{ Ġadd Header ( HttpHeaders . Authorization , Ġ" Basic Ġ" Ġ+ ĠBase 6 4 . get Encoder (). encode ToString (" admin : secret ". toByteArray ())) Ġ}). let Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result . request Handled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . OK , Ġresult . response . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" admin ", Ġresult . response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Get , Ġ"/", Ġ{ Ġadd Header ( HttpHeaders . Authorization , Ġ" Basic Ġ" Ġ+ ĠBase 6 4 . get Encoder (). encode ToString (" admin : bad - pass ". toByteArray ())) Ġ}). let Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result . request Handled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . Unauthorized , Ġresult . response . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Get , Ġ"/", Ġ{ Ġadd Header ( HttpHeaders . Authorization , Ġ" Basic Ġ" Ġ+ ĠBase 6 4 . get Encoder (). encode ToString (" bad - user : bad - pass ". toByteArray ())) Ġ}). let Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result . request Handled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . Unauthorized , Ġresult . response . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Custom Login () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . routing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġldap Url Ġ= Ġ" ldap :// $ localhost :${ ldap Server . port }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfigure : Ġ( Mutable Map < String , ĠAny ?> ) Ġ-> ĠUnit Ġ= Ġ{ Ġenv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenv . put (" java . naming . security . principal ", Ġ" uid = admin , ou = system ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenv . put (" java . naming . security . credentials ", Ġ" secret ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenv . put (" java . naming . security . authentication ", Ġ" simple ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbasic Authentication (" realm ") Ġ{ Ġcredential Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġldap Authenticate ( credential , Ġldap Url , Ġconfigure ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusers Ġ= Ġ( lookup (" ou = system ") Ġas ĠL dap Context ). lookup (" ou = users ") Ġas ĠL dap Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrols Ġ= ĠSearch Controls (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Scope Ġ= ĠSearch Controls . ONE LEVEL _ SCOPE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturning Attributes Ġ= ĠarrayOf ("+ ", Ġ"* ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers . search ("", Ġ"( uid = user - test )", Ġcontrols ). as Sequence (). first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġldap Password Ġ= Ġ( it . attributes . get (" user Password ") ?. get () Ġas ĠByteArray ?) ?. toString ( Charsets . ISO _ 8 8 5 9 _ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġldap Password Ġ== Ġcredential . password ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ ĠUserId Principal ( credential . name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text ( call . authentication . principal < UserId Principal >() ?. name Ġ?: Ġ" null ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Get , Ġ"/", Ġ{ Ġadd Header ( HttpHeaders . Authorization , Ġ" Basic Ġ" Ġ+ ĠBase 6 4 . get Encoder (). encode ToString (" user - test : test ". toByteArray ())) Ġ}). let Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result . request Handled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . OK , Ġresult . response . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" user - test ", Ġresult . response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Get , Ġ"/", Ġ{ Ġadd Header ( HttpHeaders . Authorization , Ġ" Basic Ġ" Ġ+ ĠBase 6 4 . get Encoder (). encode ToString (" user - test : bad - pass ". toByteArray ())) Ġ}). let Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result . request Handled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . Unauthorized , Ġresult . response . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Get , Ġ"/", Ġ{ Ġadd Header ( HttpHeaders . Authorization , Ġ" Basic Ġ" Ġ+ ĠBase 6 4 . get Encoder (). encode ToString (" bad - user : bad - pass ". toByteArray ())) Ġ}). let Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result . request Handled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . Unauthorized , Ġresult . response . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Ensure User () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenv Ġ= ĠHashtable < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġenv . put (" java . naming . factory . initial ", Ġ" com . sun . jn di . ldap . Ldap Ctx Factory ") ĊĠĠĠĠĠĠĠ Ġenv . put (" java . naming . provider . url ", Ġ" ldap :// $ localhost :${ ldap Server . port }") ĊĠĠĠĠĠĠĠ Ġenv . put (" java . naming . security . principal ", Ġ" uid = admin , ou = system ") ĊĠĠĠĠĠĠĠ Ġenv . put (" java . naming . security . credentials ", Ġ" secret ") ĊĠĠĠĠĠĠĠ Ġenv . put (" java . naming . security . authentication ", Ġ" simple ") ĊĊĠĠĠĠĠĠĠ Ġval Ġctx Ġ= Ġ( Initial Ldap Context ( env , ĠJ n di Utils . to Jn di Controls ( ldap Server . directory Service . ldap Codec Service )). lookup (" ou = system ") Ġas ĠL dap Context ). lookup (" ou = users ") Ġas ĠL dap Context ĊĊĠĠĠĠĠĠĠ Ġval Ġcontrols Ġ= ĠSearch Controls () ĊĠĠĠĠĠĠĠ Ġcontrols . search Scope Ġ= ĠSearch Controls . ONE LEVEL _ SCOPE ĊĠĠĠĠĠĠĠ Ġcontrols . return ing Attributes Ġ= ĠarrayOf ("+ ", Ġ"* ") ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġctx . search ("", Ġ"( Object Class = *) ", Ġcontrols ). toList () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf (" user - test "), Ġres . map Ġ{ Ġit . attributes . get (" uid "). get (). toString () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlocalhost : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInet Address . getLocal Host (). host Address ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( any : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 2 7 . 0 . 0 . 1 " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġldap Server : ĠL dap Server ĊĠĠĠ Ġ} Ċ } Ċ