diff --git a/docker-compose.yml b/docker-compose.yml index 6aebfa640..63535e6e2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -546,6 +546,9 @@ services: - SMTP_USER=${SMTP_USER} - SMTP_PASS=${SMTP_PASS} - SMTP_FROM=${SMTP_FROM} + - SMTP_SOCKS_HOST=${SMTP_SOCKS_HOST} + - SMTP_SOCKS_PORT=${SMTP_SOCKS_PORT} + - SMTP_PROXY_ENABLED=${SMTP_PROXY_ENABLED} - TOKEN_ISSUER_URL=${KC_ISSUER_URL} - OTP_CODE_RESPONSE_ENABLED=${OTP_CODE_RESPONSE_ENABLED} depends_on: diff --git a/otp/otp-app/src/main/kotlin/co/nilin/opex/otp/app/config/PostgresConfig.kt b/otp/otp-app/src/main/kotlin/co/nilin/opex/otp/app/config/PostgresConfig.kt index 0c554085b..94cc7cc4a 100644 --- a/otp/otp-app/src/main/kotlin/co/nilin/opex/otp/app/config/PostgresConfig.kt +++ b/otp/otp-app/src/main/kotlin/co/nilin/opex/otp/app/config/PostgresConfig.kt @@ -2,12 +2,14 @@ package co.nilin.opex.otp.app.config import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.Profile import org.springframework.core.io.Resource import org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories import org.springframework.r2dbc.core.DatabaseClient @Configuration @EnableR2dbcRepositories(basePackages = ["co.nilin.opex"]) +@Profile("!test") class PostgresConfig( db: DatabaseClient, @Value("classpath:schema.sql") private val schemaResource: Resource diff --git a/otp/otp-app/src/main/kotlin/co/nilin/opex/otp/app/service/message/EmailSender.kt b/otp/otp-app/src/main/kotlin/co/nilin/opex/otp/app/service/message/EmailSender.kt index e9912bfb4..402e72c93 100644 --- a/otp/otp-app/src/main/kotlin/co/nilin/opex/otp/app/service/message/EmailSender.kt +++ b/otp/otp-app/src/main/kotlin/co/nilin/opex/otp/app/service/message/EmailSender.kt @@ -8,6 +8,7 @@ import jakarta.mail.internet.MimeMessage import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Component + @Component class EmailSender( @Value("\${otp.email.host}") @@ -19,7 +20,13 @@ class EmailSender( @Value("\${otp.email.password}") private val password: String, @Value("\${otp.email.from}") - private val from: String + private val from: String, + @Value("\${otp.email.proxy.enabled}") + private val proxyIsEnabled: Boolean, + @Value("\${otp.email.proxy.host}") + private val proxyHost: String?, + @Value("\${otp.email.proxy.port}") + private val proxyPort: String? ) : MessageSender { private val logger by LoggerDelegate() @@ -34,6 +41,11 @@ class EmailSender( properties["mail.smtp.starttls.enable"] = "true" properties["mail.smtp.from"] = from properties["mail.smtp.ssl.protocols"] = "TLSv1.2" + if (proxyIsEnabled) { + properties["mail.smtp.socks.host"] = proxyHost + properties["mail.smtp.socks.port"] = proxyPort + } + val session = Session.getDefaultInstance(properties) return try { diff --git a/otp/otp-app/src/test/kotlin/co/nilin/opex/otp/app/conttroller/OTPControllerIT.kt b/otp/otp-app/src/test/kotlin/co/nilin/opex/otp/app/conttroller/OTPControllerIT.kt new file mode 100644 index 000000000..c83c6a29e --- /dev/null +++ b/otp/otp-app/src/test/kotlin/co/nilin/opex/otp/app/conttroller/OTPControllerIT.kt @@ -0,0 +1,38 @@ +package co.nilin.opex.otp.app.conttroller + + +import co.nilin.opex.otp.app.service.message.EmailSender +import kotlinx.coroutines.runBlocking +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Disabled +import org.junit.jupiter.api.Test + + +class EmailSenderIT { + @Disabled("Manual test: requires real SMTP + proxy") + @Test + fun `should send email via real smtp`() = runBlocking { + + val sender = EmailSender( + host = requireEnv("SMTP_HOST"), + port = requireEnv("SMTP_PORT"), + username = requireEnv("SMTP_USER"), + password = requireEnv("SMTP_PASS"), + from = requireEnv("SMTP_FROM"), + proxyIsEnabled = true, + proxyHost = requireEnv("SMTP_SOCKS_HOST"), + proxyPort = requireEnv("SMTP_SOCKS_PORT") + ) + + val result = sender.send( + receiver = requireEnv("SMTP_RECEIVER"), + message = "