package Ġorg . jetbrains . demo . think ter Ċ Ċ import Ġorg . jetbrains . demo . think ter . model .* Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . locations .* Ċ import Ġio . ktor . request .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . util .* Ċ import Ġjava . net .* Ċ import Ġjava . util . concurrent .* Ċ import Ġjavax . crypto .* Ċ import Ġjavax . crypto . spec .* Ċ Ċ val Ġhash Key Ġ= Ġhex (" 6 8 1 9 b 5 7 a 3 2 6 9 4 5 c 1 9 6 8 f 4 5 2 3 6 5 8 9 ") Ċ val Ġhmac Key Ġ= ĠSecret KeySpec ( hash Key , Ġ" H mac SHA 1 ") Ċ fun Ġhash ( password : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġhmac Ġ= ĠMac . getInstance (" H mac SHA 1 ") ĊĠĠĠ Ġhmac . init ( hmac Key ) ĊĠĠĠ Ġreturn Ġhex ( hmac . do Final ( password . toByteArray ( Charsets . UTF _ 8 ))) Ċ } Ċ Ċ fun ĠApplication Call . refer er Host () Ġ= Ġrequest . header ( HttpHeaders . Ref errer )?. let Ġ{ ĠURI . create ( it ). host Ġ} Ċ Ċ suspend Ġfun ĠApplication Call . redirect ( location : ĠAny ) Ġ{ ĊĠĠĠ Ġval Ġhost Ġ= Ġrequest . host () Ġ?: Ġ" localhost " ĊĠĠĠ Ġval Ġport Spec Ġ= Ġrequest . port (). let Ġ{ Ġif Ġ( it Ġ== Ġ 8 0 ) Ġ"" Ġelse Ġ": $ it " Ġ} ĊĠĠĠ Ġval Ġaddress Ġ= Ġhost Ġ+ Ġport Spec ĊĊĠĠĠ Ġrespond Redirect (" http :// $ address ${ application . feature ( Locations ). href ( location )} ") Ċ } Ċ Ċ fun ĠApplication Call . security Code ( date : ĠLong , Ġuser : ĠUser , Ġhash Function : Ġ( String ) Ġ-> ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġhash Function ("$ date :${ user . userId }:${ request . host ()} :${ refer er Host () }") Ċ Ċ fun ĠApplication Call . verify Code ( date : ĠLong , Ġuser : ĠUser , Ġcode : ĠString , Ġhash Function : Ġ( String ) Ġ-> ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġsecurity Code ( date , Ġuser , Ġhash Function ) Ġ== Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( System . currentTimeMillis () Ġ- Ġdate ). let Ġ{ Ġit Ġ> Ġ 0 Ġ&& Ġit Ġ< ĠTimeUnit . MILLISECONDS . convert ( 2 , ĠTimeUnit . HOUR S ) Ġ} ĊĊ Ċ private Ġval ĠuserId Pattern Ġ= Ġ"[ a - zA - Z 0 - 9 _. ]+ ". to Regex () Ċ internal Ġfun ĠuserName Valid ( userId : ĠString ) Ġ= ĠuserId . matches ( userId Pattern )