diff --git a/src/modules/settings/AuthenticationTab.tsx b/src/modules/settings/AuthenticationTab.tsx index 28ba315a1..4d3c26cf2 100644 --- a/src/modules/settings/AuthenticationTab.tsx +++ b/src/modules/settings/AuthenticationTab.tsx @@ -105,10 +105,12 @@ export default function AuthenticationTab({ account }: Readonly) { peerInactivityExpirationEnabled, setPeerInactivityExpirationEnabled, peerInactivityExpiresIn, + setPeerInactivityExpiresIn, peerInactivityExpireInterval, + setPeerInactivityExpireInterval, ] = useExpirationState({ enabled: account.settings.peer_inactivity_expiration_enabled, - expirationInSeconds: account.settings.peer_inactivity_expiration || 600, + expirationInSeconds: account.settings.peer_inactivity_expiration ?? 600, timeRange: ["minutes", "hours", "days"], }); @@ -129,6 +131,18 @@ export default function AuthenticationTab({ account }: Readonly) { isLocalMFAEnabled, ]); + // An empty/cleared input converts to NaN; block saving until it's a + // positive number so the API never receives an invalid duration. + const inactivityExpirationSeconds = convertToSeconds( + peerInactivityExpiresIn, + peerInactivityExpireInterval, + ); + const isInactivityExpirationInvalid = + loginExpiration && + peerInactivityExpirationEnabled && + (!Number.isFinite(inactivityExpirationSeconds) || + inactivityExpirationSeconds <= 0); + const saveChanges = async () => { const expiration = convertToSeconds(expiresIn, expireInterval); @@ -145,7 +159,9 @@ export default function AuthenticationTab({ account }: Readonly) { peer_inactivity_expiration_enabled: loginExpiration ? peerInactivityExpirationEnabled : false, - peer_inactivity_expiration: 600, + peer_inactivity_expiration: peerInactivityExpirationEnabled + ? inactivityExpirationSeconds + : account.settings.peer_inactivity_expiration ?? 600, extra: { ...account.settings?.extra, peer_approval_enabled: isAnyIntegrationEnabled @@ -219,7 +235,11 @@ export default function AuthenticationTab({ account }: Readonly) {