From a45d64d4ed52c7f987f3c3306004eea51cc4b848 Mon Sep 17 00:00:00 2001 From: Ronni Baslund Date: Thu, 11 Jun 2026 08:41:19 +0200 Subject: [PATCH] fix(portal): Apple profile labels derive from the user's domain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 'dezky mail (…)' in the customer's account list is the same white-label leak as 'Stalwart Calendar' one layer up — partner tenants must see THEIR domain, not the platform brand. Every user-visible label in the .mobileconfig (account descriptions, payload names, organization) now derives from the address's own domain. --- .../portal/server/api/apple-mailconfig.get.ts | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/apps/portal/server/api/apple-mailconfig.get.ts b/apps/portal/server/api/apple-mailconfig.get.ts index 82a202d..35221cf 100644 --- a/apps/portal/server/api/apple-mailconfig.get.ts +++ b/apps/portal/server/api/apple-mailconfig.get.ts @@ -41,6 +41,11 @@ export default defineEventHandler(async (event) => { const mailHost = new URL(useRuntimeConfig().public.mailUrl as string).host // The regex above guarantees an @, but noUncheckedIndexedAccess doesn't know. const localPart = email.split('@')[0] ?? email + // All user-visible labels derive from the address's own domain — this is a + // white-label platform, so neither "dezky" nor "Stalwart" may appear in a + // customer's account list. + const domain = email.split('@')[1] ?? mailHost + const d = xmlEscape(domain) const accountUuid = randomUUID() const caldavUuid = randomUUID() const carddavUuid = randomUUID() @@ -56,7 +61,7 @@ export default defineEventHandler(async (event) => { PayloadContent - EmailAccountDescriptiondezky mail (${e}) + EmailAccountDescription${d} EmailAccountName${n} EmailAccountTypeEmailTypeIMAP EmailAddress${e} @@ -75,33 +80,33 @@ export default defineEventHandler(async (event) => { PreventMove SMIMEEnabled PayloadDescriptionConfigures the ${e} mail account. - PayloadDisplayNamedezky mail + PayloadDisplayNameMail (${d}) PayloadIdentifiereu.dezky.mail.${xmlEscape(localPart)} PayloadTypecom.apple.mail.managed PayloadUUID${accountUuid} PayloadVersion1 - CalDAVAccountDescriptiondezky calendar (${e}) + CalDAVAccountDescription${d} calendar CalDAVHostName${h} CalDAVPort443 CalDAVUseSSL CalDAVUsername${e} PayloadDescriptionConfigures the ${e} calendar account. - PayloadDisplayNamedezky calendar + PayloadDisplayNameCalendar (${d}) PayloadIdentifiereu.dezky.caldav.${xmlEscape(localPart)} PayloadTypecom.apple.caldav.account PayloadUUID${caldavUuid} PayloadVersion1 - CardDAVAccountDescriptiondezky contacts (${e}) + CardDAVAccountDescription${d} contacts CardDAVHostName${h} CardDAVPort443 CardDAVUseSSL CardDAVUsername${e} PayloadDescriptionConfigures the ${e} contacts account. - PayloadDisplayNamedezky contacts + PayloadDisplayNameContacts (${d}) PayloadIdentifiereu.dezky.carddav.${xmlEscape(localPart)} PayloadTypecom.apple.carddav.account PayloadUUID${carddavUuid} @@ -109,9 +114,9 @@ export default defineEventHandler(async (event) => { PayloadDescriptionSets up ${e} in Apple Mail, Calendar and Contacts. You'll be asked for the mailbox password during installation. - PayloadDisplayNamedezky mail — ${e} + PayloadDisplayName${d} — mail, calendar & contacts (${e}) PayloadIdentifiereu.dezky.profile.${xmlEscape(localPart)} - PayloadOrganizationdezky + PayloadOrganization${d} PayloadRemovalDisallowed PayloadTypeConfiguration PayloadUUID${profileUuid}