Fork Stalwart WebUI v1.0.11 as INBUXA Admin

- One edition: whatever edition the server reports, nothing is hidden or
  disabled as Enterprise-only (accountStore.setAccountInfo).
- INBUXA branding: name, logo (mark plus a text-colored wordmark), favicon,
  page titles, setup wizard text, and ihasmail's palette in light and dark.
- Two-factor setup names INBUXA as the issuer and drops the image parameter
  that made authenticator apps fetch a logo from a third-party site.
- Runs apart from the server: the server address can be set at deploy time
  with <meta name="api-base-url">, and OAuth endpoints the server returns as
  relative paths are resolved against the server's address, not the page's.
  Verified end to end against a separate inbuxa-server.
- Upstream's release workflow moved to .github-upstream so it never runs.

Upstream's history contains no Enterprise-only code, so this is an ordinary
fork. upstream is a fetch-only remote.
This commit is contained in:
2026-09-18 12:00:54 -07:00
parent dc462b137f
commit 1d72ef3aa1
22 changed files with 197 additions and 252 deletions
+6 -3
View File
@@ -33,7 +33,8 @@ describe('accountStore', () => {
const state = useAccountStore.getState();
expect(state.permissions).toEqual(['b', 'c']);
expect(state.edition).toBe('oss');
// INBUXA: one edition. A server reporting 'oss' still unlocks everything.
expect(state.edition).toBe('enterprise');
expect(state.locale).toBe('ja');
});
@@ -101,9 +102,11 @@ describe('accountStore', () => {
expect(useAccountStore.getState().edition).toBe('enterprise');
});
it('can be changed to oss', () => {
it('is never oss or community, whatever the server reports (INBUXA: one edition)', () => {
useAccountStore.getState().setAccountInfo([], 'oss', 'en');
expect(useAccountStore.getState().edition).toBe('oss');
expect(useAccountStore.getState().edition).toBe('enterprise');
useAccountStore.getState().setAccountInfo([], 'community', 'en');
expect(useAccountStore.getState().edition).toBe('enterprise');
});
});
});
+5 -2
View File
@@ -23,8 +23,11 @@ export const useAccountStore = create<AccountState>()((set, get) => ({
edition: 'community',
locale: 'en',
setAccountInfo: (permissions, edition, locale) => {
set({ permissions, edition, locale });
setAccountInfo: (permissions, _edition, locale) => {
// INBUXA has one edition, with every feature. Whatever the server reports,
// nothing is hidden or disabled as Enterprise-only. Features the server
// hasn't rebuilt yet answer that for themselves.
set({ permissions, edition: 'enterprise', locale });
},
hasPermission: (perm) => {