Skip to content

fix: multiple bug fixes across chatmaild and cmdeploy#883

Merged
missytake merged 11 commits intomainfrom
rebase-836
Mar 5, 2026
Merged

fix: multiple bug fixes across chatmaild and cmdeploy#883
missytake merged 11 commits intomainfrom
rebase-836

Conversation

@missytake
Copy link
Contributor

rebased #836 on main, thanks @Retengart for the original PR :) let's see what the CI says...

@missytake missytake temporarily deployed to staging-ipv4.testrun.org March 5, 2026 10:55 — with GitHub Actions Inactive
@missytake missytake temporarily deployed to staging2.testrun.org March 5, 2026 10:55 — with GitHub Actions Inactive
@missytake missytake temporarily deployed to staging2.testrun.org March 5, 2026 12:53 — with GitHub Actions Inactive
@missytake missytake temporarily deployed to staging-ipv4.testrun.org March 5, 2026 12:53 — with GitHub Actions Inactive
Retengart added 11 commits March 5, 2026 14:58
Bare return yielded None, causing TypeError on tuple unpacking
in perform_initial_checks on fresh servers without DKIM keys.
Exception in _build_webpages was silently caught, returning None.
rsync then received "None/" as source path, silently breaking deploy.
check_call always returns 0 or raises, making retcode!=0 branches
unreachable. Also remote_data was undefined with --skip-dns-check.
doveadm output ends with empty line, parts=[] causes parts[2] crash.
Per Python docs, secrets module should be used for security-sensitive
data. random.choices uses Mersenne Twister PRNG which is predictable.
secrets.choice was already used for password generation in the same file.
TLS 1.0/1.1 deprecated by RFC 8996. Nginx default is TLSv1.2 TLSv1.3.
Aligns with postfix (>=TLSv1.2) and dovecot (TLSv1.3) in the same stack.
- Reject localparts with chars outside [a-z0-9._-] to prevent
  filesystem issues from crafted usernames via IMAP/SMTP auth
- Use filelock to serialize concurrent account creation for same
  address, preventing TOCTOU race where two threads both create
  an account and last writer wins
Hung TURN daemon would block dict proxy handler thread indefinitely.
Per Python docs, settimeout() raises TimeoutError on expiry.
ConnectionRefusedError/FileNotFoundError/TimeoutError from
turn_credentials() would kill the dict proxy connection.
Return N (not found) response instead and log the error.
- test_doveauth: invalid localpart chars rejected, concurrent same-account creation
- test_expire: --mdir filtering uses msg.path correctly
- test_metadata: TURN exception returns N\n, success returns credentials
- test_turnserver: socket timeout, connection refused, happy path
- test_dns: get_dkim_entry returns (None, None) on CalledProcessError
- test_rshell: dovecot_recalc_quota handles empty/malformed output
@missytake missytake temporarily deployed to staging-ipv4.testrun.org March 5, 2026 13:58 — with GitHub Actions Inactive
@missytake missytake temporarily deployed to staging2.testrun.org March 5, 2026 14:37 — with GitHub Actions Inactive
@missytake missytake merged commit ed9b409 into main Mar 5, 2026
6 of 7 checks passed
@missytake missytake deleted the rebase-836 branch March 5, 2026 15:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants