OpenMail v0.3.0
OpenMail v0.3.0
Image (Docker Hub)
docker pull ianshaw027/openmail:v0.3.0
docker pull ianshaw027/openmail:latest
Run
docker pull ianshaw027/openmail:v0.3.0
docker run -d --name openmail -p 8000:8000 \
-e OPENMAIL_MASTER_KEY="$(openssl rand -base64 32)" \
-v openmail-data:/data \
ianshaw027/openmail:v0.3.0Or with compose from this repo: docker compose pull && docker compose up -d
/api/health reports version: 0.3.0.
Changelog
Security
- Device HMAC body binding (
X-Device-Body-Sha256); mutating methods (POST/PUT/PATCH/DELETE) require body hash - Transfer routes require registered vault device; status limited to host/guest/claim-token; HTTP-level auth tests
- Cloud account quota floored on live
COUNT(accounts)+ conditional UPDATE; IntegrityError reconcile - Poll quota durable in DB with per-device serialization (SQLite
BEGIN IMMEDIATEwhen available) - Fetch lease token-owned DB lock with expiry, post-lease min-interval recheck,
retry_afteron contention - Client-sealed accounts reject accidental server-side credential unseal (require
_om_unwrap_sealedorclient_sealed) - HttpApi streamed response body limit (no full buffer before cap); IMAP BEFORE candidate budget
- Unique
(owner, email)migrate fail-closed with duplicate-key diagnostics
Added
- Durable
device_poll_events/ poll quota state; clouddevice_quota_state - Fetch lock
lease_token; code-API cache TTL config - Docs: security & cache review (
docs/18-security-and-cache-review.md) - Frontend: provider capability helpers, account UI meta utilities
Changed
- Credential PATCH deep-merge (empty string clears a key; partial patch no longer wipes blob)
- mailCache keys include IMAP UIDVALIDITY; upgrade path drops legacy same-folder keys
- Transfer status no longer enumerable by arbitrary registered devices
Fixed
- Concurrent cloud create / poll quota races under multi-worker
- Permanent fetch in-flight after worker crash (lease expiry)
- Transfer anonymous create / unauthenticated status