Files
ihasmail-inbuxa/server/src/domainrouting.test.ts
T
jcoffey-dev bb25355c23 AGPL source offer and name cleanup
Every build writes the exact source it was built from, uncommitted work and
new files included, as source.tar.gz next to the app, named after that tree.
Docker builds, which have no git, pack the build context and name it by a
hash of its files. The sign-in page and Settings > About link to it instead of
a repository that can drift.

What users, operators and packagers see no longer names the upstream server:
- interface text, in all nine catalogues, with a token-session line for
  Security;
- server messages;
- the settings, now MAIL_SERVER_URL, MAIL_SERVERS_FILE, ADMIN_URL and
  MAIL_SERVER_FOLLOW_ADVERTISED_URLS, and mail-servers.example.json;
- the Tenants notice, which is gone;
- the README, CONTRIBUTING and SECURITY.

ihasmail's own FEATURES, KNOWN-ISSUES and ROADMAP stay with public ihasmail,
and INBUXA.md is folded into the README.
2026-09-19 00:13:12 -07:00

68 lines
2.5 KiB
TypeScript

import { test } from "node:test";
import assert from "node:assert/strict";
process.env.MAIL_SERVER_URL = "https://default.example";
const { upstreamFor } = await import("./upstream.js");
const { config } = await import("./config.js");
/**
* Which Stalwart a username goes to (#238).
*
* `MAIL_SERVER_URL` is required and is the default. The mapping only adds domains
* that go elsewhere, so an installation with no mapping behaves exactly as it
* always has -- which is what these first cases pin.
*/
test("with no mapping at all, everything goes to the default", () => {
assert.deepEqual(config.stalwartServers, {});
assert.equal(upstreamFor("[email protected]"), "https://default.example");
assert.equal(upstreamFor("[email protected]"), "https://default.example");
});
test("a bare username has no domain to map, so it goes to the default", () => {
// Stalwart accepts a login with no domain at all.
assert.equal(upstreamFor("demo"), "https://default.example");
assert.equal(upstreamFor(""), "https://default.example");
});
test("a mapped domain goes to its own server", () => {
config.stalwartServers["mapped.test"] = "https://mail.mapped.test";
try {
assert.equal(upstreamFor("[email protected]"), "https://mail.mapped.test");
} finally {
delete config.stalwartServers["mapped.test"];
}
});
test("an unmapped domain still goes to the default while others are mapped", () => {
config.stalwartServers["mapped.test"] = "https://mail.mapped.test";
try {
assert.equal(upstreamFor("[email protected]"), "https://default.example");
} finally {
delete config.stalwartServers["mapped.test"];
}
});
test("the domain is matched however it was typed", () => {
// Keys are normalized on load; the username has to be normalized the same
// way or a mapping silently never matches.
config.stalwartServers["mapped.test"] = "https://mail.mapped.test";
try {
assert.equal(upstreamFor("[email protected]"), "https://mail.mapped.test");
assert.equal(upstreamFor("[email protected]."), "https://mail.mapped.test", "root dot");
assert.equal(upstreamFor("someone@ mapped.test "), "https://mail.mapped.test", "stray spaces");
} finally {
delete config.stalwartServers["mapped.test"];
}
});
test("an address with an @ in the local part maps on the last one", () => {
config.stalwartServers["mapped.test"] = "https://mail.mapped.test";
try {
assert.equal(upstreamFor('"odd@name"@mapped.test'), "https://mail.mapped.test");
} finally {
delete config.stalwartServers["mapped.test"];
}
});