Compare commits
2
Commits
0ea86b6be0
...
0191f7e10c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0191f7e10c | ||
|
|
7e3418079c |
@@ -336,7 +336,7 @@ export function BootstrapWizard() {
|
|||||||
<WizardShell>
|
<WizardShell>
|
||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-2xl font-semibold tracking-tight">{t('bootstrap.welcome', 'Welcome to INBUXA')}</h2>
|
<h2 className="text-2xl font-semibold tracking-tight">{t('bootstrap.welcome', 'Welcome to inbuxa')}</h2>
|
||||||
<p className="text-sm text-muted-foreground mt-1">
|
<p className="text-sm text-muted-foreground mt-1">
|
||||||
{t('bootstrap.welcomeSubtitle', "Let's get your server set up.")}
|
{t('bootstrap.welcomeSubtitle', "Let's get your server set up.")}
|
||||||
</p>
|
</p>
|
||||||
@@ -471,7 +471,7 @@ function SuccessScreen({
|
|||||||
'bootstrap.credentialsCreated',
|
'bootstrap.credentialsCreated',
|
||||||
'Your administrator account has been created. Write these down now: the password will not be shown again.',
|
'Your administrator account has been created. Write these down now: the password will not be shown again.',
|
||||||
)
|
)
|
||||||
: t('bootstrap.configuredSuccessfully', 'INBUXA has been configured successfully.')}
|
: t('bootstrap.configuredSuccessfully', 'inbuxa has been configured successfully.')}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -503,7 +503,7 @@ function SuccessScreen({
|
|||||||
<span className="font-medium">{t('bootstrap.nextStepLabel', 'Next step:')}</span>{' '}
|
<span className="font-medium">{t('bootstrap.nextStepLabel', 'Next step:')}</span>{' '}
|
||||||
{t(
|
{t(
|
||||||
'bootstrap.nextStepBody',
|
'bootstrap.nextStepBody',
|
||||||
'restart INBUXA for the new configuration to take effect. Once restarted, sign in with the credentials above to continue administering your server.',
|
'restart inbuxa for the new configuration to take effect. Once restarted, sign in with the credentials above to continue administering your server.',
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export function DefaultLogo() {
|
|||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="165 35 616 130"
|
viewBox="165 35 616 130"
|
||||||
aria-label={t('logo.inbuxaAlt', 'INBUXA')}
|
aria-label={t('logo.inbuxaAlt', 'inbuxa')}
|
||||||
className="h-7 w-auto max-w-[320px]"
|
className="h-7 w-auto max-w-[320px]"
|
||||||
>
|
>
|
||||||
<image x="165.85" y="35.00" width="109.39" height="130.00" href={inbuxaMark} />
|
<image x="165.85" y="35.00" width="109.39" height="130.00" href={inbuxaMark} />
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ function buildOtpAuthUrl(totp: OTPAuth.TOTP): string {
|
|||||||
|
|
||||||
function generateTotp(): { totp: OTPAuth.TOTP; url: string } {
|
function generateTotp(): { totp: OTPAuth.TOTP; url: string } {
|
||||||
const totp = new OTPAuth.TOTP({
|
const totp = new OTPAuth.TOTP({
|
||||||
issuer: 'INBUXA',
|
issuer: 'inbuxa',
|
||||||
label: 'account',
|
label: 'account',
|
||||||
algorithm: 'SHA1',
|
algorithm: 'SHA1',
|
||||||
digits: 6,
|
digits: 6,
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ export function TopBar() {
|
|||||||
</Link>
|
</Link>
|
||||||
</TooltipTrigger>
|
</TooltipTrigger>
|
||||||
<TooltipContent side="bottom">
|
<TooltipContent side="bottom">
|
||||||
{t('version.label', 'INBUXA Admin {{version}}', { version: __APP_VERSION__ })}
|
{t('version.label', 'inbuxa Admin {{version}}', { version: __APP_VERSION__ })}
|
||||||
</TooltipContent>
|
</TooltipContent>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</TooltipProvider>
|
</TooltipProvider>
|
||||||
|
|||||||
@@ -62,10 +62,10 @@ export function LegacyProtocolsBanner() {
|
|||||||
{t('legacyProtocols.bannerLead', 'Legacy mail protocols are')}{' '}
|
{t('legacyProtocols.bannerLead', 'Legacy mail protocols are')}{' '}
|
||||||
<strong>{t('legacyProtocols.bannerOff', 'off')}</strong>{' '}
|
<strong>{t('legacyProtocols.bannerOff', 'off')}</strong>{' '}
|
||||||
{off === 'server'
|
{off === 'server'
|
||||||
? t('legacyProtocols.bannerTail', 'on this server. Only INBUXA webmail and JMAP apps can sign in.')
|
? t('legacyProtocols.bannerTail', 'on this server. Only inbuxa webmail and JMAP apps can sign in.')
|
||||||
: t(
|
: t(
|
||||||
'legacyProtocols.bannerTailTenant',
|
'legacyProtocols.bannerTailTenant',
|
||||||
'for your organization. Only INBUXA webmail and JMAP apps can sign in.',
|
'for your organization. Only inbuxa webmail and JMAP apps can sign in.',
|
||||||
)}
|
)}
|
||||||
</span>
|
</span>
|
||||||
{off === 'server' && (
|
{off === 'server' && (
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ export function LegacyProtocolsPage() {
|
|||||||
<p className="text-muted-foreground">
|
<p className="text-muted-foreground">
|
||||||
{t(
|
{t(
|
||||||
'legacyProtocols.subtitle',
|
'legacyProtocols.subtitle',
|
||||||
'Turn off IMAP, POP3, ManageSieve and sending from mail apps, so that only INBUXA webmail and JMAP apps can reach this server.',
|
'Turn off IMAP, POP3, ManageSieve and sending from mail apps, so that only inbuxa webmail and JMAP apps can reach this server.',
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
</header>
|
</header>
|
||||||
@@ -206,7 +206,7 @@ function StatusCard({
|
|||||||
</p>
|
</p>
|
||||||
<p className="text-sm text-muted-foreground">
|
<p className="text-sm text-muted-foreground">
|
||||||
{off
|
{off
|
||||||
? t('legacyProtocols.statusOffBody', 'Only INBUXA webmail and JMAP apps can sign in.')
|
? t('legacyProtocols.statusOffBody', 'Only inbuxa webmail and JMAP apps can sign in.')
|
||||||
: t('legacyProtocols.statusOnBody', 'Mail apps can use IMAP, POP3 and ManageSieve.')}
|
: t('legacyProtocols.statusOnBody', 'Mail apps can use IMAP, POP3 and ManageSieve.')}
|
||||||
{policy.changedAt !== null && (
|
{policy.changedAt !== null && (
|
||||||
<>
|
<>
|
||||||
@@ -276,7 +276,7 @@ function ProtocolTable({ rows, off }: { rows: ProtocolRow[]; off: boolean }) {
|
|||||||
<p className="border-t bg-muted/30 px-4 py-2 text-xs text-muted-foreground">
|
<p className="border-t bg-muted/30 px-4 py-2 text-xs text-muted-foreground">
|
||||||
{t(
|
{t(
|
||||||
'legacyProtocols.lockNote',
|
'legacyProtocols.lockNote',
|
||||||
'Incoming mail (SMTP) and INBUXA webmail (JMAP) are locked open: closing them would stop mail arriving and lock everyone out, including you.',
|
'Incoming mail (SMTP) and inbuxa webmail (JMAP) are locked open: closing them would stop mail arriving and lock everyone out, including you.',
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ export function TenantLegacyProtocols({ tenantId }: { tenantId: string }) {
|
|||||||
{off
|
{off
|
||||||
? t(
|
? t(
|
||||||
'legacyProtocols.tenantOff',
|
'legacyProtocols.tenantOff',
|
||||||
'Off for {{organization}}. Only INBUXA webmail and JMAP apps can sign in to its domains.',
|
'Off for {{organization}}. Only inbuxa webmail and JMAP apps can sign in to its domains.',
|
||||||
{ organization: name },
|
{ organization: name },
|
||||||
)
|
)
|
||||||
: t(
|
: t(
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ export function Statement({ scope }: { scope: StatementScope }) {
|
|||||||
return (
|
return (
|
||||||
<section className="space-y-3 rounded-xl border border-amber-500/40 bg-amber-500/5 p-5 text-sm leading-relaxed">
|
<section className="space-y-3 rounded-xl border border-amber-500/40 bg-amber-500/5 p-5 text-sm leading-relaxed">
|
||||||
<p className="text-base font-semibold">
|
<p className="text-base font-semibold">
|
||||||
{t('legacyProtocols.statementTitle', 'Only INBUXA webmail and JMAP apps will work.')}
|
{t('legacyProtocols.statementTitle', 'Only inbuxa webmail and JMAP apps will work.')}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
{scope.kind === 'server'
|
{scope.kind === 'server'
|
||||||
@@ -152,7 +152,7 @@ export function Statement({ scope }: { scope: StatementScope }) {
|
|||||||
<li>
|
<li>
|
||||||
{t(
|
{t(
|
||||||
'legacyProtocols.statementFilters',
|
'legacyProtocols.statementFilters',
|
||||||
'Filters managed from a mail app (ManageSieve) will stop working. Filters set in INBUXA webmail keep working.',
|
'Filters managed from a mail app (ManageSieve) will stop working. Filters set in inbuxa webmail keep working.',
|
||||||
)}
|
)}
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@@ -164,7 +164,7 @@ export function Statement({ scope }: { scope: StatementScope }) {
|
|||||||
<li>
|
<li>
|
||||||
{t(
|
{t(
|
||||||
'legacyProtocols.statementWebmail',
|
'legacyProtocols.statementWebmail',
|
||||||
'People keep full access through INBUXA webmail, which can be installed as an app on phones and computers.',
|
'People keep full access through inbuxa webmail, which can be installed as an app on phones and computers.',
|
||||||
)}
|
)}
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -183,7 +183,7 @@ export function Statement({ scope }: { scope: StatementScope }) {
|
|||||||
<p>
|
<p>
|
||||||
{t(
|
{t(
|
||||||
'legacyProtocols.statementSubmission',
|
'legacyProtocols.statementSubmission',
|
||||||
'Sending from mail apps (SMTP submission) will stop working, but its ports stay open: mail apps will be told they cannot sign in. Incoming mail (SMTP) and INBUXA webmail (JMAP) are not affected and cannot be turned off here.',
|
'Sending from mail apps (SMTP submission) will stop working, but its ports stay open: mail apps will be told they cannot sign in. Incoming mail (SMTP) and inbuxa webmail (JMAP) are not affected and cannot be turned off here.',
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
{scope.kind === 'server' && (
|
{scope.kind === 'server' && (
|
||||||
@@ -191,7 +191,7 @@ export function Statement({ scope }: { scope: StatementScope }) {
|
|||||||
<strong>{t('legacyProtocols.firewallLead', 'This does not change your firewall or port forwarding.')}</strong>{' '}
|
<strong>{t('legacyProtocols.firewallLead', 'This does not change your firewall or port forwarding.')}</strong>{' '}
|
||||||
{t(
|
{t(
|
||||||
'legacyProtocols.firewallBody',
|
'legacyProtocols.firewallBody',
|
||||||
'INBUXA stops answering on these ports; anything that still routes them to this server — firewall rules, NAT port-forwards, a load balancer or proxy — is yours to reconcile.',
|
'inbuxa stops answering on these ports; anything that still routes them to this server — firewall rules, NAT port-forwards, a load balancer or proxy — is yours to reconcile.',
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -244,7 +244,7 @@ export function protocolRows(policy: ProtocolPolicy, listeners: PolicyListener[]
|
|||||||
},
|
},
|
||||||
// Incoming mail and JMAP are never the switch's to close (LP-3, "Not affected, ever").
|
// Incoming mail and JMAP are never the switch's to close (LP-3, "Not affected, ever").
|
||||||
{ key: 'smtp', label: 'SMTP (incoming mail)', state: 'locked', ports: [] },
|
{ key: 'smtp', label: 'SMTP (incoming mail)', state: 'locked', ports: [] },
|
||||||
{ key: 'jmap', label: 'JMAP (INBUXA webmail)', state: 'locked', ports: [] },
|
{ key: 'jmap', label: 'JMAP (inbuxa webmail)', state: 'locked', ports: [] },
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -104,7 +104,7 @@ export const PAGE_HELP: Record<string, PageHelp> = {
|
|||||||
about: 'Named sets of permissions. Give a role to a person to let them do more, or less.',
|
about: 'Named sets of permissions. Give a role to a person to let them do more, or less.',
|
||||||
},
|
},
|
||||||
'x:OAuthClient': {
|
'x:OAuthClient': {
|
||||||
about: 'Apps allowed to sign people in through this server, like INBUXA webmail and INBUXA Admin.',
|
about: 'Apps allowed to sign people in through this server, like inbuxa webmail and inbuxa Admin.',
|
||||||
},
|
},
|
||||||
'x:DkimSignature': {
|
'x:DkimSignature': {
|
||||||
about: 'The keys that sign outgoing mail so receivers can check it really came from you.',
|
about: 'The keys that sign outgoing mail so receivers can check it really came from you.',
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
|
|
||||||
const APP_NAME = 'INBUXA Admin';
|
const APP_NAME = 'inbuxa Admin';
|
||||||
|
|
||||||
export function useDocumentTitle(title?: string | null) {
|
export function useDocumentTitle(title?: string | null) {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
+5
-5
@@ -15,7 +15,7 @@
|
|||||||
"bootstrap": {
|
"bootstrap": {
|
||||||
"clipboardBlocked": "Your browser blocked clipboard access.",
|
"clipboardBlocked": "Your browser blocked clipboard access.",
|
||||||
"complete": "Setup complete",
|
"complete": "Setup complete",
|
||||||
"configuredSuccessfully": "INBUXA has been configured successfully.",
|
"configuredSuccessfully": "inbuxa has been configured successfully.",
|
||||||
"copyFailed": "Copy failed",
|
"copyFailed": "Copy failed",
|
||||||
"credentialsCreated": "Your administrator account has been created. Write these down now: the password will not be shown again.",
|
"credentialsCreated": "Your administrator account has been created. Write these down now: the password will not be shown again.",
|
||||||
"emptyForm": "Setup form is empty. The server did not return any bootstrap fields.",
|
"emptyForm": "Setup form is empty. The server did not return any bootstrap fields.",
|
||||||
@@ -23,11 +23,11 @@
|
|||||||
"failedToLoad": "Failed to load bootstrap state.",
|
"failedToLoad": "Failed to load bootstrap state.",
|
||||||
"finishSetup": "Finish setup",
|
"finishSetup": "Finish setup",
|
||||||
"loadingSetup": "Loading setup...",
|
"loadingSetup": "Loading setup...",
|
||||||
"nextStepBody": "restart INBUXA for the new configuration to take effect. Once restarted, sign in with the credentials above to continue administering your server.",
|
"nextStepBody": "restart inbuxa for the new configuration to take effect. Once restarted, sign in with the credentials above to continue administering your server.",
|
||||||
"nextStepLabel": "Next step:",
|
"nextStepLabel": "Next step:",
|
||||||
"noConfirm": "The server did not confirm the update.",
|
"noConfirm": "The server did not confirm the update.",
|
||||||
"stepOf": "Step {{current}} of {{total}}",
|
"stepOf": "Step {{current}} of {{total}}",
|
||||||
"welcome": "Welcome to INBUXA",
|
"welcome": "Welcome to inbuxa",
|
||||||
"welcomeSubtitle": "Let's get your server set up."
|
"welcomeSubtitle": "Let's get your server set up."
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
@@ -295,11 +295,11 @@
|
|||||||
},
|
},
|
||||||
"logo": {
|
"logo": {
|
||||||
"alt": "Logo",
|
"alt": "Logo",
|
||||||
"inbuxaAlt": "INBUXA"
|
"inbuxaAlt": "inbuxa"
|
||||||
},
|
},
|
||||||
"logout": "Logout",
|
"logout": "Logout",
|
||||||
"version": {
|
"version": {
|
||||||
"label": "INBUXA Admin {{version}}"
|
"label": "inbuxa Admin {{version}}"
|
||||||
},
|
},
|
||||||
"nav": {
|
"nav": {
|
||||||
"layoutLegacy": "Legacy",
|
"layoutLegacy": "Legacy",
|
||||||
|
|||||||
Reference in New Issue
Block a user