Skip to content

Commit

Permalink
get mfa method from the ticket itself
Browse files Browse the repository at this point in the history
  • Loading branch information
mrFlick72 committed Jul 22, 2024
1 parent f54efd1 commit 3136936
Show file tree
Hide file tree
Showing 6 changed files with 18 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.vauthenticator.server.account.emailverification

import com.vauthenticator.server.account.Account
import com.vauthenticator.server.account.repository.AccountRepository
import com.vauthenticator.server.mfa.domain.MfaMethod
import com.vauthenticator.server.mfa.domain.MfaMethodsEnrollmentAssociation
import com.vauthenticator.server.ticket.InvalidTicketException
import com.vauthenticator.server.ticket.TicketId
Expand All @@ -17,7 +16,7 @@ class VerifyEMailChallenge(
fun verifyMail(ticket: String) {
ticketRepository.loadFor(TicketId(ticket))
.map {
mfaMethodsEnrollmentAssociation.associate(ticket, MfaMethod.EMAIL_MFA_METHOD)
mfaMethodsEnrollmentAssociation.associate(ticket)
enableAccountFrom(it.userName)
}
.orElseThrow { throw InvalidTicketException("The ticket $ticket is not a valid ticket, it seems to be expired") }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,6 @@ class MfaEnrolmentAssociationEndPoint(
)


/*
* /api/mfa/enrollment -> enrollmentId
*
* */
@PostMapping("/api/mfa/enrollment")
fun enrollMfa(authentication: Authentication, enrolling: MfaEnrollingDevice) {
TODO("will return ticket to enroll")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,20 @@ import com.vauthenticator.server.account.Account
import com.vauthenticator.server.mfa.repository.MfaAccountMethodsRepository
import com.vauthenticator.server.oauth2.clientapp.ClientAppId
import com.vauthenticator.server.ticket.*
import com.vauthenticator.server.ticket.Ticket.Companion.MFA_CHANNEL_CONTEXT_KEY
import com.vauthenticator.server.ticket.Ticket.Companion.MFA_METHOD_CONTEXT_KEY

class MfaMethodsEnrollmentAssociation(
private val ticketRepository: TicketRepository,
private val mfaAccountMethodsRepository: MfaAccountMethodsRepository
) {

//todo mfaMethod: MfaMethod can be encoded in the ticket itself
//todo ticket can be an higher abstraction like RawTicket
fun associate(ticket: String, mfaMethod: MfaMethod) {
fun associate(ticket: String) {
ticketRepository.loadFor(TicketId(ticket))
.map { ticket ->
val email = ticket.userName
val mfaAccountMethods = mfaAccountMethodsRepository.findAll(email)
val mfaMethod = MfaMethod.valueOf(ticket.context.content[MFA_METHOD_CONTEXT_KEY]!!)
if (!mfaAccountMethods.any { it.method == mfaMethod }) {
mfaAccountMethodsRepository.save(email, mfaMethod)
}
Expand Down Expand Up @@ -51,8 +52,8 @@ class MfaMethodsEnrollment(
clientAppId,
TicketContext(
mapOf(
"mfaChannel" to mfaChannel,
"mfaMethod" to mfaMethod.name
MFA_CHANNEL_CONTEXT_KEY to mfaChannel,
MFA_METHOD_CONTEXT_KEY to mfaMethod.name
)
)
)
Expand Down
7 changes: 6 additions & 1 deletion src/main/kotlin/com/vauthenticator/server/ticket/Ticket.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,12 @@ data class Ticket(
val clientAppId: String,
val ttl: Long,
val context: TicketContext = TicketContext.empty(),
)
) {
companion object {
val MFA_CHANNEL_CONTEXT_KEY = "mfaChannel"
val MFA_METHOD_CONTEXT_KEY = "mfaMethod"
}
}

data class TicketContext(val content: Map<String, String>) {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.vauthenticator.server.account.emailverification

import com.vauthenticator.server.account.repository.AccountRepository
import com.vauthenticator.server.mfa.domain.MfaMethod
import com.vauthenticator.server.mfa.domain.MfaMethodsEnrollmentAssociation
import com.vauthenticator.server.oauth2.clientapp.ClientAppId
import com.vauthenticator.server.support.AccountTestFixture
Expand Down Expand Up @@ -58,13 +57,13 @@ internal class VerifyEMailChallengeTest {
ClientAppId.empty().content
)
)
every { mfaMethodsEnrollmentAssociation.associate("A_TICKET", MfaMethod.EMAIL_MFA_METHOD) } just runs
every { mfaMethodsEnrollmentAssociation.associate("A_TICKET") } just runs
every { accountRepository.accountFor(account.email) } returns Optional.of(account)
every { accountRepository.save(enabledAccount) } just runs
every { ticketRepository.delete(ticketId) } just runs

underTest.verifyMail("A_TICKET")
verify(exactly = 1) { mfaMethodsEnrollmentAssociation.associate("A_TICKET", MfaMethod.EMAIL_MFA_METHOD) }
verify(exactly = 1) { mfaMethodsEnrollmentAssociation.associate("A_TICKET") }
}

@Test
Expand All @@ -80,7 +79,7 @@ internal class VerifyEMailChallengeTest {
)
)
every { accountRepository.accountFor(account.email) } returns Optional.empty()
every { mfaMethodsEnrollmentAssociation.associate("A_TICKET", MfaMethod.EMAIL_MFA_METHOD) } just runs
every { mfaMethodsEnrollmentAssociation.associate("A_TICKET") } just runs

assertThrows(InvalidTicketException::class.java) { underTest.verifyMail("A_TICKET") }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class MfaMethodsEnrollmentAssociationTest {
every { ticketRepository.delete(ticket.ticketId) } just runs


underTest.associate(RAW_TICKET, MfaMethod.EMAIL_MFA_METHOD)
underTest.associate(RAW_TICKET)

verify { ticketRepository.loadFor(ticketId) }
verify { mfaAccountMethodsRepository.findAll(email) }
Expand All @@ -77,7 +77,7 @@ class MfaMethodsEnrollmentAssociationTest {
every { mfaAccountMethodsRepository.findAll(email) } returns listOf(mfaAccountMethod)
every { ticketRepository.delete(ticket.ticketId) } just runs

underTest.associate(RAW_TICKET, MfaMethod.EMAIL_MFA_METHOD)
underTest.associate(RAW_TICKET)

verify { ticketRepository.loadFor(ticketId) }
verify { mfaAccountMethodsRepository.findAll(email) }
Expand Down

0 comments on commit 3136936

Please sign in to comment.