diff options
| author | Anders Betts <anders.betts@gmail.com> | 2026-09-21 23:09:57 +0200 |
|---|---|---|
| committer | Anders Betts <anders.betts@gmail.com> | 2026-09-21 23:09:57 +0200 |
| commit | 8350815a8c6987b288551848eda1c678739c8d4a (patch) | |
| tree | 04ef3c56e10fa8b06768465910d10a57779e8731 /src/mail.c | |
| parent | bf9012dad7ef34bbbfb073bc0f37b0161f0496f3 (diff) | |
| download | bokf-8350815a8c6987b288551848eda1c678739c8d4a.tar.gz bokf-8350815a8c6987b288551848eda1c678739c8d4a.zip | |
invoices: text rows, duplicate and payment link (schema v12); smtp address checksv0.1.62
Diffstat (limited to 'src/mail.c')
| -rw-r--r-- | src/mail.c | 23 |
1 files changed, 23 insertions, 0 deletions
@@ -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, |
