package Ġuk . gov . just ice . digital . h mp ps . oauth 2 server . auth . model Ċ Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġorg . hibernate . annotations . Generic Generator Ċ import Ġorg . hibernate . annotations . Type Ċ import Ġorg . springframework . security . core . Credentials Container Ċ import Ġuk . gov . just ice . digital . h mp ps . oauth 2 server . security . Auth Source Ċ import Ġuk . gov . just ice . digital . h mp ps . oauth 2 server . security . User Person Details Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . Optional Ċ import Ġjava . util . UUID Ċ import Ġjavax . persistence . Cascade Type Ċ import Ġjavax . persistence . Collection Table Ċ import Ġjavax . persistence . Column Ċ import Ġjavax . persistence . Element Collection Ċ import Ġjavax . persistence . Embedded Ċ import Ġjavax . persistence . Entity Ċ import Ġjavax . persistence . Enum Type Ċ import Ġjavax . persistence . Enumer ated Ċ import Ġjavax . persistence . Fetch Type Ċ import Ġjavax . persistence . GeneratedValue Ċ import Ġjavax . persistence . Id Ċ import Ġjavax . persistence . JoinColumn Ċ import Ġjavax . persistence . Join Table Ċ import Ġjavax . persistence . OneToMany Ċ import Ġjavax . persistence . Table Ċ import Ġjavax . persistence . Transient Ċ Ċ @ Entity Ċ @ Table ( name Ġ= Ġ" USERS ") Ċ class ĠUser ( ĊĠ Ġ@ Column ( name Ġ= Ġ" username ", Ġnullable Ġ= Ġfalse ) ĊĠ Ġprivate Ġvar Ġusername : ĠString , ĊĊĠ Ġ@ Embedded ĊĠ Ġvar Ġperson : ĠPerson ? Ġ= Ġnull , ĊĊĠ Ġ@ Column ( name Ġ= Ġ" email ") ĊĠ Ġvar Ġemail : ĠString ? Ġ= Ġnull , ĊĊĠ Ġ@ Column ( name Ġ= Ġ" verified ", Ġnullable Ġ= Ġfalse ) ĊĠ Ġvar Ġverified : ĠBoolean Ġ= Ġfalse , ĊĊĠ Ġ@ Column ( name Ġ= Ġ" enabled ", Ġnullable Ġ= Ġfalse ) ĊĠ Ġprivate Ġvar Ġenabled : ĠBoolean Ġ= Ġfalse , ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSource Ġof Ġlast Ġlogin Ġinformation ĊĠĠ Ġ*/ ĊĠ Ġ@ Column ( name Ġ= Ġ" source ", Ġnullable Ġ= Ġfalse ) ĊĠ Ġ@ Enumer ated ( Enum Type . STRING ) ĊĠ Ġvar Ġsource : ĠAuth Source , ĊĊĠ Ġauthor ities : ĠSet < Authority > Ġ= Ġempty Set (), ĊĊĠ Ġgroups : ĠSet < Group > Ġ= Ġempty Set (), Ċ Ċ ) Ġ: ĠUser Person Details , ĠCredentials Container Ġ{ ĊĠ Ġ@ Id ĊĠ Ġ@ GeneratedValue ( generator Ġ= Ġ" UUID ") ĊĠ Ġ@ Generic Generator ( name Ġ= Ġ" UUID ", Ġstrategy Ġ= Ġ" org . hibernate . id . UUID Generator ") ĊĠ Ġ@ Column ( name Ġ= Ġ" user _ id ", Ġup datable Ġ= Ġfalse , Ġnullable Ġ= Ġfalse ) ĊĠ Ġ@ Type ( type Ġ= Ġ" uuid - char ") ĊĠ Ġvar Ġid : ĠUUID ? Ġ= Ġnull ĊĊĠ Ġ@ Column ( name Ġ= Ġ" password ") ĊĠ Ġprivate Ġvar Ġpassword : ĠString ? Ġ= Ġnull ĊĊĠ Ġ@ OneToMany ( fetch Ġ= ĠFetch Type . E AGER ) ĊĠ Ġ@ Join Table ( ĊĠĠĠ Ġname Ġ= Ġ" user _ role ", ĊĠĠĠ Ġjoin Columns Ġ= Ġ[ JoinColumn ( name Ġ= Ġ" user _ id ") ], ĊĠĠĠ Ġinverse Join Columns Ġ= Ġ[ JoinColumn ( name Ġ= Ġ" role _ id ")] ĊĠ Ġ) ĊĠ Ġprivate Ġval Ġauthor ities : ĠMutable Set < Authority > Ġ= Ġauthor ities . to Mutable Set () ĊĊĠ Ġ@ OneToMany ĊĠ Ġ@ Join Table ( ĊĠĠĠ Ġname Ġ= Ġ" user _ group ", ĊĠĠĠ Ġjoin Columns Ġ= Ġ[ JoinColumn ( name Ġ= Ġ" user _ id ") ], ĊĠĠĠ Ġinverse Join Columns Ġ= Ġ[ JoinColumn ( name Ġ= Ġ" group _ id ")] ĊĠ Ġ) ĊĠ Ġval Ġgroups : ĠMutable Set < Group > Ġ= Ġgroups . to Mutable Set () ĊĊĠ Ġ@ Column ( name Ġ= Ġ" locked ", Ġnullable Ġ= Ġfalse ) ĊĠ Ġvar Ġlocked Ġ= Ġfalse ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠUsed Ġfor ĠNO MIS Ġaccounts Ġto Ġforce Ġchange Ġpassword Ġso Ġthat Ġthey Ġdon 't Ġget Ġlocked Ġout Ġdue Ġto Ġnot Ġchanging Ġpassword ĊĠĠ Ġ*/ ĊĠ Ġ@ Column ( name Ġ= Ġ" password _ expiry ") ĊĠ Ġvar Ġpassword Expiry : ĠLocalDateTime Ġ= ĠLocalDateTime . now () ĊĊĠ Ġ@ Column ( name Ġ= Ġ" last _ logged _ in ") ĊĠ Ġvar Ġlast LoggedIn : ĠLocalDateTime Ġ= ĠLocalDateTime . now () ĊĊĠ Ġ@ Column ( name Ġ= Ġ" m fa _ preference ") ĊĠ Ġ@ Enumer ated ( Enum Type . STRING ) ĊĠ Ġvar Ġm fa Preference Ġ= ĠM fa Preference Type . EMAIL ĊĊĠ Ġ@ Element Collection ĊĠ Ġ@ Collection Table ( name Ġ= Ġ" USER _ CONTACT ", Ġjoin Columns Ġ= Ġ[ JoinColumn ( name Ġ= Ġ" user _ id ") ]) ĊĠ Ġval Ġcontacts : ĠMutable Set < Contact > Ġ= Ġmutable Set Of () ĊĊĠ Ġ@ OneToMany ( mapped By Ġ= Ġ" user ", Ġcascade Ġ= Ġ[ Cascade Type . ALL ], Ġorphan Removal Ġ= Ġtrue ) ĊĠ Ġval Ġtokens : ĠMutable Set < User Token > Ġ= Ġmutable Set Of () ĊĊĠ Ġoverride Ġfun Ġerase Credentials () Ġ{ ĊĠĠĠ Ġpassword Ġ= Ġnull ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġis Account Non Expired (): ĠBoolean Ġ= Ġtrue ĊĊĠ Ġoverride Ġfun Ġis Account Non Locked (): ĠBoolean Ġ= Ġ! locked ĊĊĠ Ġoverride Ġfun Ġis Credentials Non Expired (): ĠBoolean Ġ= Ġpassword Expiry . is After ( LocalDateTime . now ()) ĊĊĠ Ġoverride Ġval Ġname : ĠString ĊĠĠĠ Ġget () Ġ= Ġperson ?. name Ġ?: Ġusername ĊĊĠ Ġoverride Ġval ĠfirstName : ĠString ĊĠĠĠ Ġget () Ġ= Ġperson ?. firstName Ġ?: Ġusername ĊĊĠ Ġ@ Transient ĊĠ Ġoverride Ġval Ġis Admin : ĠBoolean Ġ= Ġfalse ĊĊĠ Ġoverride Ġval Ġauth Source : ĠString ĊĠĠĠ Ġget () Ġ= Ġsource . toString () ĊĊĠ Ġoverride Ġfun Ġto User (): ĠUser Ġ= Ġthis ĊĊĠ Ġoverride Ġval ĠuserId : ĠString ĊĠĠĠ Ġget () Ġ= Ġid . toString () ĊĊĠ Ġfun Ġcreate Token ( token Type : ĠUser Token . TokenType ): ĠUser Token Ġ{ ĊĠĠĠ Ġval Ġoptional Token Ġ= Ġtokens . stream (). filter Ġ{ Ġt : ĠUser Token Ġ-> Ġt . token Type Ġ=== Ġtoken Type Ġ}. findFirst () ĊĠĠĠ Ġval Ġtoken : ĠUser Token ĊĠĠĠ Ġif Ġ( optional Token . isPresent ) Ġ{ ĊĠĠĠĠĠ Ġtoken Ġ= Ġoptional Token . get () ĊĠĠĠĠĠ Ġtoken . reset Expiry () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġtoken Ġ= ĠUser Token ( token Type , Ġthis ) ĊĠĠĠĠĠ Ġtokens . add ( token ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtoken ĊĠ Ġ} ĊĊĠ Ġfun Ġremove Token ( user Token : ĠUser Token ) Ġ{ ĊĠĠĠ Ġtokens . remove ( user Token ) ĊĠ Ġ} ĊĊĠ Ġval Ġis Master : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġsource Ġ=== ĠAuth Source . auth ĊĠ Ġval Ġmasked Mobile : ĠString ĊĠĠĠ Ġget () Ġ= Ġ" ******* " Ġ+ Ġmobile !!. substring ( 7 ) ĊĠ Ġval Ġmasked Email : ĠString ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġval Ġemail Characters Ġ= ĠStringUtils . substring Before ( email , Ġ"@ "). length ĊĠĠĠĠĠ Ġval Ġemail Characters Reduc ed Ġ= ĠMath . min ( email Characters Ġ/ Ġ 2 , Ġ 6 ) ĊĠĠĠĠĠ Ġreturn Ġemail !!. substring ( 0 , Ġemail Characters Reduc ed ) Ġ+ Ġ" ****** @ ****** " Ġ+ Ġemail !!. substring ( email !!. length Ġ- Ġ 7 ) ĊĠĠĠ Ġ} ĊĠ Ġval Ġmasked Secondary Email : ĠString ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġval Ġemail Characters Ġ= ĠStringUtils . substring Before ( secondary Email , Ġ"@ "). length ĊĠĠĠĠĠ Ġval Ġemail Characters Reduc ed Ġ= ĠMath . min ( email Characters Ġ/ Ġ 2 , Ġ 6 ) ĊĠĠĠĠĠ Ġreturn Ġsecondary Email !!. substring ( 0 , Ġemail Characters Reduc ed ) Ġ+ Ġ" ****** @ ****** " Ġ+ Ġsecondary Email !!. substring ( ĊĠĠĠĠĠĠĠ Ġsecondary Email !!. length Ġ- Ġ 7 ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġm fa Preference Verified (): ĠBoolean Ġ= ĊĠĠĠ Ġm fa Preference Text Verified () Ġ|| Ġm fa Preference Email Verified () Ġ|| Ġm fa Preference Secondary Email Verified () ĊĊĠ Ġfun Ġm fa Preference Text Verified (): ĠBoolean Ġ= Ġm fa Preference Ġ== ĠM fa Preference Type . TEXT Ġ&& Ġis Mobile Verified ĊĊĠ Ġfun Ġm fa Preference Email Verified (): ĠBoolean Ġ= Ġm fa Preference Ġ== ĠM fa Preference Type . EMAIL Ġ&& Ġverified ĊĊĠ Ġfun Ġm fa Preference Secondary Email Verified (): ĠBoolean Ġ= ĊĠĠĠ Ġm fa Preference Ġ== ĠM fa Preference Type . SECOND ARY _ EMAIL Ġ&& Ġis Secondary Email Verified ĊĊĠ Ġoverride Ġfun Ġget Username (): ĠString Ġ= Ġusername ĊĊĠ Ġfun Ġset Username ( username : ĠString ) Ġ{ ĊĠĠĠ Ġthis . username Ġ= Ġusername . toUpperCase () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Password (): ĠString ? Ġ= Ġpassword ĊĊĠ Ġoverride Ġfun Ġis Enabled (): ĠBoolean Ġ= Ġenabled ĊĊĠ Ġval Ġmobile : ĠString ? ĊĠĠĠ Ġget () Ġ= Ġget Contact Value ( Contact Type . MOB ILE _ PHONE ) ĊĠ Ġval Ġis Mobile Verified : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġis Contact Verified ( Contact Type . MOB ILE _ PHONE ) ĊĊĠ Ġfun Ġadd Contact ( type : ĠContact Type ?, Ġvalue : ĠString ?): ĠContact Ġ{ ĊĠĠĠ Ġval Ġcontact Ġ= ĠContact ( ĊĠĠĠĠĠ Ġtype !! , ĊĠĠĠĠĠ Ġvalue !! , ĊĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ) ĊĠĠĠ Ġ// Ġequals Ġand Ġhash code Ġby Ġcontact Ġtype Ġso Ġremove Ġwill Ġremove Ġany Ġcontact Ġof Ġsame Ġtype ĊĠĠĠ Ġcontacts . remove ( contact ) ĊĠĠĠ Ġcontacts . add ( contact ) ĊĠĠĠ Ġreturn Ġcontact ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis Contact Verified ( mobile Phone : ĠContact Type ): ĠBoolean Ġ= ĊĠĠĠ Ġfind Contact ( mobile Phone ). map ( Contact :: verified ). orElse ( false ) ĊĊĠ Ġprivate Ġfun Ġget Contact Value ( mobile Phone : ĠContact Type ): ĠString ? Ġ= ĊĠĠĠ Ġfind Contact ( mobile Phone ). map ( Contact :: value ). orElse ( null ) ĊĊĠ Ġval Ġsecondary Email : ĠString ? ĊĠĠĠ Ġget () Ġ= Ġget Contact Value ( Contact Type . SECOND ARY _ EMAIL ) ĊĠ Ġval Ġis Secondary Email Verified : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġis Contact Verified ( Contact Type . SECOND ARY _ EMAIL ) ĊĊĠ Ġfun Ġfind Contact ( type : ĠContact Type ): ĠOptional < Contact > Ġ{ ĊĠĠĠ Ġreturn Ġcontacts . stream () ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġ( type 1 ) Ġ-> Ġtype 1 Ġ=== Ġtype Ġ} ĊĠĠĠĠĠ Ġ. findFirst () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Author ities (): ĠMutable Set < Authority > Ġ= Ġauthor ities ĊĊĠ Ġfun Ġset Password ( password : ĠString ?) Ġ{ ĊĠĠĠ Ġthis . password Ġ= Ġpassword ĊĠ Ġ} ĊĊĠ Ġfun Ġset Enabled ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠ Ġthis . enabled Ġ= Ġenabled ĊĠ Ġ} ĊĊĠ Ġfun Ġhas Verified M fa Method (): ĠBoolean Ġ= Ġ! allowed M fa Preferences . isEmpty () ĊĊĠ Ġfun Ġcalculate M fa From Preference (): ĠOptional < M fa Preference Type > Ġ{ ĊĠĠĠ Ġval Ġpreferences Ġ= Ġallowed M fa Preferences ĊĠĠĠ Ġreturn Ġif Ġ( preferences . contains ( m fa Preference )) ĠOptional . of ( m fa Preference ) Ġelse Ġpreferences . stream (). findFirst () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠ Ġ" User ( username ='$ username ', Ġperson =$ person , Ġemail =$ email , Ġverified =$ verified , Ġenabled =$ enabled , Ġsource =$ source , Ġid =$ id , Ġlocked =$ locked , Ġpassword Expiry =$ password Expiry , Ġlast LoggedIn =$ last LoggedIn , Ġm fa Preference =$ m fa Preference )" ĊĊĠ Ġfun Ġget Code Destination ( m fa Preference : ĠM fa Preference Type ): ĠString Ġ= ĊĠĠĠ Ġwhen Ġ( m fa Preference ) Ġ{ ĊĠĠĠĠĠ ĠM fa Preference Type . EMAIL Ġ-> Ġmasked Email ĊĠĠĠĠĠ ĠM fa Preference Type . TEXT Ġ-> Ġmasked Mobile ĊĠĠĠĠĠ ĠM fa Preference Type . SECOND ARY _ EMAIL Ġ-> Ġmasked Secondary Email ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġval Ġallowed M fa Preferences : ĠList < M fa Preference Type > ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġval Ġpreferences Ġ= ĠArrayList < M fa Preference Type >() ĊĠĠĠĠĠ Ġif Ġ( StringUtils . isNotEmpty ( email ) Ġ&& Ġverified ) Ġpreferences . add ( M fa Preference Type . EMAIL ) ĊĠĠĠĠĠ Ġfind Contact ( Contact Type . MOB ILE _ PHONE ) ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġc : ĠContact Ġ-> ĠStringUtils . isNotBlank ( c . value ) Ġ&& Ġc . verified Ġ} ĊĠĠĠĠĠĠĠ Ġ. if Present Ġ{ Ġc : ĠContact ? Ġ-> Ġpreferences . add ( M fa Preference Type . TEXT ) Ġ} ĊĠĠĠĠĠ Ġfind Contact ( Contact Type . SECOND ARY _ EMAIL ) ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġc : ĠContact Ġ-> ĠStringUtils . isNotBlank ( c . value ) Ġ&& Ġc . verified Ġ} ĊĠĠĠĠĠĠĠ Ġ. if Present Ġ{ Ġc : ĠContact ? Ġ-> Ġpreferences . add ( M fa Preference Type . SECOND ARY _ EMAIL ) Ġ} ĊĠĠĠĠĠ Ġreturn Ġpreferences ĊĠĠĠ Ġ} ĊĊĠ Ġenum Ġclass ĠM fa Preference Type ( val Ġdescription : ĠString ) Ġ{ ĊĠĠĠ ĠE MAIL (" email "), ĊĠĠĠ ĠTEXT (" text "), ĊĠĠĠ ĠSE COND ARY _ EMAIL (" secondary Ġemail "); ĊĠ Ġ} ĊĊĠ Ġenum Ġclass ĠEmail Type ( val Ġdescription : ĠString ) Ġ{ ĊĠĠĠ ĠPRIMARY (" primary "), ĊĠĠĠ ĠSE COND ARY (" secondary "); ĊĠ Ġ} Ċ } Ċ