Skip to content

Commit

Permalink
use mfa enrolment api in the send email verification challenge
Browse files Browse the repository at this point in the history
  • Loading branch information
mrFlick72 committed Jul 20, 2024
1 parent 7041b09 commit 0c85ac2
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,17 @@ package com.vauthenticator.server.account.emailverification
import com.vauthenticator.server.account.AccountNotFoundException
import com.vauthenticator.server.account.repository.AccountRepository
import com.vauthenticator.server.email.EMailSenderService
import com.vauthenticator.server.mfa.domain.MfaMethod
import com.vauthenticator.server.mfa.domain.MfaMethodsEnrollment
import com.vauthenticator.server.mfa.domain.VerificationTicket
import com.vauthenticator.server.mfa.domain.VerificationTicketFactory
import com.vauthenticator.server.oauth2.clientapp.ClientAppId
import org.slf4j.LoggerFactory

private const val LINK_KEY = "verificationEMailLink"

class SendVerifyEMailChallenge(
private val accountRepository: AccountRepository,
private val verificationTicketFactory: VerificationTicketFactory,
private val mfaMethodsEnrollment: MfaMethodsEnrollment,
private val mailVerificationMailSender: EMailSenderService,
private val frontChannelBaseUrl: String
) {
Expand All @@ -22,7 +23,8 @@ class SendVerifyEMailChallenge(
fun sendVerifyMail(email: String) {
accountRepository.accountFor(email)
.map { account ->
val verificationTicket = verificationTicketFactory.createTicketFor(account, ClientAppId.empty())
val verificationTicket =
mfaMethodsEnrollment.enroll(account, MfaMethod.EMAIL_MFA_METHOD, ClientAppId.empty(), false)
val mailContext = mailContextFrom(verificationTicket)
mailVerificationMailSender.sendFor(account, mailContext)
}.orElseThrow {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import com.vauthenticator.server.account.emailverification.SendVerifyEMailChalle
import com.vauthenticator.server.account.emailverification.VerifyEMailChallenge
import com.vauthenticator.server.account.repository.AccountRepository
import com.vauthenticator.server.email.*
import com.vauthenticator.server.mfa.domain.MfaMethodsEnrollment
import com.vauthenticator.server.mfa.domain.MfaMethodsEnrollmentAssociation
import com.vauthenticator.server.mfa.domain.VerificationTicketFactory
import com.vauthenticator.server.mfa.repository.TicketRepository
import com.vauthenticator.server.oauth2.clientapp.ClientApplicationRepository
import org.springframework.beans.factory.annotation.Value
Expand All @@ -23,13 +23,13 @@ class EMailVerificationConfig {
fun sendVerifyMailChallenge(
clientAccountRepository: ClientApplicationRepository,
accountRepository: AccountRepository,
verificationTicketFactory: VerificationTicketFactory,
mfaMethodsEnrollment: MfaMethodsEnrollment,
verificationMailSender: EMailSenderService,
@Value("\${vauthenticator.host}") frontChannelBaseUrl: String
) =
SendVerifyEMailChallenge(
accountRepository,
verificationTicketFactory,
mfaMethodsEnrollment,
verificationMailSender,
frontChannelBaseUrl
)
Expand Down
15 changes: 12 additions & 3 deletions src/main/kotlin/com/vauthenticator/server/mfa/MfaConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,17 @@ class MfaConfig {
fun sensitiveEmailMasker() = SensitiveEmailMasker()

@Bean
fun mfaMethodsEnrolmentAssociation(ticketRepository: TicketRepository,
mfaAccountMethodsRepository: MfaAccountMethodsRepository) =
MfaMethodsEnrollmentAssociation(ticketRepository , mfaAccountMethodsRepository)
fun mfaMethodsEnrolmentAssociation(
ticketRepository: TicketRepository,
mfaAccountMethodsRepository: MfaAccountMethodsRepository
) =
MfaMethodsEnrollmentAssociation(ticketRepository, mfaAccountMethodsRepository)

@Bean
fun mfaMethodsEnrollment(
verificationTicketFactory: VerificationTicketFactory,
mfaAccountMethodsRepository: MfaAccountMethodsRepository
) = MfaMethodsEnrollment(verificationTicketFactory, mfaAccountMethodsRepository)

@Bean
fun otpMfa(
Expand Down Expand Up @@ -87,5 +95,6 @@ class MfaConfig {
)
)
}

@ConfigurationProperties("mfa.otp")
data class OtpConfigurationProperties(val length: Int, val timeToLiveInSeconds: Int)
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.vauthenticator.server.mfa.domain
import com.vauthenticator.server.account.Account
import com.vauthenticator.server.mfa.repository.MfaAccountMethodsRepository
import com.vauthenticator.server.mfa.repository.TicketRepository
import com.vauthenticator.server.oauth2.clientapp.ClientAppId

class MfaMethodsEnrollmentAssociation(
private val ticketRepository: TicketRepository,
Expand Down Expand Up @@ -30,9 +31,17 @@ class MfaMethodsEnrollmentAssociation(
ticketRepository.delete(ticket.verificationTicket)
}

class MfaMethodsEnrollment(private val mfaAccountMethodsRepository: MfaAccountMethodsRepository) {
class MfaMethodsEnrollment(
private val verificationTicketFactory: VerificationTicketFactory,
private val mfaAccountMethodsRepository: MfaAccountMethodsRepository
) {

fun enroll(account: Account, emailMfaMethod: MfaMethod) {
TODO()
fun enroll(
account: Account,
emailMfaMethod: MfaMethod,
clientAppId: ClientAppId,
sendChallengeCode : Boolean = true
): VerificationTicket {
return verificationTicketFactory.createTicketFor(account, clientAppId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.vauthenticator.server.mfa.repository.TicketRepository
import com.vauthenticator.server.oauth2.clientapp.ClientAppId
import java.time.Clock


// todo create and store ticket is a SRP violation.. it should be decoupled
class VerificationTicketFactory(
private val ticketGenerator: () -> String,
private val clock: Clock,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ import com.vauthenticator.server.account.repository.AccountRepository
import com.vauthenticator.server.clientapp.A_CLIENT_APP_ID
import com.vauthenticator.server.clientapp.ClientAppFixture.aClientApp
import com.vauthenticator.server.email.EMailSenderService
import com.vauthenticator.server.mfa.domain.MfaMethod
import com.vauthenticator.server.mfa.domain.MfaMethodsEnrollment
import com.vauthenticator.server.mfa.domain.VerificationTicket
import com.vauthenticator.server.mfa.domain.VerificationTicketFactory
import com.vauthenticator.server.oauth2.clientapp.ClientAppId
import com.vauthenticator.server.oauth2.clientapp.ClientApplicationRepository
import com.vauthenticator.server.oauth2.clientapp.Scope
Expand Down Expand Up @@ -34,7 +35,7 @@ internal class SendVerifyEMailChallengeTest {
lateinit var accountRepository: AccountRepository

@MockK
lateinit var verificationTicketFactory: VerificationTicketFactory
lateinit var mfaMethodsEnrollment: MfaMethodsEnrollment

@MockK
lateinit var mailVerificationMailSender: EMailSenderService
Expand All @@ -45,7 +46,7 @@ internal class SendVerifyEMailChallengeTest {
fun setup() {
underTest = SendVerifyEMailChallenge(
accountRepository,
verificationTicketFactory,
mfaMethodsEnrollment,
mailVerificationMailSender,
"https://vauthenticator.com"
)
Expand All @@ -59,7 +60,7 @@ internal class SendVerifyEMailChallengeTest {


every { accountRepository.accountFor(account.email) } returns Optional.of(account)
every { verificationTicketFactory.createTicketFor(account, ClientAppId.empty() ) } returns verificationTicket
every { mfaMethodsEnrollment.enroll(account, MfaMethod.EMAIL_MFA_METHOD,ClientAppId.empty(),false ) } returns verificationTicket
every { mailVerificationMailSender.sendFor(account, requestContext) } just runs

underTest.sendVerifyMail(account.email)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package com.vauthenticator.server.mfa.domain

class MfaMethodsEnrollmentTest
class MfaMethodsEnrollmentTest {

}

0 comments on commit 0c85ac2

Please sign in to comment.