Phase 8: dependency security upgrades, user management, unsubscribe compliance #22
No reviewers
Labels
No labels
bug
dependencies
documentation
feature
phase-summary
security
testing
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
vmanne-poc/Postak!22
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "phase-8"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Phase 8 (milestone). First phase delivered through a PR; see
CONTRIBUTING.md.Summary
1. Dependency security (
2bbf466)@nestjs/config4,@nestjs/schedule6,@nestjs/jwt/@nestjs/passport11, nodemailer 6 → 10, Jest 29 → 30.npm audit --omit=dev: 12 vulnerabilities (4 high) → 0.2. Unsubscribe compliance fix (
70f4d1b), found while smoke-testing the upgradeList-Unsubscribe+ RFC 8058List-Unsubscribe-Post(one-click button in Gmail/Outlook).GETon the link shows a confirmation page;POSTunsubscribes, so link scanners can't unsubscribe people.3. User management (
2f3458d)POST /auth/change-password+ Account page. Ends other sessions (token version re-checked per request).GET/POST /users+ Users page: how accounts are created when registration is disabled.owner/memberroles + Members page. Only owners delete projects or manage members; a project always keeps one owner.4. Docs (
3a5339e): CHANGELOG 0.8.0 andCONTRIBUTING.md.5. Documentation moved out of the code repo (
8240d91)docs/internal/,docs/user/, andROADMAP.mdare removed from the repository and kept by the owners outside it.Breaking / behavior changes
GET /track/unsubscribe/:idno longer unsubscribes;POSTdoes. Links in already-sent emails still work (they open the confirmation page).owner, so nobody loses access today.User.tokenVersion(default 0). Applied automatically bydb push; existing sessions stay valid.How it was tested
docker compose run --rm --build -T backend-test: 45 unit + 29 e2e passing (was 43 + 22). New e2e: admin accounts (incl. 403 for non-root, case-insensitive duplicates), members add/role/remove/leave, owner-only actions, last-owner protection, password change ending old sessions, unsubscribe footer/header URL, GET-safe vs POST unsubscribe.tsc) passes.List-Unsubscribe, andList-Unsubscribe-Post; GET didn't unsubscribe, one-click POST did; click count stayed 0; Account/Users/Members pages served.Not in this PR
@nestjs/cli, Jest) still has moderate audit findings; production is clean.Closes #14
Closes #15
Closes #21
Emails without {{ unsubscribe_url }} had no way to opt out. Adds a footer when missing, RFC 2369/8058 List-Unsubscribe + one-click headers, stops counting unsubscribes as clicks, and makes GET a confirmation page so link scanners cannot unsubscribe people. Closes #21