From e7c4abb46f6a20b9da90630791335fe7f724f4ee Mon Sep 17 00:00:00 2001 From: Niklas Fiekas Date: Wed, 31 Mar 2021 22:35:29 +0200 Subject: [PATCH] prepare gradual transition between smtp configs --- app/controllers/Dev.scala | 1 + conf/base.conf | 1 + modules/security/src/main/Env.scala | 11 ++++++++++- modules/security/src/main/Mailer.scala | 15 +++++++++++---- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/app/controllers/Dev.scala b/app/controllers/Dev.scala index 55aeb5dace..c280b478cd 100644 --- a/app/controllers/Dev.scala +++ b/app/controllers/Dev.scala @@ -10,6 +10,7 @@ final class Dev(env: Env) extends LilaController(env) { private lazy val settingsList = List[lila.memo.SettingStore[_]]( env.security.ugcArmedSetting, env.security.spamKeywordsSetting, + env.security.mailerSecondaryPercentageSetting, env.irwin.irwinThresholdsSetting, env.explorer.indexFlowSetting, env.report.scoreThresholdsSetting, diff --git a/conf/base.conf b/conf/base.conf index 880a400306..6fefa99691 100644 --- a/conf/base.conf +++ b/conf/base.conf @@ -193,6 +193,7 @@ security { user = "noreply@lichess.org" password = "???" } + secondary = ${security.mailer.primary} sender = "lichess.org " } email_confirm { diff --git a/modules/security/src/main/Env.scala b/modules/security/src/main/Env.scala index e7a6403439..2e5f8cb085 100644 --- a/modules/security/src/main/Env.scala +++ b/modules/security/src/main/Env.scala @@ -79,7 +79,16 @@ final class Env( mk(ugcArmedSetting.get _) } - private lazy val mailer: Mailer = wire[Mailer] + lazy val mailerSecondaryPercentageSetting = settingStore[Int]( + "mailerSecondaryPercentage", + default = 0, + text = "Percentage of mails to send using secondary SMTP configuration".some + ) + + private lazy val mailer = new Mailer( + config.mailer, + getSecondaryPercentage = () => mailerSecondaryPercentageSetting.get() + ) lazy val emailConfirm: EmailConfirm = if (config.emailConfirm.enabled) diff --git a/modules/security/src/main/Mailer.scala b/modules/security/src/main/Mailer.scala index 13d46bb86a..1f40d66f5a 100644 --- a/modules/security/src/main/Mailer.scala +++ b/modules/security/src/main/Mailer.scala @@ -9,12 +9,13 @@ import scala.concurrent.{ blocking, Future } import scalatags.Text.all._ import lila.common.config.Secret -import lila.common.{ Chronometer, EmailAddress } +import lila.common.{ Chronometer, EmailAddress, ThreadLocalRandom } import lila.common.String.html.{ escapeHtml, nl2brUnsafe } import lila.i18n.I18nKeys.{ emails => trans } final class Mailer( - config: Mailer.Config + config: Mailer.Config, + getSecondaryPercentage: () => Int )(implicit ec: scala.concurrent.ExecutionContext, system: ActorSystem @@ -23,7 +24,12 @@ final class Mailer( private val workQueue = new lila.hub.DuctSequencer(maxSize = 512, timeout = Mailer.timeout * 2, name = "mailer") - private val client = new SMTPMailer(config.primary.toClientConfig) + private val primaryClient = new SMTPMailer(config.primary.toClientConfig) + private val secondaryClient = new SMTPMailer(config.secondary.toClientConfig) + + private def randomClient(): SMTPMailer = + if (ThreadLocalRandom.nextInt(100) < getSecondaryPercentage()) secondaryClient + else primaryClient def send(msg: Mailer.Message): Funit = if (msg.to.isNoReply) { @@ -34,7 +40,7 @@ final class Mailer( Future { Chronometer.syncMon(_.email.send.time) { blocking { - client + randomClient() .send( Email( subject = msg.subject, @@ -78,6 +84,7 @@ object Mailer { case class Config( primary: Smtp, + secondary: Smtp, sender: String ) implicit val configLoader = AutoConfig.loader[Config]