Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -131,5 +131,5 @@ jobs:
- name: Release verification
run: |
python scripts/verify_release.py \
dist/mailstack-1.3.4-rc.1-source.zip \
--checksum dist/mailstack-1.3.4-rc.1-source.zip.sha256
dist/mailstack-1.3.4-rc.2-source.zip \
--checksum dist/mailstack-1.3.4-rc.2-source.zip.sha256
10 changes: 8 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ All notable repository-level changes are recorded here. Application history befo

### Corrected

- Advanced the pinned Django 5.2 LTS runtime from 5.2.16 to 5.2.17 after RC2 `pip-audit` identified the upstream security advisory, and synchronized active dependency, deployment verification, and security-test contracts without changing application behavior.
- Renamed CSS parser token-kind locals to avoid Bandit B105 credential-name false positives; no Bandit rule, exclusion, sanitizer policy, or runtime behavior is weakened.
- Added the RC2 high-fidelity reader candidate: safe inline CSS and bounded sanitized `<style>`/responsive `@media` rules are preserved through an explicit allowlist while CSS URLs, imports, fonts, dynamic/custom-property functions, active positioning/effects and remote resources remain denied.
- Added deterministic CSS parsing with pinned `tinycss2==1.5.1` plus focused parser, repair, security and safe-reader regression fixtures/tests; no database, route, authorization, iframe/CSP, mail-flow or repair-architecture change is included.
- Prevented stripped HTML `<style>`/head/active blocks from leaking CSS text into the visible message body while preserving the deny-by-default sanitizer posture.
- Removed blocked remote image nodes so tracking/remote images do not leave broken-image residue in the protected reader.
- Removed the permanent protected-rendering banner from the normal reader while retaining sandbox, no-referrer, sanitizer, URL and active-content restrictions.
Expand All @@ -16,11 +20,13 @@ All notable repository-level changes are recorded here. Application history befo

- Local PHASE-006 focused qualification: 60 tests passed; targeted Ruff, Bandit, Django system check and migration-drift gates passed.
- PHASE-006 implementation commit `90175b7a4549cb67d874692081bd5b0484eddccc` passed GitHub Actions CI run `32183300485`.
- Owner approved `1.3.4-rc.1` as the PHASE-006 live-acceptance pre-release identity; PR/main/tag publication and controlled live acceptance remain pending.
- RC1 was squash-merged through PR #12 to `main` at `212ccaf7fab94e1b42ef2a57afb7bdfee673667e` and tagged `v1.3.4-rc.1`; controlled reader acceptance retained the security fix but found original HTML/CSS fidelity insufficient, opening the RC2 continuation.
- The combined RC2 implementation/dependency candidate passed local qualification with 223 tests passed and one Windows symbolic-link capability skip, 93.03% coverage, Ruff/Bandit/Django/migration/dependency/documentation/design/installer/operations/release/upgrade gates PASS, `pip-audit` reporting no known vulnerabilities, and standard/full forensic audits with zero blocking findings.
- Release identity is promoted to `1.3.4-rc.2` for repeat local qualification, branch/main CI, exact-main tag publication and controlled live acceptance; none of those post-promotion gates are claimed complete here.

### Compatibility

- No database migration, Postfix/Dovecot/LMTP/Maildir routing change, authorization redesign, outbound feature, broad UI redesign, installer change, or version bump is included.
- No database migration, Postfix/Dovecot/LMTP/Maildir routing change, authorization redesign, outbound feature, broad UI redesign, installer-flow change, reader-policy change, or application behavior change is introduced by the RC2 release-identity promotion.

## 1.3.3 — PHASE-005A qualification correction

Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.3.4-rc.1
1.3.4-rc.2
2 changes: 1 addition & 1 deletion design/DESIGN_MANIFEST.json
Original file line number Diff line number Diff line change
Expand Up @@ -561,7 +561,7 @@
"unsupported_features_inactive": true
},
"project": "MailStack",
"release_version": "1.3.4-rc.1",
"release_version": "1.3.4-rc.2",
"schema_version": 1,
"source_archive": {
"archive_crc": "PASS",
Expand Down
12 changes: 7 additions & 5 deletions docs/DEPENDENCY_REVIEW.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

| Package | Version | Primary license family | Purpose |
|---|---:|---|---|
| Django | 5.2.16 | BSD-3-Clause | Web framework |
| Django | 5.2.17 | BSD-3-Clause | Web framework |
| argon2-cffi | 25.1.0 | MIT | Password hashing support |
| bleach | 6.4.0 | Apache-2.0 | HTML sanitization |
| filelock | 3.20.3 | Unlicense | Cross-process locking |
Expand All @@ -25,12 +25,14 @@ No obvious conflict was identified between the declared direct dependency licens

## Vulnerability review

Django remains pinned to 5.2.16, the July 2026 security maintenance release for the 5.2 LTS line.
Django is pinned to 5.2.17, the August 2026 security maintenance release for the 5.2 LTS line.
GitHub Actions run `32053931714` on PHASE-003 RC2 passed the structural and repository gates but the
blocking `pip-audit` step found CVE-2026-71491, CVE-2026-59894, CVE-2026-59893, and CVE-2026-54284
in `sqlparse==0.5.5`. RC3 introduced and RC4 preserves `sqlparse==0.6.0`, the upstream security release fixing those findings.
Django 5.2.16 permits `sqlparse>=0.3.1`, and sqlparse 0.6.0 supports Python 3.10+, including
Django 5.2.17 permits `sqlparse>=0.3.1`, and sqlparse 0.6.0 supports Python 3.10+, including
MailStack's required Python 3.12 runtime. RC4 subsequently passed `pip check` and the blocking
network-enabled `pip-audit` gate in the qualified branch/main/tag workflows with no known
vulnerabilities reported. The same gates remain mandatory for RC5 and later changes; no advisory is
ignored or suppressed.
vulnerabilities reported. During PHASE-006 RC2 qualification, `pip-audit` later identified the
Django 5.2.16 advisory fixed by 5.2.17; the RC2 qualification-closure delta advances only that
Django patch pin and keeps the same fail-closed audit requirement. The same gates remain mandatory
for later changes; no advisory is ignored or suppressed.
Loading
Loading