diff --git a/src/main/kotlin/com/vauthenticator/server/email/EMailSender.kt b/src/main/kotlin/com/vauthenticator/server/email/EMailSender.kt index 8806a761..8f3c0373 100644 --- a/src/main/kotlin/com/vauthenticator/server/email/EMailSender.kt +++ b/src/main/kotlin/com/vauthenticator/server/email/EMailSender.kt @@ -29,7 +29,7 @@ class SimpleEMailMessageFactory(val from: String, val subject: String, private v "birthDate" to account.birthDate.map { it.iso8601FormattedDate() }.orElse(""), "phone" to account.phone.map { it.formattedPhone() }.orElse("") ) + requestContext - return EMailMessage(account.email, from, subject, emailType, context) + return EMailMessage(context["email"] as String, from, subject, emailType, context) } } diff --git a/src/main/kotlin/com/vauthenticator/server/mfa/api/MfaChallengeEndPoint.kt b/src/main/kotlin/com/vauthenticator/server/mfa/api/MfaChallengeEndPoint.kt index fdc409b5..2862c706 100644 --- a/src/main/kotlin/com/vauthenticator/server/mfa/api/MfaChallengeEndPoint.kt +++ b/src/main/kotlin/com/vauthenticator/server/mfa/api/MfaChallengeEndPoint.kt @@ -10,7 +10,7 @@ class MfaChallengeEndPoint(private val otpMfaSender: OtpMfaSender) { @PutMapping("/api/mfa/challenge") fun sendMfaChallenge(authentication: Authentication) { - otpMfaSender.sendMfaChallenge(authentication.name) + otpMfaSender.sendMfaChallenge(authentication.name, authentication.name) } } \ No newline at end of file diff --git a/src/main/kotlin/com/vauthenticator/server/mfa/domain/MfaMethodsEnrollment.kt b/src/main/kotlin/com/vauthenticator/server/mfa/domain/MfaMethodsEnrollment.kt index 1ef78ccd..d19fdcc5 100644 --- a/src/main/kotlin/com/vauthenticator/server/mfa/domain/MfaMethodsEnrollment.kt +++ b/src/main/kotlin/com/vauthenticator/server/mfa/domain/MfaMethodsEnrollment.kt @@ -44,7 +44,7 @@ class MfaMethodsEnrollment( sendChallengeCode: Boolean = true ): TicketId { if (sendChallengeCode) { - mfaSender.sendMfaChallenge(account.email) + mfaSender.sendMfaChallenge(account.email, mfaChannel) } return ticketCreator.createTicketFor(account, clientAppId) } diff --git a/src/main/kotlin/com/vauthenticator/server/mfa/domain/MfaSenderAndVerifier.kt b/src/main/kotlin/com/vauthenticator/server/mfa/domain/MfaSenderAndVerifier.kt index d64989a4..82e7eb68 100644 --- a/src/main/kotlin/com/vauthenticator/server/mfa/domain/MfaSenderAndVerifier.kt +++ b/src/main/kotlin/com/vauthenticator/server/mfa/domain/MfaSenderAndVerifier.kt @@ -5,11 +5,11 @@ import com.vauthenticator.server.email.EMailSenderService interface OtpMfaSender { - fun sendMfaChallenge(email: String) + fun sendMfaChallenge(userName: String, challengeChannel: String) } interface OtpMfaVerifier { - fun verifyMfaChallengeFor(email: String, challenge: MfaChallenge) + fun verifyMfaChallengeFor(userName: String, challenge: MfaChallenge) } class OtpMfaEmailSender( @@ -18,11 +18,11 @@ class OtpMfaEmailSender( private val mfaMailSender: EMailSenderService ) : OtpMfaSender { - override fun sendMfaChallenge(email: String) { - val account = accountRepository.accountFor(email).get() + override fun sendMfaChallenge(userName: String, challengeChannel: String) { + val account = accountRepository.accountFor(userName).get() val mfaSecret = otpMfa.generateSecretKeyFor(account) val mfaCode = otpMfa.getTOTPCode(mfaSecret).content() - mfaMailSender.sendFor(account, mapOf("mfaCode" to mfaCode)) + mfaMailSender.sendFor(account, mapOf("email" to challengeChannel, "mfaCode" to mfaCode)) } } @@ -30,8 +30,8 @@ class AccountAwareOtpMfaVerifier( private val accountRepository: AccountRepository, private val otpMfa: OtpMfa ) : OtpMfaVerifier { - override fun verifyMfaChallengeFor(email: String, challenge: MfaChallenge) { - val account = accountRepository.accountFor(email).get() + override fun verifyMfaChallengeFor(userName: String, challenge: MfaChallenge) { + val account = accountRepository.accountFor(userName).get() otpMfa.verify(account, challenge) } diff --git a/src/main/kotlin/com/vauthenticator/server/mfa/web/MfaController.kt b/src/main/kotlin/com/vauthenticator/server/mfa/web/MfaController.kt index fb46341c..5fe46c2d 100644 --- a/src/main/kotlin/com/vauthenticator/server/mfa/web/MfaController.kt +++ b/src/main/kotlin/com/vauthenticator/server/mfa/web/MfaController.kt @@ -29,7 +29,7 @@ class MfaController( @GetMapping("/mfa-challenge/send") fun view(authentication: Authentication): String { - otpMfaSender.sendMfaChallenge(authentication.name) + otpMfaSender.sendMfaChallenge(authentication.name, authentication.name) return "redirect:/mfa-challenge" } diff --git a/src/test/kotlin/com/vauthenticator/server/email/SimpleEMailMessageFactoryTest.kt b/src/test/kotlin/com/vauthenticator/server/email/SimpleEMailMessageFactoryTest.kt index b1409ae1..1a4d4bc2 100644 --- a/src/test/kotlin/com/vauthenticator/server/email/SimpleEMailMessageFactoryTest.kt +++ b/src/test/kotlin/com/vauthenticator/server/email/SimpleEMailMessageFactoryTest.kt @@ -31,4 +31,27 @@ internal class SimpleEMailMessageFactoryTest { assertEquals(expected, actual) } + @Test + internal fun `make a new mail message when the sender mail has changed`() { + val account = anAccount() + val actual = underTest.makeMailMessageFor(account, mapOf("key" to "value", "email" to "new-accountmail@email.com")) + + val expected = EMailMessage( + "new-accountmail@email.com", "from", "subject", EMailType.WELCOME, + mapOf( + "enabled" to account.enabled, + "username" to account.username, + "authorities" to account.authorities, + "email" to "new-accountmail@email.com", + "firstName" to account.firstName, + "lastName" to account.lastName, + "birthDate" to "", + "phone" to "", + "key" to "value" + ) + ) + + assertEquals(expected, actual) + } + } \ No newline at end of file diff --git a/src/test/kotlin/com/vauthenticator/server/mfa/api/MfaChallengeEndPointTest.kt b/src/test/kotlin/com/vauthenticator/server/mfa/api/MfaChallengeEndPointTest.kt index 29ea5b2e..cb9e76d5 100644 --- a/src/test/kotlin/com/vauthenticator/server/mfa/api/MfaChallengeEndPointTest.kt +++ b/src/test/kotlin/com/vauthenticator/server/mfa/api/MfaChallengeEndPointTest.kt @@ -35,7 +35,7 @@ internal class MfaChallengeEndPointTest { @Test internal fun `when an mfa challenge is sent`() { - every { otpMfaSender.sendMfaChallenge(account.email) } just runs + every { otpMfaSender.sendMfaChallenge(account.email,account.email) } just runs mokMvc.perform( put("/api/mfa/challenge") diff --git a/src/test/kotlin/com/vauthenticator/server/mfa/domain/MfaMethodsEnrollmentTest.kt b/src/test/kotlin/com/vauthenticator/server/mfa/domain/MfaMethodsEnrollmentTest.kt index d4c2978f..25504d56 100644 --- a/src/test/kotlin/com/vauthenticator/server/mfa/domain/MfaMethodsEnrollmentTest.kt +++ b/src/test/kotlin/com/vauthenticator/server/mfa/domain/MfaMethodsEnrollmentTest.kt @@ -63,12 +63,12 @@ class MfaMethodsEnrollmentTest { val ticketId = TicketId("A_TICKET") every { ticketCreator.createTicketFor(account, clientAppId) } returns ticketId - every { mfaSender.sendMfaChallenge(account.email) } just runs + every { mfaSender.sendMfaChallenge(account.email,account.email) } just runs val actual = uut.enroll(account, MfaMethod.EMAIL_MFA_METHOD,account.email, clientAppId, true) verify { ticketCreator.createTicketFor(account, clientAppId) } - verify { mfaSender.sendMfaChallenge(account.email) } + verify { mfaSender.sendMfaChallenge(account.email,account.email) } assertEquals(ticketId, actual) } diff --git a/src/test/kotlin/com/vauthenticator/server/mfa/domain/OtpMfaEmailSenderTest.kt b/src/test/kotlin/com/vauthenticator/server/mfa/domain/OtpMfaEmailSenderTest.kt index cac2d520..9a230f65 100644 --- a/src/test/kotlin/com/vauthenticator/server/mfa/domain/OtpMfaEmailSenderTest.kt +++ b/src/test/kotlin/com/vauthenticator/server/mfa/domain/OtpMfaEmailSenderTest.kt @@ -34,8 +34,13 @@ internal class OtpMfaEmailSenderTest { every { accountRepository.accountFor(account.email) } returns Optional.of(account) every { otp.generateSecretKeyFor(account) } returns mfaSecret every { otp.getTOTPCode(mfaSecret) } returns mfaChallenge - every { mfaMailSender.sendFor(account, mapOf("mfaCode" to mfaChallenge.content())) } just runs - - underTest.sendMfaChallenge(account.email) + every { + mfaMailSender.sendFor( + account, + mapOf("email" to account.email, "mfaCode" to mfaChallenge.content()) + ) + } just runs + + underTest.sendMfaChallenge(account.email, account.email) } } \ No newline at end of file diff --git a/src/test/kotlin/com/vauthenticator/server/mfa/web/MfaControllerTest.kt b/src/test/kotlin/com/vauthenticator/server/mfa/web/MfaControllerTest.kt index 03ce1a8b..fe67e462 100644 --- a/src/test/kotlin/com/vauthenticator/server/mfa/web/MfaControllerTest.kt +++ b/src/test/kotlin/com/vauthenticator/server/mfa/web/MfaControllerTest.kt @@ -65,14 +65,15 @@ internal class MfaControllerTest { @Test internal fun `when an mfa challenge is sent`() { - every { otpMfaSender.sendMfaChallenge(account.email) } just runs + every { otpMfaSender.sendMfaChallenge(account.email, account.email) } just runs mokMvc.perform( get("/mfa-challenge/send") .principal(principalFor(account.email)) ).andExpect(redirectedUrl("/mfa-challenge")) - verify { otpMfaSender.sendMfaChallenge(account.email) } + verify { otpMfaSender.sendMfaChallenge(account.email, account.email) } } + @Test internal fun `when an mfa challenge is rendered`() { every { i18nMessageInjector.setMessagedFor(I18nScope.MFA_PAGE, any()) } just runs