Auth hardening: - payments: per-customer JWT authorization on dual-use /payments routes (balance/methods/invoice/checkout/setup/portal/toggle-ppa) via authorizeCustomer + PAYMENTS_AUTH=enforce; portal retains+sends magic-link JWT (sessionStorage) - hub: fail-closed Stripe webhook, /accept/doc-pdf IDOR gate, telephony field-name guard (SQLi), modem-bridge private-IP guard (SSRF), ALWAYS_ENFORCE expansion Leaked-credential cleanup (token already rotated in ERPNext): - de-hardcode ERPNext API token -> env in bulk_submit.py, import_items.py, apps/client/deploy.sh; placeholder in apps/ops/infra/nginx.conf (nginx injects) - ops prod build no longer bakes VITE_ERP_TOKEN (.env.production empty) - de-hardcode legacy DB password -> env in import_items.py - gitignore legacy migration PII exports (tsv/json) Conversations/UI: - floating (un-docked) conversation panel; full-width mailbox - per-message real sender from email headers; unified scroll; header spacing - campaign pre-send review (subject/from/channel), Gmail send channel, clone-as-draft Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7 lines
420 B
Plaintext
7 lines
420 B
Plaintext
# Production builds MUST NOT bake the ERPNext token into the JS bundle.
|
|
# In prod the ops-frontend nginx injects `Authorization: token …` server-side
|
|
# (see apps/ops/infra/nginx.conf). The client calls same-origin /ops/api and never
|
|
# holds a token. Leaving this empty keeps the admin key out of the shipped bundle.
|
|
# Local dev still uses apps/ops/.env (which may set VITE_ERP_TOKEN for `quasar dev`).
|
|
VITE_ERP_TOKEN=
|