summaryrefslogtreecommitdiff
path: root/src/mail.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mail.c')
-rw-r--r--src/mail.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/mail.c b/src/mail.c
index ca35f6d..e1b2131 100644
--- a/src/mail.c
+++ b/src/mail.c
@@ -38,6 +38,21 @@ static void set_err(char *err, size_t errlen, const char *msg)
snprintf(err, errlen, "%s", msg);
}
+int mail_addr_valid(const char *addr)
+{
+ if (!addr || !*addr)
+ return 0;
+ const char *at = strchr(addr, '@');
+ if (!at || at == addr || !at[1] || strchr(at + 1, '@'))
+ return 0;
+ for (const char *p = addr; *p; p++) {
+ unsigned char ch = (unsigned char)*p;
+ if (ch <= 0x20 || ch == 0x7f || ch == '<' || ch == '>')
+ return 0;
+ }
+ return 1;
+}
+
static int mail_cfg_load(sqlite3 *db, int64_t org_id, struct mail_cfg *c,
char *err, size_t errlen)
{
@@ -54,6 +69,14 @@ static int mail_cfg_load(sqlite3 *db, int64_t org_id, struct mail_cfg *c,
set_err(err, errlen, "smtp_host and smtp_from must be set");
goto fail;
}
+ if (!mail_addr_valid(c->from)) {
+ set_err(err, errlen, "smtp_from must be an email address");
+ goto fail;
+ }
+ if (c->reply_to && *c->reply_to && !mail_addr_valid(c->reply_to)) {
+ set_err(err, errlen, "smtp_reply_to must be an email address");
+ goto fail;
+ }
if (c->user && *c->user) {
if (!c->password || !*c->password) {
set_err(err, errlen,