SPF evaluates the RFC5321.MailFrom as it was transmitted (including
local-part macros), so resolve the SPF record and credentials from the
original envelope sender even if the envelope from has been rewritten,
e.g. by the aliases module.
Issue: #6137
struct rspamd_email_address *addr;
struct rspamd_spf_cred *cred = NULL;
- addr = rspamd_task_get_sender(task);
+ /*
+ * SPF checks the RFC5321.MailFrom as it was transmitted, so use the
+ * original sender even if the envelope from has been rewritten
+ */
+ addr = rspamd_task_get_original_sender(task);
if (!addr || (addr->flags & RSPAMD_EMAIL_ADDR_EMPTY)) {
/* Get domain from helo */
return task->from_envelope;
}
+struct rspamd_email_address *
+rspamd_task_get_original_sender(struct rspamd_task *task)
+{
+ if (task->from_envelope_orig) {
+ return task->from_envelope_orig;
+ }
+
+ return task->from_envelope;
+}
+
static const char *
rspamd_task_cache_principal_recipient(struct rspamd_task *task,
const char *rcpt, gsize len)
*/
struct rspamd_email_address *rspamd_task_get_sender(struct rspamd_task *task);
+/**
+ * Return the original (pre-rewrite) envelope sender if the envelope from has
+ * been modified (e.g. by aliases resolution), or the current sender otherwise
+ * @param task
+ * @return
+ */
+struct rspamd_email_address *rspamd_task_get_original_sender(struct rspamd_task *task);
+
/**
* Return addresses in the following precedence:
* - deliver to