From 9577fc994090754bfc35ac344321747fcafa606e Mon Sep 17 00:00:00 2001 From: Ednunp <29843396+Ednunp@users.noreply.github.com> Date: Mon, 27 Jul 2026 11:23:27 +0100 Subject: [PATCH] Shorten the weak-password messaging everywhere (Ed's approved wording) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The password guidance was a wall of text. Trimmed to Ed's approved phrasing, applied consistently across all three surfaces (status line left as-is per Ed): - PasswordStrength.Critique is now ONE line — the rule + a concrete example to copy ("Use at least 8 characters — three unrelated words with a number, like kettle9tiger42moon, works well."), no scare prose. This flows into both change- password-box rejection dialogs, so those shortened automatically. - Startup warning (MaybeWarnWeakPassword): "RemSound has increased its security level, so this profile's password must be strengthened to meet the new password rules. Until it is, no audio will pass." + the one-line rule + how to change it. - Send/Receive-tick gate (EnsureStreamingPassword): same "increased its security level ... strengthened before audio can flow" opener + the concise rule. Gate 71/71 + 7 relay tests. Co-Authored-By: Claude Fable 5 --- src/RemSound.App/MainForm.cs | 21 ++++++++++----------- src/RemSound.Core/PasswordStrength.cs | 14 ++++---------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/RemSound.App/MainForm.cs b/src/RemSound.App/MainForm.cs index 7d0802c..13b2f30 100644 --- a/src/RemSound.App/MainForm.cs +++ b/src/RemSound.App/MainForm.cs @@ -1684,15 +1684,13 @@ public sealed partial class MainForm : Form if (IsDisposed || CuePlayer.GloballyMuted) return; // never on a --silent/automated launch if (!WeakPasswordBlocksAudio(currentProfilePassword, currentAudioKey is not null)) return; if (!IsSendEnabled && !IsReceiveEnabled) return; // not trying to stream → nothing blocked yet - var advice = PasswordStrength.Critique(currentProfilePassword) ?? ""; ForegroundDialog.Show(owner => MessageBox.Show(owner, - "The password on this profile — the one that protects your audio — is too easy to guess, so " - + "from this version RemSound won't stream with it. Until it's changed, the people you " - + "connect to will hear nothing.\n\n" - + advice + "\n\n" - + "To fix it: open the File menu and choose “Change this profile's password”, then set " - + "the SAME new password on every machine you connect with.", - "RemSound — password too weak to stream", + "RemSound has increased its security level, so this profile's password must be strengthened " + + "to meet the new password rules. Until it is, no audio will pass.\n\n" + + "Use at least 8 characters — three unrelated words with a number, like kettle9tiger42moon, works well.\n\n" + + "To change it: open the File menu and choose “Change this profile's password”. Use the " + + "same new password on every machine you connect with.", + "RemSound — password needs strengthening", MessageBoxButtons.OK, MessageBoxIcon.Warning)); } @@ -8429,9 +8427,10 @@ public sealed partial class MainForm : Form // it — a bare dialog would read as a bug to someone whose password worked yesterday. var page = new TaskDialogPage { - Caption = "Password needs strengthening", - Heading = "Your profile password is too easy to guess", - Text = $"From this version, audio won't flow until the password is stronger. {weakAdvice}", + Caption = "RemSound — password needs strengthening", + Heading = "Your password must be strengthened", + Text = "RemSound has increased its security level, so this profile's password must be " + + $"strengthened before audio can flow. {weakAdvice}", Icon = TaskDialogIcon.Warning, Buttons = { TaskDialogButton.OK }, DefaultButton = TaskDialogButton.OK, diff --git a/src/RemSound.Core/PasswordStrength.cs b/src/RemSound.Core/PasswordStrength.cs index 7f3197c..6c89738 100644 --- a/src/RemSound.Core/PasswordStrength.cs +++ b/src/RemSound.Core/PasswordStrength.cs @@ -28,20 +28,14 @@ public static class PasswordStrength public static string? Critique(string password) { if (string.IsNullOrEmpty(password)) return null; + // Kept short on purpose (Ed, 2026-07-27): one line — the rule and a concrete example to copy + // the shape of. The surrounding dialogs add the "why" and the "how to change it". if (password.Length < MinLength) - { - return $"This password is too short to protect your audio — anyone who records your stream can try millions of guesses against it. " - + $"Use at least {MinLength} characters; longer is stronger. Three unrelated words with a number — like kettle9tiger42moon — " - + "is easy to type and remember, and very hard to guess. Remember: every machine you connect with must be given the same new password."; - } + return $"Use at least {MinLength} characters — three unrelated words with a number, like kettle9tiger42moon, works well."; foreach (var common in CommonPasswords) { if (string.Equals(password, common, StringComparison.OrdinalIgnoreCase)) - { - return "That password is one of the most commonly guessed passwords in the world, so it offers almost no protection. " - + "Pick something personal and longer — three unrelated words with a number, like kettle9tiger42moon, works well. " - + "Remember: every machine you connect with must be given the same new password."; - } + return $"That's one of the most common passwords in the world. Use at least {MinLength} characters — three unrelated words with a number, like kettle9tiger42moon, works well."; } return null; }