Compare commits

..

4 Commits

Author SHA1 Message Date
Zakaria 2486869b6b fix(ses): sign in to the SMTP relay with the password, not as an OAuth token
Vert.x mail prefers XOAUTH2 whenever the server offers it, so against Gmail the
app password was sent as an OAuth token and refused (535 5.7.8). Limit the
relay to the password-based SASL methods.
2026-10-25 07:52:52 -04:00
Zakaria 327173c8f6 Merge pull request 'chore(docker): read optional SES SMTP relay settings from ~/.config/thecloud/ses-smtp.env' (#7) from feat/ses-smtp-relay-env into main
Reviewed-on: #7
2026-10-25 11:46:41 +00:00
Zakaria dcb007f8b8 chore(docker): read optional SES SMTP relay settings from ~/.config/thecloud/ses-smtp.env 2026-10-25 07:44:42 -04:00
Zakaria 607ac0803b Merge pull request 'fix(cloudwatch): retain metric-math alarm query definitions (#4594)' (#6) from feat/cloudwatch-upstream-fixes into main
Reviewed-on: #6
2026-10-25 03:08:55 +00:00
3 changed files with 12 additions and 1 deletions
+5
View File
@@ -12,6 +12,11 @@ services:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/app/data
# Optional SES SMTP relay settings (FLOCI_SERVICES_SES_SMTP_*), kept outside the repo
# because they hold a password. Without the file, sent emails stay in the SES mailbox.
env_file:
- path: ${HOME}/.config/thecloud/ses-smtp.env
required: false
environment:
FLOCI_SERVICES_DOCKER_NETWORK: floci_default
FLOCI_SERVICES_RDS_PROXY_BASE_PORT: "7001"
@@ -57,6 +57,8 @@ public class SmtpRelay {
private static final Logger LOG = Logger.getLogger(SmtpRelay.class);
private static final long RELAY_TIMEOUT_SECONDS = 30;
/** Every SASL method the mail client supports except XOAUTH2, which expects a token. */
static final String PASSWORD_AUTH_METHODS = "CRAM-SHA256 CRAM-SHA1 CRAM-MD5 DIGEST-MD5 LOGIN PLAIN";
/** SES control header naming the configuration set to apply to a raw send. */
public static final String HEADER_CONFIGURATION_SET = "X-SES-CONFIGURATION-SET";
@@ -118,6 +120,9 @@ public class SmtpRelay {
.filter(u -> !u.isBlank())
.ifPresent(u -> {
mailConfig.setUsername(u);
// smtp-pass is a password, never an OAuth token: without this the client prefers
// XOAUTH2 whenever the server offers it (Gmail does) and the login is refused.
mailConfig.setAuthMethods(PASSWORD_AUTH_METHODS);
config.services().ses().smtpPass()
.filter(p -> !p.isBlank())
.ifPresent(mailConfig::setPassword);
@@ -287,7 +287,8 @@ class SmtpRelayServerTest {
String command = line.toUpperCase(Locale.ROOT);
if (command.startsWith("EHLO")) {
reply(out, "250-floci-stub");
reply(out, "250 AUTH PLAIN");
// Gmail also offers OAuth sign-in, which a password must never be sent as.
reply(out, "250 AUTH PLAIN XOAUTH2 OAUTHBEARER");
} else if (command.startsWith("HELO")) {
reply(out, "250 floci-stub");
} else if (command.startsWith("AUTH")) {