Skip to content

Commit

Permalink
refactor enroll method
Browse files Browse the repository at this point in the history
  • Loading branch information
mrFlick72 committed Jul 21, 2024
1 parent 0c85ac2 commit 528b64c
Show file tree
Hide file tree
Showing 24 changed files with 121 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ 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.oauth2.clientapp.ClientAppId
import com.vauthenticator.server.ticket.VerificationTicket
import org.slf4j.LoggerFactory

private const val LINK_KEY = "verificationEMailLink"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ 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.InvalidTicketException
import com.vauthenticator.server.mfa.domain.MfaMethod
import com.vauthenticator.server.mfa.domain.MfaMethodsEnrollmentAssociation
import com.vauthenticator.server.mfa.domain.VerificationTicket
import com.vauthenticator.server.mfa.repository.TicketRepository
import com.vauthenticator.server.ticket.InvalidTicketException
import com.vauthenticator.server.ticket.TicketRepository
import com.vauthenticator.server.ticket.VerificationTicket

class VerifyEMailChallenge(
private val ticketRepository: TicketRepository,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ 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.repository.TicketRepository
import com.vauthenticator.server.oauth2.clientapp.ClientApplicationRepository
import com.vauthenticator.server.ticket.TicketRepository
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ import com.vauthenticator.document.repository.DocumentRepository
import com.vauthenticator.server.account.repository.AccountRepository
import com.vauthenticator.server.email.*
import com.vauthenticator.server.events.VAuthenticatorEventsDispatcher
import com.vauthenticator.server.mfa.domain.VerificationTicketFactory
import com.vauthenticator.server.mfa.repository.TicketRepository
import com.vauthenticator.server.oauth2.clientapp.ClientApplicationRepository
import com.vauthenticator.server.password.PasswordPolicy
import com.vauthenticator.server.password.VAuthenticatorPasswordEncoder
import com.vauthenticator.server.password.resetpassword.ResetAccountPassword
import com.vauthenticator.server.password.resetpassword.SendResetPasswordMailChallenge
import com.vauthenticator.server.ticket.TicketRepository
import com.vauthenticator.server.ticket.VerificationTicketFactory
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.vauthenticator.server.config

import com.vauthenticator.server.mfa.domain.VerificationTicketFactory
import com.vauthenticator.server.mfa.domain.VerificationTicketFeatures
import com.vauthenticator.server.mfa.repository.DynamoDbTicketRepository
import com.vauthenticator.server.mfa.repository.TicketRepository
import com.vauthenticator.server.ticket.DynamoDbTicketRepository
import com.vauthenticator.server.ticket.TicketRepository
import com.vauthenticator.server.ticket.VerificationTicketFactory
import com.vauthenticator.server.ticket.VerificationTicketFeatures
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
Expand Down
7 changes: 4 additions & 3 deletions src/main/kotlin/com/vauthenticator/server/mfa/MfaConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ import com.vauthenticator.server.mask.SensitiveEmailMasker
import com.vauthenticator.server.mfa.domain.*
import com.vauthenticator.server.mfa.repository.DynamoMfaAccountMethodsRepository
import com.vauthenticator.server.mfa.repository.MfaAccountMethodsRepository
import com.vauthenticator.server.mfa.repository.TicketRepository
import com.vauthenticator.server.ticket.TicketRepository
import com.vauthenticator.server.ticket.VerificationTicketFactory
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.context.annotation.Bean
Expand Down Expand Up @@ -48,9 +49,9 @@ class MfaConfig {

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

@Bean
fun otpMfa(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ 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
import com.vauthenticator.server.ticket.*

class MfaMethodsEnrollmentAssociation(
private val ticketRepository: TicketRepository,
Expand Down Expand Up @@ -33,7 +33,7 @@ class MfaMethodsEnrollmentAssociation(

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

fun enroll(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import com.vauthenticator.server.account.Email
import com.vauthenticator.server.account.repository.AccountRepository
import com.vauthenticator.server.events.ResetPasswordEvent
import com.vauthenticator.server.events.VAuthenticatorEventsDispatcher
import com.vauthenticator.server.mfa.domain.InvalidTicketException
import com.vauthenticator.server.mfa.domain.Ticket
import com.vauthenticator.server.mfa.domain.VerificationTicket
import com.vauthenticator.server.mfa.repository.TicketRepository
import com.vauthenticator.server.oauth2.clientapp.ClientAppId
import com.vauthenticator.server.password.Password
import com.vauthenticator.server.password.PasswordPolicy
import com.vauthenticator.server.password.VAuthenticatorPasswordEncoder
import com.vauthenticator.server.ticket.InvalidTicketException
import com.vauthenticator.server.ticket.Ticket
import com.vauthenticator.server.ticket.TicketRepository
import com.vauthenticator.server.ticket.VerificationTicket
import java.time.Instant
import java.util.*

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ package com.vauthenticator.server.password.resetpassword
import com.fasterxml.jackson.databind.ObjectMapper
import com.vauthenticator.server.i18n.I18nMessageInjector
import com.vauthenticator.server.i18n.I18nScope
import com.vauthenticator.server.mfa.domain.VerificationTicket
import com.vauthenticator.server.oauth2.clientapp.Scope
import com.vauthenticator.server.oauth2.clientapp.Scopes
import com.vauthenticator.server.role.PermissionValidator
import com.vauthenticator.server.ticket.VerificationTicket
import jakarta.servlet.http.HttpSession
import org.springframework.http.ResponseEntity
import org.springframework.http.ResponseEntity.noContent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.vauthenticator.server.password.resetpassword

import com.vauthenticator.server.account.repository.AccountRepository
import com.vauthenticator.server.email.EMailSenderService
import com.vauthenticator.server.mfa.domain.VerificationTicketFactory
import com.vauthenticator.server.oauth2.clientapp.ClientAppId
import com.vauthenticator.server.ticket.VerificationTicketFactory

class SendResetPasswordMailChallenge(
private val accountRepository: AccountRepository,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package com.vauthenticator.server.mfa.repository
package com.vauthenticator.server.ticket

import com.vauthenticator.server.extentions.asDynamoAttribute
import com.vauthenticator.server.extentions.filterEmptyMetadata
import com.vauthenticator.server.extentions.valueAsLongFor
import com.vauthenticator.server.extentions.valueAsStringFor
import com.vauthenticator.server.mfa.domain.Ticket
import com.vauthenticator.server.mfa.domain.VerificationTicket
import software.amazon.awssdk.services.dynamodb.DynamoDbClient
import software.amazon.awssdk.services.dynamodb.model.DeleteItemRequest
import software.amazon.awssdk.services.dynamodb.model.GetItemRequest
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.vauthenticator.server.mfa.domain
package com.vauthenticator.server.ticket

import java.time.Duration

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.vauthenticator.server.mfa.repository
package com.vauthenticator.server.ticket

import com.vauthenticator.server.mfa.domain.Ticket
import com.vauthenticator.server.mfa.domain.VerificationTicket
import java.util.*

interface TicketRepository {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.vauthenticator.server.mfa.domain
package com.vauthenticator.server.ticket

import com.vauthenticator.server.account.Account
import com.vauthenticator.server.extentions.expirationTimeStampInSecondFromNow
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
/*
* This domain class create a new verification ticket storing the associated information in the database
* */
class VerificationTicketFactory(
private val ticketGenerator: () -> String,
private val clock: Clock,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ 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.oauth2.clientapp.ClientAppId
import com.vauthenticator.server.oauth2.clientapp.ClientApplicationRepository
import com.vauthenticator.server.oauth2.clientapp.Scope
import com.vauthenticator.server.oauth2.clientapp.Scopes
import com.vauthenticator.server.support.AccountTestFixture.anAccount
import com.vauthenticator.server.ticket.VerificationTicket
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.junit5.MockKExtension
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.vauthenticator.server.account.emailverification

import com.vauthenticator.server.clientapp.A_CLIENT_APP_ID
import com.vauthenticator.server.mfa.domain.VerificationTicket
import com.vauthenticator.server.mfa.domain.VerificationTicketFactory
import com.vauthenticator.server.mfa.domain.VerificationTicketFeatures
import com.vauthenticator.server.mfa.repository.TicketRepository
import com.vauthenticator.server.oauth2.clientapp.ClientAppId
import com.vauthenticator.server.support.AccountTestFixture.anAccount
import com.vauthenticator.server.support.EMAIL
import com.vauthenticator.server.support.TicketFixture.ticketFor
import com.vauthenticator.server.ticket.TicketRepository
import com.vauthenticator.server.ticket.VerificationTicket
import com.vauthenticator.server.ticket.VerificationTicketFactory
import com.vauthenticator.server.ticket.VerificationTicketFeatures
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.junit5.MockKExtension
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.vauthenticator.server.account.emailverification

import com.vauthenticator.server.account.repository.AccountRepository
import com.vauthenticator.server.mfa.domain.InvalidTicketException
import com.vauthenticator.server.mfa.domain.MfaMethod
import com.vauthenticator.server.mfa.domain.MfaMethodsEnrollmentAssociation
import com.vauthenticator.server.mfa.domain.VerificationTicket
import com.vauthenticator.server.mfa.repository.TicketRepository
import com.vauthenticator.server.oauth2.clientapp.ClientAppId
import com.vauthenticator.server.support.AccountTestFixture
import com.vauthenticator.server.support.TicketFixture
import com.vauthenticator.server.ticket.InvalidTicketException
import com.vauthenticator.server.ticket.TicketRepository
import com.vauthenticator.server.ticket.VerificationTicket
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.junit5.MockKExtension
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,75 @@
package com.vauthenticator.server.mfa.domain

import com.vauthenticator.server.clientapp.ClientAppFixture.aClientAppId
import com.vauthenticator.server.support.AccountTestFixture.anAccount
import com.vauthenticator.server.ticket.VerificationTicket
import com.vauthenticator.server.ticket.VerificationTicketFactory
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.junit5.MockKExtension
import io.mockk.just
import io.mockk.runs
import io.mockk.verify
import junit.framework.TestCase.assertEquals
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith

@ExtendWith(MockKExtension::class)
class MfaMethodsEnrollmentTest {

@MockK
private lateinit var verificationTicketFactory: VerificationTicketFactory

@MockK
private lateinit var mfaSender: OtpMfaSender


@Test
fun `when the enrolment do not send the verification code together the verification ticket`() {

val uut = MfaMethodsEnrollment(
verificationTicketFactory,
mfaSender,
)


val account = anAccount()
val clientAppId = aClientAppId()


val verificationTicket = VerificationTicket("A_TICKET")

every { verificationTicketFactory.createTicketFor(account, clientAppId) } returns verificationTicket
val actual = uut.enroll(account, MfaMethod.EMAIL_MFA_METHOD, clientAppId, false)

verify { verificationTicketFactory.createTicketFor(account, clientAppId) }

assertEquals(verificationTicket, actual)
}

@Test
fun `when the enrolment send the verification code together the verification ticket`() {

val uut = MfaMethodsEnrollment(
verificationTicketFactory,
mfaSender,
)


val account = anAccount()
val clientAppId = aClientAppId()


val verificationTicket = VerificationTicket("A_TICKET")

every { verificationTicketFactory.createTicketFor(account, clientAppId) } returns verificationTicket
every { mfaSender.sendMfaChallenge(account.email) } just runs

val actual = uut.enroll(account, MfaMethod.EMAIL_MFA_METHOD, clientAppId, true)

verify { verificationTicketFactory.createTicketFor(account, clientAppId) }
verify { mfaSender.sendMfaChallenge(account.email) }

assertEquals(verificationTicket, actual)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ package com.vauthenticator.server.password.resetpassword
import com.vauthenticator.server.account.repository.AccountRepository
import com.vauthenticator.server.events.ResetPasswordEvent
import com.vauthenticator.server.events.VAuthenticatorEventsDispatcher
import com.vauthenticator.server.mfa.domain.InvalidTicketException
import com.vauthenticator.server.mfa.domain.VerificationTicket
import com.vauthenticator.server.mfa.repository.TicketRepository
import com.vauthenticator.server.password.PasswordPolicy
import com.vauthenticator.server.password.VAuthenticatorPasswordEncoder
import com.vauthenticator.server.support.AccountTestFixture.anAccount
import com.vauthenticator.server.support.TicketFixture
import com.vauthenticator.server.ticket.InvalidTicketException
import com.vauthenticator.server.ticket.TicketRepository
import com.vauthenticator.server.ticket.VerificationTicket
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.junit5.MockKExtension
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ package com.vauthenticator.server.password.resetpassword
import com.fasterxml.jackson.databind.ObjectMapper
import com.vauthenticator.server.clientapp.A_CLIENT_APP_ID
import com.vauthenticator.server.clientapp.ClientAppFixture.aClientApp
import com.vauthenticator.server.mfa.domain.VerificationTicket
import com.vauthenticator.server.oauth2.clientapp.ClientAppId
import com.vauthenticator.server.oauth2.clientapp.ClientApplicationRepository
import com.vauthenticator.server.oauth2.clientapp.Scope
import com.vauthenticator.server.role.PermissionValidator
import com.vauthenticator.server.support.EMAIL
import com.vauthenticator.server.support.SecurityFixture.principalFor
import com.vauthenticator.server.support.VAUTHENTICATOR_ADMIN
import com.vauthenticator.server.ticket.VerificationTicket
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.junit5.MockKExtension
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package com.vauthenticator.server.password.resetpassword

import com.vauthenticator.server.account.repository.AccountRepository
import com.vauthenticator.server.email.EMailSenderService
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.support.AccountTestFixture.anAccount
import com.vauthenticator.server.ticket.VerificationTicket
import com.vauthenticator.server.ticket.VerificationTicketFactory
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.junit5.MockKExtension
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.vauthenticator.server.support

import com.vauthenticator.server.mfa.domain.Ticket
import com.vauthenticator.server.mfa.domain.VerificationTicket
import com.vauthenticator.server.ticket.Ticket
import com.vauthenticator.server.ticket.VerificationTicket

object TicketFixture {
fun ticketFor(verificationTicketValue: String, mail: String, clientAppId: String) =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package com.vauthenticator.server.mfa.repository
package com.vauthenticator.server.ticket

import com.vauthenticator.server.clientapp.A_CLIENT_APP_ID
import com.vauthenticator.server.extentions.asDynamoAttribute
import com.vauthenticator.server.mfa.domain.Ticket
import com.vauthenticator.server.mfa.domain.VerificationTicket
import com.vauthenticator.server.support.DynamoDbUtils
import com.vauthenticator.server.support.DynamoDbUtils.dynamoTicketTableName
import com.vauthenticator.server.support.DynamoDbUtils.resetDynamoDb
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.vauthenticator.server.mfa.domain
package com.vauthenticator.server.ticket

import com.vauthenticator.server.keys.Kid
import com.vauthenticator.server.mfa.domain.MfaAccountMethod
import com.vauthenticator.server.mfa.domain.MfaMethod
import com.vauthenticator.server.mfa.domain.MfaMethodsEnrollmentAssociation
import com.vauthenticator.server.mfa.repository.MfaAccountMethodsRepository
import com.vauthenticator.server.mfa.repository.TicketRepository
import com.vauthenticator.server.oauth2.clientapp.ClientAppId
import com.vauthenticator.server.support.AccountTestFixture.anAccount
import com.vauthenticator.server.support.TicketFixture
Expand Down

0 comments on commit 528b64c

Please sign in to comment.