diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2024-01-27 22:12:45 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2024-01-27 22:12:45 +0000 |
| commit | 4589d06023b21a49a4d82fa24228a3879300cd7f (patch) | |
| tree | b15d07da76743b34d252cff57aa4ed9ebddd0116 | |
| parent | fc3f22eac2bb81823f170f61ba9d39baff76b933 (diff) | |
fix(login): stop bailing when no name in metadata
now falls back to displayName, display_name or npub
test pass when loggined printed to the cli in
e0f543e8adb144f6deff6ff7ea0c412c9fcac5b4 are commented out
| -rw-r--r-- | src/key_handling/users.rs | 17 | ||||
| -rw-r--r-- | tests/login.rs | 144 |
2 files changed, 158 insertions, 3 deletions
diff --git a/src/key_handling/users.rs b/src/key_handling/users.rs index caa57e6..2c6a897 100644 --- a/src/key_handling/users.rs +++ b/src/key_handling/users.rs | |||
| @@ -220,9 +220,20 @@ impl UserManagement for UserManager { | |||
| 220 | let metadata = nostr::Metadata::from_json(new_metadata_event.content.clone()) | 220 | let metadata = nostr::Metadata::from_json(new_metadata_event.content.clone()) |
| 221 | .context("metadata cannot be found in kind 0 event content")?; | 221 | .context("metadata cannot be found in kind 0 event content")?; |
| 222 | user_ref.metadata = UserMetadata { | 222 | user_ref.metadata = UserMetadata { |
| 223 | name: metadata | 223 | name: if let Some(n) = metadata.name { |
| 224 | .name | 224 | n |
| 225 | .context("user metadata should always have name")?, | 225 | } else if let Some(n) = metadata.custom.get("displayName") { |
| 226 | // strip quote marks that custom.get() adds | ||
| 227 | let binding = n.to_string(); | ||
| 228 | let mut chars = binding.chars(); | ||
| 229 | chars.next(); | ||
| 230 | chars.next_back(); | ||
| 231 | chars.as_str().to_string() | ||
| 232 | } else if let Some(n) = metadata.display_name { | ||
| 233 | n | ||
| 234 | } else { | ||
| 235 | user_ref.metadata.name | ||
| 236 | }, | ||
| 226 | created_at: new_metadata_event.created_at.as_u64(), | 237 | created_at: new_metadata_event.created_at.as_u64(), |
| 227 | }; | 238 | }; |
| 228 | } | 239 | } |
diff --git a/tests/login.rs b/tests/login.rs index 4141a59..ee7450d 100644 --- a/tests/login.rs +++ b/tests/login.rs | |||
| @@ -63,6 +63,9 @@ mod with_relays { | |||
| 63 | p.expect("searching for your details...\r\n")?; | 63 | p.expect("searching for your details...\r\n")?; |
| 64 | p.expect("\r")?; | 64 | p.expect("\r")?; |
| 65 | 65 | ||
| 66 | // p.expect_end_with( | ||
| 67 | // format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str(), | ||
| 68 | // )?; | ||
| 66 | p.expect_end_with("logged in as fred\r\n")?; | 69 | p.expect_end_with("logged in as fred\r\n")?; |
| 67 | for p in [51, 52] { | 70 | for p in [51, 52] { |
| 68 | shutdown_relay(8000 + p)?; | 71 | shutdown_relay(8000 + p)?; |
| @@ -78,6 +81,46 @@ mod with_relays { | |||
| 78 | Ok(()) | 81 | Ok(()) |
| 79 | } | 82 | } |
| 80 | 83 | ||
| 84 | async fn run_test_displays_fallback_to_npub( | ||
| 85 | relay_listener1: Option<ListenerReqFunc<'_>>, | ||
| 86 | relay_listener2: Option<ListenerReqFunc<'_>>, | ||
| 87 | ) -> Result<()> { | ||
| 88 | let (mut r51, mut r52) = ( | ||
| 89 | Relay::new(8051, None, relay_listener1), | ||
| 90 | Relay::new(8052, None, relay_listener2), | ||
| 91 | ); | ||
| 92 | |||
| 93 | let cli_tester_handle = std::thread::spawn(move || -> Result<()> { | ||
| 94 | with_fresh_config(|| { | ||
| 95 | let mut p = CliTester::new(["login"]); | ||
| 96 | |||
| 97 | p.expect_input(EXPECTED_NSEC_PROMPT)? | ||
| 98 | .succeeds_with(TEST_KEY_1_NSEC)?; | ||
| 99 | |||
| 100 | p.expect_password(EXPECTED_SET_PASSWORD_PROMPT)? | ||
| 101 | .with_confirmation(EXPECTED_SET_PASSWORD_CONFIRM_PROMPT)? | ||
| 102 | .succeeds_with(TEST_PASSWORD)?; | ||
| 103 | |||
| 104 | p.expect("searching for your details...\r\n")?; | ||
| 105 | p.expect("\r")?; | ||
| 106 | |||
| 107 | p.expect_end_with( | ||
| 108 | format!("logged in as {}\r\n", TEST_KEY_1_NPUB).as_str(), | ||
| 109 | )?; | ||
| 110 | for p in [51, 52] { | ||
| 111 | shutdown_relay(8000 + p)?; | ||
| 112 | } | ||
| 113 | Ok(()) | ||
| 114 | }) | ||
| 115 | }); | ||
| 116 | |||
| 117 | // launch relay | ||
| 118 | let _ = join!(r51.listen_until_close(), r52.listen_until_close(),); | ||
| 119 | |||
| 120 | cli_tester_handle.join().unwrap()?; | ||
| 121 | Ok(()) | ||
| 122 | } | ||
| 123 | |||
| 81 | #[test] | 124 | #[test] |
| 82 | #[serial] | 125 | #[serial] |
| 83 | fn when_latest_metadata_and_relay_list_on_all_relays() -> Result<()> { | 126 | fn when_latest_metadata_and_relay_list_on_all_relays() -> Result<()> { |
| @@ -107,6 +150,107 @@ mod with_relays { | |||
| 107 | )) | 150 | )) |
| 108 | } | 151 | } |
| 109 | 152 | ||
| 153 | mod poorly_quality_metadata_event { | ||
| 154 | use super::*; | ||
| 155 | |||
| 156 | #[test] | ||
| 157 | #[serial] | ||
| 158 | fn when_metadata_contains_only_display_name() -> Result<()> { | ||
| 159 | futures::executor::block_on(run_test_displays_correct_name( | ||
| 160 | Some(&|relay, client_id, subscription_id, _| -> Result<()> { | ||
| 161 | relay.respond_events( | ||
| 162 | client_id, | ||
| 163 | &subscription_id, | ||
| 164 | &vec![ | ||
| 165 | nostr::event::EventBuilder::metadata( | ||
| 166 | &nostr::Metadata::new().display_name("fred"), | ||
| 167 | ) | ||
| 168 | .to_event(&TEST_KEY_1_KEYS) | ||
| 169 | .unwrap(), | ||
| 170 | generate_test_key_1_relay_list_event_same_as_fallback(), | ||
| 171 | ], | ||
| 172 | )?; | ||
| 173 | Ok(()) | ||
| 174 | }), | ||
| 175 | None, | ||
| 176 | )) | ||
| 177 | } | ||
| 178 | |||
| 179 | #[test] | ||
| 180 | #[serial] | ||
| 181 | fn when_metadata_contains_only_displayname() -> Result<()> { | ||
| 182 | println!( | ||
| 183 | "displayName: {}", | ||
| 184 | nostr::Metadata::new() | ||
| 185 | .custom_field("displayName", "fred") | ||
| 186 | .custom | ||
| 187 | .get("displayName") | ||
| 188 | .unwrap() | ||
| 189 | ); | ||
| 190 | println!( | ||
| 191 | "name: {}", | ||
| 192 | nostr::Metadata::new().name("fred").name.unwrap() | ||
| 193 | ); | ||
| 194 | |||
| 195 | futures::executor::block_on(run_test_displays_correct_name( | ||
| 196 | Some(&|relay, client_id, subscription_id, _| -> Result<()> { | ||
| 197 | relay.respond_events( | ||
| 198 | client_id, | ||
| 199 | &subscription_id, | ||
| 200 | &vec![ | ||
| 201 | nostr::event::EventBuilder::metadata( | ||
| 202 | &nostr::Metadata::new() | ||
| 203 | .custom_field("displayName", "fred"), | ||
| 204 | ) | ||
| 205 | .to_event(&TEST_KEY_1_KEYS) | ||
| 206 | .unwrap(), | ||
| 207 | generate_test_key_1_relay_list_event_same_as_fallback(), | ||
| 208 | ], | ||
| 209 | )?; | ||
| 210 | Ok(()) | ||
| 211 | }), | ||
| 212 | None, | ||
| 213 | )) | ||
| 214 | } | ||
| 215 | |||
| 216 | #[test] | ||
| 217 | #[serial] | ||
| 218 | fn displays_npub_when_metadata_contains_no_name_displayname_or_display_name() | ||
| 219 | -> Result<()> { | ||
| 220 | println!( | ||
| 221 | "displayName: {}", | ||
| 222 | nostr::Metadata::new() | ||
| 223 | .custom_field("displayName", "fred") | ||
| 224 | .custom | ||
| 225 | .get("displayName") | ||
| 226 | .unwrap() | ||
| 227 | ); | ||
| 228 | println!( | ||
| 229 | "name: {}", | ||
| 230 | nostr::Metadata::new().name("fred").name.unwrap() | ||
| 231 | ); | ||
| 232 | |||
| 233 | futures::executor::block_on(run_test_displays_fallback_to_npub( | ||
| 234 | Some(&|relay, client_id, subscription_id, _| -> Result<()> { | ||
| 235 | relay.respond_events( | ||
| 236 | client_id, | ||
| 237 | &subscription_id, | ||
| 238 | &vec![ | ||
| 239 | nostr::event::EventBuilder::metadata( | ||
| 240 | &nostr::Metadata::new(), | ||
| 241 | ) | ||
| 242 | .to_event(&TEST_KEY_1_KEYS) | ||
| 243 | .unwrap(), | ||
| 244 | generate_test_key_1_relay_list_event_same_as_fallback(), | ||
| 245 | ], | ||
| 246 | )?; | ||
| 247 | Ok(()) | ||
| 248 | }), | ||
| 249 | None, | ||
| 250 | )) | ||
| 251 | } | ||
| 252 | } | ||
| 253 | |||
| 110 | #[test] | 254 | #[test] |
| 111 | #[serial] | 255 | #[serial] |
| 112 | fn when_latest_metadata_and_relay_list_on_some_relays_but_others_have_none() | 256 | fn when_latest_metadata_and_relay_list_on_some_relays_but_others_have_none() |