1
+ package com.vauthenticator.server.mfa.adapter.jdbc
2
+
3
+ import com.vauthenticator.server.keys.domain.*
4
+ import com.vauthenticator.server.mfa.domain.MfaAccountMethod
5
+ import com.vauthenticator.server.mfa.domain.MfaAccountMethodsRepository
6
+ import com.vauthenticator.server.mfa.domain.MfaDeviceId
7
+ import com.vauthenticator.server.mfa.domain.MfaMethod
8
+ import org.springframework.jdbc.core.JdbcTemplate
9
+ import org.springframework.transaction.annotation.Transactional
10
+ import java.sql.ResultSet
11
+ import java.util.*
12
+
13
+ @Transactional
14
+ class JdbcMfaAccountMethodsRepository (
15
+ private val jdbcTemplate : JdbcTemplate ,
16
+ private val keyRepository : KeyRepository ,
17
+ private val masterKid : MasterKid ,
18
+ private val mfaDeviceIdGenerator : () -> MfaDeviceId
19
+ ) : MfaAccountMethodsRepository {
20
+ override fun findBy (userName : String , mfaMfaMethod : MfaMethod , mfaChannel : String ): Optional <MfaAccountMethod > =
21
+ Optional .ofNullable(
22
+ jdbcTemplate.query(
23
+ " SELECT * FROM MFA_ACCOUNT_METHODS WHERE user_name=? AND mfa_method=? AND mfa_channel=?" ,
24
+ { rs, _ -> mfaAccountMethodFrom(rs) },
25
+ userName, mfaMfaMethod.name, mfaChannel
26
+ ).firstOrNull()
27
+ )
28
+
29
+
30
+ override fun findBy (deviceId : MfaDeviceId ): Optional <MfaAccountMethod > =
31
+ Optional .ofNullable(
32
+ jdbcTemplate.query(
33
+ " SELECT * FROM MFA_ACCOUNT_METHODS WHERE mfa_device_id=?" ,
34
+ { rs, _ -> mfaAccountMethodFrom(rs) },
35
+ deviceId.content
36
+ ).firstOrNull()
37
+ )
38
+
39
+ override fun findAll (userName : String ): List <MfaAccountMethod > =
40
+ jdbcTemplate.query(" SELECT * FROM MFA_ACCOUNT_METHODS" )
41
+ { rs, _ -> mfaAccountMethodFrom(rs) }
42
+
43
+
44
+ override fun save (
45
+ userName : String ,
46
+ mfaMfaMethod : MfaMethod ,
47
+ mfaChannel : String ,
48
+ associated : Boolean
49
+ ): MfaAccountMethod {
50
+ val kid = keyRepository.createKeyFrom(masterKid, KeyType .SYMMETRIC , KeyPurpose .MFA )
51
+ val mfaDeviceId = mfaDeviceIdGenerator.invoke()
52
+
53
+ jdbcTemplate.update(
54
+ " INSERT INTO MFA_ACCOUNT_METHODS (user_name, mfa_device_id, mfa_method, mfa_channel, key_id, associated) VALUES (?,?,?,?,?,?)" ,
55
+ userName, mfaDeviceId.content, mfaMfaMethod.name, mfaChannel, kid.content(), associated
56
+ )
57
+
58
+ return MfaAccountMethod (userName, mfaDeviceId, kid, mfaMfaMethod, mfaChannel, associated)
59
+ }
60
+
61
+
62
+ override fun setAsDefault (userName : String , deviceId : MfaDeviceId ) {
63
+ Optional .ofNullable(
64
+ jdbcTemplate.query(
65
+ " SELECT mfa_device_id FROM MFA_ACCOUNT_METHODS WHERE user_name=? AND default_mfa_method=true" ,
66
+ { rs, _ -> MfaDeviceId (rs.getString(" mfa_device_id" )) },
67
+ userName
68
+ ).firstOrNull()
69
+ ).ifPresent {
70
+ jdbcTemplate.update(
71
+ " UPDATE MFA_ACCOUNT_METHODS SET default_mfa_method = false WHERE user_name=? AND mfa_device_id=?" ,
72
+ userName, it.content
73
+ )
74
+ }
75
+
76
+ jdbcTemplate.update(
77
+ " UPDATE MFA_ACCOUNT_METHODS SET default_mfa_method = true WHERE user_name=? AND mfa_device_id=?" ,
78
+ userName, deviceId.content
79
+ )
80
+ }
81
+
82
+ override fun getDefaultDevice (userName : String ): Optional <MfaDeviceId > =
83
+ Optional .ofNullable(
84
+ jdbcTemplate.query(
85
+ " SELECT mfa_device_id FROM MFA_ACCOUNT_METHODS WHERE user_name=? AND default_mfa_method=true" ,
86
+ { rs, _ -> MfaDeviceId (rs.getString(" mfa_device_id" )) },
87
+ userName
88
+ ).firstOrNull()
89
+ )
90
+
91
+ private fun mfaAccountMethodFrom (rs : ResultSet ) = MfaAccountMethod (
92
+ userName = rs.getString(" user_name" ),
93
+ mfaDeviceId = MfaDeviceId (rs.getString(" mfa_device_id" )),
94
+ key = Kid (rs.getString(" key_id" )),
95
+ mfaMethod = MfaMethod .valueOf(rs.getString(" mfa_method" )),
96
+ mfaChannel = rs.getString(" mfa_channel" ),
97
+ associated = rs.getBoolean(" associated" ),
98
+ )
99
+
100
+ }
0 commit comments