diff --git a/hive-c0re/src/matrix.rs b/hive-c0re/src/matrix.rs index 4fd5e1c9..a2750e88 100644 --- a/hive-c0re/src/matrix.rs +++ b/hive-c0re/src/matrix.rs @@ -378,14 +378,6 @@ fn extract_new_password(bot_message: &str) -> Option { "reset to:", "set to: ", "set to:", - // Generic "… to: " form. tuwunel's actual reset-password reply is - // "Successfully reset password for @user:server to: " — the - // password follows " to: " but no recognised verb sits adjacent to it, - // so the markers above miss it. Matrix user ids / server names can't - // contain " to: ", so this only ever anchors on the prose delimiter. - // Placed after the specific verb markers and before the bare - // "password:" last resort. - " to: ", // Bare "new password:" without "is": "new password: ", "new password:", @@ -395,15 +387,10 @@ fn extract_new_password(bot_message: &str) -> Option { ] { if let Some(pos) = lower.find(marker) { let rest = &bot_message[pos + marker.len()..]; - // Strip leading whitespace, then a leading code-span backtick: - // tuwunel renders the password as a code span, so the plain - // `body` carries literal backticks ("… to: ``"). - let rest = rest.trim_start().trim_start_matches('`'); - // The password ends at the first whitespace OR the closing - // backtick. Generated passwords contain neither, so this never - // truncates a real password mid-token. + let rest = rest.trim_start(); + // Stop at first whitespace or newline; password must be non-empty. let end = rest - .find(|c: char| c.is_whitespace() || c == '`') + .find(char::is_whitespace) .unwrap_or(rest.len()); let pw = rest[..end].trim(); if !pw.is_empty() { @@ -472,37 +459,6 @@ mod extract_new_password_tests { assert_eq!(extract_new_password(msg).as_deref(), Some("hunter2")); } - #[test] - fn tuwunel_reset_password_for_to_variant() { - // The actual tuwunel admin-room reply observed in production — the - // verb ("reset") is not adjacent to "to:", so only the generic - // " to: " marker catches it. - let msg = "Successfully reset password for @atlas:pr1ma.darkest.space to: N3wP@ssw0rd"; - assert_eq!(extract_new_password(msg).as_deref(), Some("N3wP@ssw0rd")); - } - - #[test] - fn to_marker_not_confused_by_user_id() { - // The user id contains no " to: " so the marker only fires on the - // real delimiter; the password is the token right after it. - let msg = "Successfully reset password for @sock:pr1ma.darkest.space to: abc123XYZ"; - assert_eq!(extract_new_password(msg).as_deref(), Some("abc123XYZ")); - } - - #[test] - fn backtick_wrapped_password() { - // tuwunel renders the password as a code span; the plain body - // carries literal backticks. Strip them, don't capture them. - let msg = "Successfully reset password for @atlas:pr1ma.darkest.space to: `N3wP@ssw0rd`"; - assert_eq!(extract_new_password(msg).as_deref(), Some("N3wP@ssw0rd")); - } - - #[test] - fn backtick_wrapped_with_trailing_text() { - let msg = "Done. New password is: `hunter2` (store it now)"; - assert_eq!(extract_new_password(msg).as_deref(), Some("hunter2")); - } - #[test] fn bare_new_password_colon() { let msg = "New password: P@ssword1";