- Translate Prosody's "doesn't match the one we calculated" SCRAM
failure into an actionable Russian message pointing at the typed
password, since the client math itself is verified against the
RFC 5802 test vector.
- Set explicit username/password text content types on the login
screen, disable smart text features, and add a password visibility
toggle so users can verify what they submit.
- Cover the mapping with a unit test and verify.sh invariants.
- Normalize SCRAM passwords with RFC 4013 SASLprep before the
challenge response, so they match SASLprep-compliant servers
(Martin hashes raw UTF-8) and PLAIN still sends the password
untouched.
- Capture the raw <failure/> condition with LumaSaslFailureModule and
map SASL errors to actionable Russian messages instead of the
cryptic OS-localized "Martin.SaslError, error 5".
- Cover SASLprep and failure message mapping with unit tests and new
verify.sh invariants.