mail: make status a tristate

status can be 'passed', 'failed' or 'skipped'. The motivation for this
change is that when using a relay, we can provide a message indicating
why the check was skipped.
This commit is contained in:
Girish Ramakrishnan
2025-06-27 18:51:03 +02:00
parent ec17e58eed
commit 9428cf0d06
4 changed files with 226 additions and 274 deletions
+21 -21
View File
@@ -114,32 +114,32 @@ describe('Mail API', function () {
expect(response.body.dns.dkim.type).to.eql('TXT');
expect(response.body.dns.dkim.value).to.eql(null);
expect(response.body.dns.dkim.expected).to.eql(`v=DKIM1; t=s; p=${publicKey}`);
expect(response.body.dns.dkim.status).to.eql(false);
expect(response.body.dns.dkim.status).to.eql('failed');
expect(response.body.dns.spf).to.be.an('object');
expect(response.body.dns.spf.domain).to.eql(spfDomain);
expect(response.body.dns.spf.type).to.eql('TXT');
expect(response.body.dns.spf.value).to.eql(null);
expect(response.body.dns.spf.expected).to.eql(`v=spf1 a:${dashboardFqdn} ~all`);
expect(response.body.dns.spf.status).to.eql(false);
expect(response.body.dns.spf.status).to.eql('failed');
expect(response.body.dns.dmarc).to.be.an('object');
expect(response.body.dns.dmarc.type).to.eql('TXT');
expect(response.body.dns.dmarc.value).to.eql(null);
expect(response.body.dns.dmarc.expected).to.eql('v=DMARC1; p=reject; pct=100');
expect(response.body.dns.dmarc.status).to.eql(false);
expect(response.body.dns.dmarc.status).to.eql('failed');
expect(response.body.dns.mx).to.be.an('object');
expect(response.body.dns.mx.type).to.eql('MX');
expect(response.body.dns.mx.value).to.eql(null);
expect(response.body.dns.mx.expected).to.eql(`10 ${mailFqdn}.`);
expect(response.body.dns.mx.status).to.eql(false);
expect(response.body.dns.mx.status).to.eql('failed');
expect(response.body.dns.ptr4).to.be.an('object');
expect(response.body.dns.ptr4.type).to.eql('PTR');
// expect(response.body.ptr.value).to.eql(null); this will be anything random
expect(response.body.dns.ptr4.expected).to.eql(mailFqdn);
expect(response.body.dns.ptr4.status).to.eql(false);
expect(response.body.dns.ptr4.status).to.eql('failed');
});
it('succeeds with "undefined" spf, dkim, dmarc, mx, ptr records', async function () {
@@ -157,27 +157,27 @@ describe('Mail API', function () {
expect(response.body.dns.spf).to.be.an('object');
expect(response.body.dns.spf.expected).to.eql(`v=spf1 a:${dashboardFqdn} ~all`);
expect(response.body.dns.spf.status).to.eql(false);
expect(response.body.dns.spf.status).to.eql('failed');
expect(response.body.dns.spf.value).to.eql(null);
expect(response.body.dns.dkim).to.be.an('object');
expect(response.body.dns.dkim.expected).to.eql(`v=DKIM1; t=s; p=${publicKey}`);
expect(response.body.dns.dkim.status).to.eql(false);
expect(response.body.dns.dkim.status).to.eql('failed');
expect(response.body.dns.dkim.value).to.eql(null);
expect(response.body.dns.dmarc).to.be.an('object');
expect(response.body.dns.dmarc.expected).to.eql('v=DMARC1; p=reject; pct=100');
expect(response.body.dns.dmarc.status).to.eql(false);
expect(response.body.dns.dmarc.status).to.eql('failed');
expect(response.body.dns.dmarc.value).to.eql(null);
expect(response.body.dns.mx).to.be.an('object');
expect(response.body.dns.mx.status).to.eql(false);
expect(response.body.dns.mx.status).to.eql('failed');
expect(response.body.dns.mx.expected).to.eql(`10 ${mailFqdn}.`);
expect(response.body.dns.mx.value).to.eql(null);
expect(response.body.dns.ptr4).to.be.an('object');
expect(response.body.dns.ptr4.expected).to.eql(mailFqdn);
expect(response.body.dns.ptr4.status).to.eql(false);
expect(response.body.dns.ptr4.status).to.eql('failed');
// expect(response.body.ptr.value).to.eql(null); this will be anything random
});
@@ -196,27 +196,27 @@ describe('Mail API', function () {
expect(response.body.dns.spf).to.be.an('object');
expect(response.body.dns.spf.expected).to.eql(`v=spf1 a:${dashboardFqdn} a:random.com ~all`);
expect(response.body.dns.spf.status).to.eql(false);
expect(response.body.dns.spf.status).to.eql('failed');
expect(response.body.dns.spf.value).to.eql('v=spf1 a:random.com ~all');
expect(response.body.dns.dkim).to.be.an('object');
expect(response.body.dns.dkim.expected).to.eql('v=DKIM1; t=s; p=' + publicKey);
expect(response.body.dns.dkim.status).to.eql(true); // as long as p= matches we are good
expect(response.body.dns.dkim.status).to.eql('passed'); // as long as p= matches we are good
expect(response.body.dns.dkim.value).to.eql('v=DKIM2; t=s; p=' + publicKey);
expect(response.body.dns.dmarc).to.be.an('object');
expect(response.body.dns.dmarc.expected).to.eql('v=DMARC1; p=reject; pct=100');
expect(response.body.dns.dmarc.status).to.eql(false);
expect(response.body.dns.dmarc.status).to.eql('failed');
expect(response.body.dns.dmarc.value).to.eql('v=DMARC2; p=reject; pct=100');
expect(response.body.dns.mx).to.be.an('object');
expect(response.body.dns.mx.status).to.eql(true);
expect(response.body.dns.mx.status).to.eql('passed');
expect(response.body.dns.mx.expected).to.eql(`10 ${mailFqdn}.`);
expect(response.body.dns.mx.value).to.eql(`20 ${mailFqdn}. 10 some.other.server.`);
expect(response.body.dns.ptr4).to.be.an('object');
expect(response.body.dns.ptr4.expected).to.eql(mailFqdn);
expect(response.body.dns.ptr4.status).to.eql(false);
expect(response.body.dns.ptr4.status).to.eql('failed');
// expect(response.body.ptr.value).to.eql(null); this will be anything random
expect(response.body.relay).to.be.an('object');
@@ -237,7 +237,7 @@ describe('Mail API', function () {
expect(response.body.dns.spf.type).to.eql('TXT');
expect(response.body.dns.spf.value).to.eql(`v=spf1 a:example.com a:${mailFqdn} ~all`);
expect(response.body.dns.spf.expected).to.eql(`v=spf1 a:example.com a:${mailFqdn} ~all`);
expect(response.body.dns.spf.status).to.eql(true);
expect(response.body.dns.spf.status).to.eql('passed');
});
it('succeeds with modified DMARC1 values', async function () {
@@ -252,7 +252,7 @@ describe('Mail API', function () {
expect(response.body.dns.dmarc).to.be.an('object');
expect(response.body.dns.dmarc.expected).to.eql('v=DMARC1; p=reject; pct=100');
expect(response.body.dns.dmarc.status).to.eql(true);
expect(response.body.dns.dmarc.status).to.eql('passed');
expect(response.body.dns.dmarc.value).to.eql('v=DMARC1; p=reject; rua=mailto:rua@example.com; pct=100');
});
@@ -274,22 +274,22 @@ describe('Mail API', function () {
expect(response.body.dns.dkim.type).to.eql('TXT');
expect(response.body.dns.dkim.value).to.eql(`v=DKIM1; t=s; p=${publicKey}`);
expect(response.body.dns.dkim.expected).to.eql(`v=DKIM1; t=s; p=${publicKey}`);
expect(response.body.dns.dkim.status).to.eql(true);
expect(response.body.dns.dkim.status).to.eql('passed');
expect(response.body.dns.spf).to.be.an('object');
expect(response.body.dns.spf.domain).to.eql(spfDomain);
expect(response.body.dns.spf.type).to.eql('TXT');
expect(response.body.dns.spf.value).to.eql(`v=spf1 a:${dashboardFqdn} ~all`);
expect(response.body.dns.spf.expected).to.eql(`v=spf1 a:${dashboardFqdn} ~all`);
expect(response.body.dns.spf.status).to.eql(true);
expect(response.body.dns.spf.status).to.eql('passed');
expect(response.body.dns.dmarc).to.be.an('object');
expect(response.body.dns.dmarc.expected).to.eql('v=DMARC1; p=reject; pct=100');
expect(response.body.dns.dmarc.status).to.eql(true);
expect(response.body.dns.dmarc.status).to.eql('passed');
expect(response.body.dns.dmarc.value).to.eql('v=DMARC1; p=reject; pct=100');
expect(response.body.dns.mx).to.be.an('object');
expect(response.body.dns.mx.status).to.eql(true);
expect(response.body.dns.mx.status).to.eql('passed');
expect(response.body.dns.mx.expected).to.eql(`10 ${mailFqdn}.`);
expect(response.body.dns.mx.value).to.eql(`10 ${mailFqdn}.`);
});