6.1 KiB
PostfixAdmin-RS 0.0.2 - test checklist
1. Static / compiler gate
Run on Rust 1.99.1:
cargo fmt --check
cargo check --all-targets
cargo test --all-targets
cargo clippy --all-targets -- -D warnings
Then start the isolated development database:
POSTFIXADMIN_RS_DEV_RESET=1 bash dev.sh
Expected test accounts are printed by dev.sh.
2. UI / i18n
- Login page starts in English when there is no
pa_languagevalue in localStorage. - Language selector is available on login and in the top bar.
- Switching EN <-> PL does not log the user out and reloads the current page.
- API endpoints and JSON error payloads remain English.
- Theme selector still works independently of the language selector.
- Forms, confirmations and prompts use application modals, not browser
prompt/confirmdialogs.
3. Mock DB regression
As global admin test: domains, mailboxes, aliases, alias domains, admins, fetchmail, DKIM, TOTP/application passwords and logs. Verify permission restrictions with domain-admin and mailbox-user test accounts.
4. Production DB through SSH - read-only first
cp .env.example .env
$EDITOR .env
bash dev.sh
.env.example is prefilled for host.linuxiarz.pl; set the SSH username and database password before starting. SSH mode forces database.read_only=true unless POSTFIXADMIN_RS_DEV_DB_WRITES=1 is explicitly set.
In read-only mode verify:
- login for global admin, domain admin and mailbox user,
- domain/mailbox/alias lists,
- quota/status fields,
- schema warnings and password scheme detection,
- fetchmail/vacation/DKIM list pages that exist in the production schema,
- every write attempt returns an English API error and does not alter data.
Do not enable writes until a database backup exists and a dedicated test domain/account has been selected.
5. Production DB write test
Only after backup:
POSTFIXADMIN_RS_DEV_DB_MODE=ssh POSTFIXADMIN_RS_DEV_DB_WRITES=1 bash dev.sh
Use a dedicated test domain. Exercise create/update/delete for one domain, mailbox and alias; verify Postfix/Dovecot behaviour and the PostfixAdmin log table. Do not change password.scheme during this test.
Mailbox-user regression
Zaloguj sie jako mailbox-user i sprawdz:
- nawigacja nie pokazuje Domains, Mailboxes, Administrators, Logs, Broadcast ani System; DKIM moze byc widoczny tylko jako read-only, gdy istnieje backend DKIM i
[dkim].user_read_only=true; - Overview nie pokazuje panelu
Enabled modules, tylko dane wlasnej skrzynki, self-alias i quota progress; /mailboxeszwraca tylko zalogowana skrzynke, a/aliasestylko jej self-alias;- Aliases pokazuje domene jako read-only i nie pozwala zmienic adresu/domeny;
- Security od razu pokazuje formularz zmiany hasla, bez technicznego opisu cookies/CSRF;
- Vacation pokazuje formularz wlasnego autorespondera tylko gdy
features.vacation=trueivacation_control=true; - Filters pojawia sie tylko gdy
[sieve].enabled=true; - DKIM usera pokazuje tylko rekordy jego domeny, z pelnym
selector._domainkey.domain IN TXT "...", bez klucza prywatnego i bez akcji zapisu.
ManageSieve mozna przetestowac przez ten sam SSH host bez IMAP:
POSTFIXADMIN_RS_DEV_DB_MODE=ssh \
POSTFIXADMIN_RS_DEV_SIEVE_ENABLED=true \
bash dev.sh
W tym samym trybie dev.sh domyslnie synchronizuje publiczne rekordy Rspamd DKIM przez SSH. Prywatne klucze pozostaja na serwerze. W logu startowym oczekuj linii DKIM: Rspamd public DNS records synced over SSH.
Pierwszy test Sieve pozostaw read-only. Do PUT/DELETE/activate dodaj dopiero po wyborze konta testowego:
POSTFIXADMIN_RS_DEV_SIEVE_WRITES=1
Sprawdz list/get/check, a nastepnie create/save/activate/rename/delete. Po zmianie hasla w Security ponownie sprawdz Sieve w tej samej sesji.
6. Rspamd DKIM
Test first with the development mock. On the mail host test rspamadm configtest, generation/adoption, DNS TXT display, mapping updates and reload. Keep a backup of dkim_signing.conf and existing key files.
Current readiness
The source tree contains development mock coverage and a guarded production-DB tunnel path. It should be treated as test-ready, not production-ready, until the compiler/test/clippy gate above passes on Rust 1.99.1 and the production schema has completed the read-only regression checklist.
MySQL/MariaDB through sqlx::Any
PostfixAdmin commonly stores boolean flags such as active, superadmin,
backupmx, smtp_active, Fetchmail SSL flags and Vacation state as
TINYINT(1). SQLx Any does not map MySQL TINY result metadata directly.
PostfixAdmin-RS therefore casts these flags to a portable signed integer in
SELECT projections before decoding them.
If a test build reports Any driver does not support MySql type ... Tiny,
include the failing endpoint and SQL-related log line in the bug report; raw
flag columns must not be selected without the normalization helper.
UI and quota checks
- Switch domains in Mailboxes and Aliases: a top loading bar and spinner must be visible while requests are in flight.
- Mailbox quota renders a progress bar. When
quota2/quotausage is available it is used as the numerator; otherwise configured mailbox quota is compared with the domain max quota. - Medium/high quota thresholds default to 55/90 percent and are configurable under
[defaults]. - Theme icon must render after upgrades; the icon sprite is served under a content-hashed URL.
Debian package
Run ./scripts/build-deb.sh. Expected output is packages/postfixadmin-rs_0.0.2_<arch>.deb plus .sha256. Install on a disposable Debian-compatible host first and configure /etc/postfixadmin-rs/config.toml before enabling the service. Verify getent passwd postfixadmin, systemctl cat postfixadmin-rs (User/Group must be postfixadmin), and permissions root:postfixadmin 0640 on the config file.
Local Rust quality gate
Run this before packaging or committing changes:
./scripts/quality.sh
It formats the Rust sources first, then runs cargo check, cargo test, and
cargo clippy --all-targets -- -D warnings. The Debian builder runs the same
format/test/lint sequence inside its writable Docker worktree.