diff --git a/src/mail.js b/src/mail.js index fe6066b69..64146d512 100644 --- a/src/mail.js +++ b/src/mail.js @@ -278,6 +278,15 @@ function checkMx(domain, callback) { }); } +function txtToDict(txt) { + var dict = {}; + txt.split(';').forEach(function(v) { + var p = v.trim().split('='); + dict[p[0]]=p[1]; + }); + return dict; +} + function checkDmarc(domain, callback) { var dmarc = { domain: '_dmarc.' + domain, @@ -293,7 +302,9 @@ function checkDmarc(domain, callback) { if (txtRecords.length !== 0) { dmarc.value = txtRecords[0].join(''); - dmarc.status = (dmarc.value === dmarc.expected); + // allow extra fields in dmarc like rua + const actual = txtToDict(dmarc.value), expected = txtToDict(dmarc.expected); + dmarc.status = Object.keys(expected).every(k => expected[k] === actual[k]); } callback(null, dmarc); diff --git a/src/routes/test/mail-test.js b/src/routes/test/mail-test.js index 225f9b73b..6b171ef69 100644 --- a/src/routes/test/mail-test.js +++ b/src/routes/test/mail-test.js @@ -408,6 +408,25 @@ describe('Mail API', function () { }); }); + it('succeeds with modified DMARC1 values', function (done) { + clearDnsAnswerQueue(); + + dnsAnswerQueue[dmarcDomain].TXT = [['v=DMARC1; p=reject; rua=mailto:rua@example.com; pct=100']]; + + superagent.get(SERVER_URL + '/api/v1/mail/' + DOMAIN_0.domain + '/status') + .query({ access_token: token }) + .end(function (err, res) { + expect(res.statusCode).to.equal(200); + + expect(res.body.dns.dmarc).to.be.an('object'); + expect(res.body.dns.dmarc.expected).to.eql('v=DMARC1; p=reject; pct=100'); + expect(res.body.dns.dmarc.status).to.eql(true); + expect(res.body.dns.dmarc.value).to.eql('v=DMARC1; p=reject; rua=mailto:rua@example.com; pct=100'); + + done(); + }); + }); + it('succeeds with all correct records', function (done) { clearDnsAnswerQueue();