Compare commits

...

1 Commits

6 changed files with 25 additions and 26 deletions
-3
View File
@@ -24,9 +24,6 @@ __pycache__/
# Approved, versioned brand resources are package source assets. # Approved, versioned brand resources are package source assets.
!packages/brand/assets/**/*.png !packages/brand/assets/**/*.png
!packages/brand/docs/logo-preview.png !packages/brand/docs/logo-preview.png
/apps/studio/public/brand/
/apps/studio/public/favicon.ico
/apps/studio/public/apple-touch-icon.png
/apps/dashboard/public/brand/ /apps/dashboard/public/brand/
/apps/dashboard/public/favicon.ico /apps/dashboard/public/favicon.ico
/apps/dashboard/public/apple-touch-icon.png /apps/dashboard/public/apple-touch-icon.png
+21 -19
View File
@@ -1,6 +1,7 @@
# Email accounts # Email accounts
`/account` offers registration, password login, email verification/resend, and logout. `/account` offers registration, password login, email verification/resend, password
recovery, and logout.
`/api/account/session` returns the current account; other actions use same-origin POST. `/api/account/session` returns the current account; other actions use same-origin POST.
Passwords require at least 12 characters and at most 256 UTF-8 bytes. Only verified Passwords require at least 12 characters and at most 256 UTF-8 bytes. Only verified
accounts can log in. Verification links expire after 30 minutes and are consumed once. accounts can log in. Verification links expire after 30 minutes and are consumed once.
@@ -9,24 +10,22 @@ Only token SHA-256 digests are stored. Passwords use individually salted scrypt.
## Runtime configuration ## Runtime configuration
The existing production deployment reads `/etc/prompt.env` on ces-control. Set its Use [the environment example](.env.example) and the root README to configure the Web,
ownership to root and mode to 0600. The operator should update SMTP_PASSWORD there bootstrap, and worker processes. The repository no longer supplies CI/CD or Compose
through a secure remote session, without putting it in command arguments, repository, deployment configuration. Keep SMTP_PASSWORD and other credentials in the process
CI output, release.env, or chat. Existing compose deployment reads this file without environment or an operator-managed private file with restricted permissions, outside
copying credentials into the release directory. Do not run `docker compose config` the repository. Do not put credentials in command arguments, logs, or chat.
without `--quiet` against the production environment because interpolation shows secrets.
Docker administrators can inspect container environment; access to Docker is privileged.
Set ACCOUNT_PUBLIC_ORIGIN to the exact browser origin and SMTP_HOST=smtpdm.aliyun.com, Set ACCOUNT_PUBLIC_ORIGIN to the exact browser origin and configure SMTP_HOST,
SMTP_PORT=465, SMTP_USERNAME and SMTP_FROM=noreply@notice.entroia.com. TLS certificate SMTP_PORT, SMTP_USERNAME, SMTP_FROM, and SMTP_PASSWORD for the mail provider. TLS certificate
validation stays enabled. Missing SMTP configuration returns a generic service failure; validation stays enabled. Missing SMTP configuration returns a generic service failure;
resend with the registration password can recover an account whose initial delivery failed. resend with the registration password can recover an account whose initial delivery failed.
Keep AUTH_CONFIG_FILE configured for administrator access. Missing administrator Keep AUTH_CONFIG_FILE configured for administrator access. Missing administrator
configuration fails closed. AUTH_DISABLED_FOR_TESTS is false by default and is enabled configuration fails closed. AUTH_DISABLED_FOR_TESTS is false by default and is enabled
only by the disposable legacy integration stack; never enable it in production. only for an explicitly isolated test environment; never enable it in production.
Email account cookies never satisfy administrator authorization. With the current HTTP Email account cookies never satisfy administrator authorization. With the current HTTP
acceptance origin use AUTH_COOKIE_SECURE=false; use true after enabling HTTPS. runtime origin use AUTH_COOKIE_SECURE=false; use true for HTTPS.
Limits persist in PostgreSQL: 10 logins and 3 registration/resend attempts per email per Limits persist in PostgreSQL: 10 logins and 3 registration/resend attempts per email per
15 minutes, plus 300 requests per 15 minutes globally. ACCOUNT_TRUST_PROXY defaults 15 minutes, plus 300 requests per 15 minutes globally. ACCOUNT_TRUST_PROXY defaults
@@ -37,13 +36,16 @@ response for existing/unknown emails, and login uses a dummy KDF for unknown acc
The rate limit itself can reveal recent activity for a known email; it does not reveal The rate limit itself can reveal recent activity for a known email; it does not reveal
whether an account exists. Synchronous SMTP latency can still expose a timing side channel; whether an account exists. Synchronous SMTP latency can still expose a timing side channel;
a durable asynchronous mail queue would be needed to fully decouple delivery timing. a durable asynchronous mail queue would be needed to fully decouple delivery timing.
Logout remains available when login/mail limits are exhausted. No password recovery or Logout remains available when login/mail limits are exhausted. Password recovery uses
account deletion is included. a single-use reset link that expires after 30 minutes; resetting the password revokes
existing sessions. Account deletion is not included.
## Verification ## Verification
ces-control runs crypto/origin tests, PostgreSQL verification-token replay races, There is no automatic verification pipeline. Turbo dry-runs only verify task planning;
expired/revoked sessions, concurrent limit consumption and unverified login rejection. they do not exercise account behavior. Runtime verification requires an explicitly
Production-auth exercises verify that account cookies cannot authorize legacy writes. authorized environment with PostgreSQL and SMTP configuration. Cover token replay,
Actual SMTP delivery and visual acceptance at http://8.211.154.134:18131/account require expired/revoked sessions, concurrent limits, password recovery, and rejection of
operator runtime configuration and the normal manually approved deployment. unverified logins. Verify separately that account cookies cannot authorize administrator
writes, that real email is delivered, and that the account page works in a browser.
Report the checks actually executed; merging into `dev` does not deploy the application.
+1 -1
View File
@@ -1,4 +1,4 @@
/** The approved mark is copied from @endoleap/brand during the remote build. */ /** The approved mark is copied from @endoleap/brand by brand:prepare. */
export function Brand({ compact = false, markOnly = false }: { compact?: boolean; markOnly?: boolean }) { export function Brand({ compact = false, markOnly = false }: { compact?: boolean; markOnly?: boolean }) {
return <span className="endoleap-brand"><img src="/brand/logo-light.svg" className="endoleap-mark endoleap-mark-light" alt="" width={32} height={32}/><img src="/brand/logo-dark.svg" className="endoleap-mark endoleap-mark-dark" alt="" width={32} height={32}/>{!markOnly && <span className="endoleap-wordmark">啡跃{!compact && <small>Endoleap</small>}</span>}</span>; return <span className="endoleap-brand"><img src="/brand/logo-light.svg" className="endoleap-mark endoleap-mark-light" alt="" width={32} height={32}/><img src="/brand/logo-dark.svg" className="endoleap-mark endoleap-mark-dark" alt="" width={32} height={32}/>{!markOnly && <span className="endoleap-wordmark">啡跃{!compact && <small>Endoleap</small>}</span>}</span>;
} }
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
/** The approved mark is copied from @endoleap/brand during the remote build. */ /** The approved mark is copied from @endoleap/brand by brand:prepare. */
export function Brand({ compact = false }: { compact?: boolean }) { export function Brand({ compact = false }: { compact?: boolean }) {
return <span className="endoleap-brand"><img src="/studio/brand/logo-light.svg" className="endoleap-mark endoleap-mark-light" alt="" width={32} height={32}/><img src="/studio/brand/logo-dark.svg" className="endoleap-mark endoleap-mark-dark" alt="" width={32} height={32}/><span className="endoleap-wordmark">啡跃{!compact && <small>Endoleap</small>}</span></span>; return <span className="endoleap-brand"><img src="/studio/brand/logo-light.svg" className="endoleap-mark endoleap-mark-light" alt="" width={32} height={32}/><img src="/studio/brand/logo-dark.svg" className="endoleap-mark endoleap-mark-dark" alt="" width={32} height={32}/><span className="endoleap-wordmark">啡跃{!compact && <small>Endoleap</small>}</span></span>;
} }
+1 -1
View File
@@ -1,4 +1,4 @@
// Run in the confirmed remote build (or an explicitly authorized dev environment). // Called by the consuming application's dev and build scripts.
import { copyFile, mkdir, readFile } from 'node:fs/promises'; import { copyFile, mkdir, readFile } from 'node:fs/promises';
import { resolve } from 'node:path'; import { resolve } from 'node:path';
const app = JSON.parse(await readFile('package.json', 'utf8')); const app = JSON.parse(await readFile('package.json', 'utf8'));