From 0038ff3a34647cf1aa458a6291dc90de849ba4bb Mon Sep 17 00:00:00 2001
From: abrichr
+ Authenticator-app two-factor authentication is + available to every account and enforced for + privileged access. The platform-admin console + always requires both the server-side administrator + allowlist and a current two-factor session. The + default policy also requires two-factor + authentication for organization owners and admins. + When a signed-in session needs this additional + assurance, Cloud asks for one current 6-digit code + and returns the user to the protected page after it + is accepted. +
++ The signed-in account menu keeps identity and + organization context visible. It provides Security + & 2FA, organization switching when an account + belongs to more than one workspace, and an explicit + sign-out action. The{' '} + + account-security guide + {' '} + covers enrollment, step-up, and account or workspace + switching. +
What is not{' '}
yet available:{' '}
diff --git a/tests/securityMfa.test.js b/tests/securityMfa.test.js
new file mode 100644
index 0000000..f0bfb8a
--- /dev/null
+++ b/tests/securityMfa.test.js
@@ -0,0 +1,16 @@
+import assert from 'node:assert/strict'
+import fs from 'node:fs'
+import path from 'node:path'
+import test from 'node:test'
+import { fileURLToPath } from 'node:url'
+
+const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
+const security = fs.readFileSync(path.join(root, 'pages/security.js'), 'utf8')
+
+test('trust center describes the privileged MFA and account-menu contract', () => {
+ assert.match(security, /two-factor authentication is[\s\S]*enforced for[\s\S]*privileged access/i)
+ assert.match(security, /platform-admin console[\s\S]*server-side administrator[\s\S]*current two-factor session/i)
+ assert.match(security, /one current 6-digit code[\s\S]*returns the user to the protected page/i)
+ assert.match(security, /organization switching[\s\S]*explicit[\s\S]*sign-out action/i)
+ assert.match(security, /docs\.openadapt\.ai\/guides\/account-security/)
+})
From bc39a9eebc4a19d8d0e955a6df80a0d560bcd8f5 Mon Sep 17 00:00:00 2001
From: abrichr
Authenticator-app two-factor authentication is
available to every account and enforced for
- privileged access. The platform-admin console
+ platform administration. The platform-admin console
always requires both the server-side administrator
allowlist and a current two-factor session. The
- default policy also requires two-factor
- authentication for organization owners and admins.
When a signed-in session needs this additional
assurance, Cloud asks for one current 6-digit code
and returns the user to the protected page after it
diff --git a/tests/securityMfa.test.js b/tests/securityMfa.test.js
index f0bfb8a..5cd3389 100644
--- a/tests/securityMfa.test.js
+++ b/tests/securityMfa.test.js
@@ -7,10 +7,11 @@ import { fileURLToPath } from 'node:url'
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
const security = fs.readFileSync(path.join(root, 'pages/security.js'), 'utf8')
-test('trust center describes the privileged MFA and account-menu contract', () => {
- assert.match(security, /two-factor authentication is[\s\S]*enforced for[\s\S]*privileged access/i)
+test('trust center describes the platform-admin MFA and account-menu contract', () => {
+ assert.match(security, /two-factor authentication is[\s\S]*enforced for[\s\S]*platform administration/i)
assert.match(security, /platform-admin console[\s\S]*server-side administrator[\s\S]*current two-factor session/i)
assert.match(security, /one current 6-digit code[\s\S]*returns the user to the protected page/i)
assert.match(security, /organization switching[\s\S]*explicit[\s\S]*sign-out action/i)
assert.match(security, /docs\.openadapt\.ai\/guides\/account-security/)
+ assert.doesNotMatch(security, /default policy also requires two-factor[\s\S]*organization owners/i)
})
From 6a826b325cdd96ebd2ebf0013fb25bbac63a021c Mon Sep 17 00:00:00 2001
From: abrichr
+ Enrollment also produces one-time recovery codes.
+ If an authenticator is lost, a recovery code removes
+ the inaccessible factors and returns the signed-in
+ user to Security & 2FA to enroll a replacement.
+ Recovery never grants the protected session by
+ itself.
+
The signed-in account menu keeps identity and
organization context visible. It provides Security
@@ -966,8 +974,8 @@ export default function SecurityPage() {
>
account-security guide
{' '}
- covers enrollment, step-up, and account or workspace
- switching.
+ covers enrollment, step-up, recovery, and account or
+ workspace switching.
What is not{' '}
diff --git a/tests/securityMfa.test.js b/tests/securityMfa.test.js
index 5cd3389..28dd35a 100644
--- a/tests/securityMfa.test.js
+++ b/tests/securityMfa.test.js
@@ -11,6 +11,7 @@ test('trust center describes the platform-admin MFA and account-menu contract',
assert.match(security, /two-factor authentication is[\s\S]*enforced for[\s\S]*platform administration/i)
assert.match(security, /platform-admin console[\s\S]*server-side administrator[\s\S]*current two-factor session/i)
assert.match(security, /one current 6-digit code[\s\S]*returns the user to the protected page/i)
+ assert.match(security, /recovery code[\s\S]*returns[\s\S]*signed-in[\s\S]*user to Security[\s\S]*never grants the protected session/i)
assert.match(security, /organization switching[\s\S]*explicit[\s\S]*sign-out action/i)
assert.match(security, /docs\.openadapt\.ai\/guides\/account-security/)
assert.doesNotMatch(security, /default policy also requires two-factor[\s\S]*organization owners/i)
From f5f2646ceecb37f9aaf7d511086894e06e914a1f Mon Sep 17 00:00:00 2001
From: abrichr
Enrollment also produces one-time recovery codes.
If an authenticator is lost, a recovery code removes
- the inaccessible factors and returns the signed-in
- user to Security & 2FA to enroll a replacement.
- Recovery never grants the protected session by
- itself.
+ the inaccessible factors. Factor removal invalidates
+ active sessions, so Cloud explicitly returns through
+ sign-in and then to Security & 2FA to enroll a
+ replacement. Recovery never grants the protected
+ session by itself.
The signed-in account menu keeps identity and
diff --git a/tests/securityMfa.test.js b/tests/securityMfa.test.js
index 28dd35a..733cb22 100644
--- a/tests/securityMfa.test.js
+++ b/tests/securityMfa.test.js
@@ -11,7 +11,7 @@ test('trust center describes the platform-admin MFA and account-menu contract',
assert.match(security, /two-factor authentication is[\s\S]*enforced for[\s\S]*platform administration/i)
assert.match(security, /platform-admin console[\s\S]*server-side administrator[\s\S]*current two-factor session/i)
assert.match(security, /one current 6-digit code[\s\S]*returns the user to the protected page/i)
- assert.match(security, /recovery code[\s\S]*returns[\s\S]*signed-in[\s\S]*user to Security[\s\S]*never grants the protected session/i)
+ assert.match(security, /recovery code[\s\S]*invalidates[\s\S]*returns through[\s\S]*sign-in[\s\S]*Security[\s\S]*never grants[\s\S]*protected[\s\S]*session/i)
assert.match(security, /organization switching[\s\S]*explicit[\s\S]*sign-out action/i)
assert.match(security, /docs\.openadapt\.ai\/guides\/account-security/)
assert.doesNotMatch(security, /default policy also requires two-factor[\s\S]*organization owners/i)