Repository navigation
fix(mobile): find verified people who have no profile - #9086
Conversation
The relay's profile search returns a person's verified head (kind 30382) when it has no kind:0 for them, but mobile kept only kind:0, so people who skipped profile setup could not be found by their verified name in Add members, New DM, mentions or search. searchProfiles now keeps those heads, and searchedPeople turns a head that the relay authority signed into a row named by its verified display name. A head from any other key, a retraction, or a head when the authority is unknown finds nobody. Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Logan Johnson <loganj@squareup.com>
Review fixes for verified-only people search: - Prove each search head's signature with the directory's off-isolate checker before it can create a row; a head that claims the relay key with a bad signature finds nobody. - Wait for NIP-11 discovery when the authority is not known yet, so a search that settles first no longer drops verified-only people. - Proven heads name their subjects in the verified directory, and a verified person is matched by full name and username as well as display name, as the relay search matches them. Gabi (display name glilienfeld, full name Gabi Lilienfeld) is now found by "gabi". Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Logan Johnson <loganj@squareup.com>
6efef79 to
65372a7
Compare
🔐 Codex Security Review
Review SummaryOverall Risk: NONE
FindingsNo concrete security, correctness, or reliability findings were identified. Notes
Generated by Codex Security Review | |
joahg
left a comment
There was a problem hiding this comment.
🤖 Read the search path: heads are signature-checked via the proof checker before they produce rows, forged or retracted heads add none, and discovery is awaited first. Looks correct.
…-log-ws-writes * origin/main: fix(mobile): find verified people who have no profile (#9086) feat(protocol): define compact membership discovery (BUZZ-615) (#9117) perf(db): hydrate search hits with exact event timestamps (#9126) perf(db): prune post-commit push enqueue by signed event timestamp (#9128) perf(db): use exact event timestamps for transactional deletion (#9130) perf(redis): index mesh ready records and share one Redis connection (#9113) fix(mobile): delay iOS message actions until a deliberate hold (#9049) feat(cli): user status expiry and status read (#8777) feat(cli): send a thread message to the channel (#8778) feat(relay): add kind 30180 custom emoji entry (#8783) feat(cli): read-only unread state (NIP-RS) (#8789) feat(cli): report a message to relay moderators (#8829) buzz-db: read explicit #h sets one channel at a time (#9110) feat(cli): list huddles and their participants (#8830) docs(agents): add open-source boundary and drop private repo list (#9114) fix(mobile): answer push snapshot bridge calls at user-initiated QoS; report hop latency on callback timeout (#8916) test(mobile): lock in invite-page and bare-host community link entry (#9047) fix(desktop): keep an own send out of the frozen timeline tail (#9095) fix(db): end each table's maintenance transaction before the next (#9096) Signed-off-by: Will Pfleger <wpfleger@block.xyz>
* origin/main: (54 commits) release(mobile): push candidate tags as the operator, not the App (#9084) test(mobile): check posterless video previews renew the relay assertion (#9144) feat(relay): log WebSocket EVENT writes on the access target (#9154) perf(db): plan multi-value #d reads with their values (#9131) fix(mobile): confirm before starting a Huddle from the header (#9155) feat(cli): send NIP-FI evidence via credential chain and Buzz desktop (#8999) fix(mobile): find verified people who have no profile (#9086) feat(protocol): define compact membership discovery (BUZZ-615) (#9117) perf(db): hydrate search hits with exact event timestamps (#9126) perf(db): prune post-commit push enqueue by signed event timestamp (#9128) perf(db): use exact event timestamps for transactional deletion (#9130) perf(redis): index mesh ready records and share one Redis connection (#9113) fix(mobile): delay iOS message actions until a deliberate hold (#9049) feat(cli): user status expiry and status read (#8777) feat(cli): send a thread message to the channel (#8778) feat(relay): add kind 30180 custom emoji entry (#8783) feat(cli): read-only unread state (NIP-RS) (#8789) feat(cli): report a message to relay moderators (#8829) buzz-db: read explicit #h sets one channel at a time (#9110) feat(cli): list huddles and their participants (#8830) ... Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
What changes
Mobile now finds a person who has a relay-verified profile (NIP-FI, kind 30382) but never published a kind:0 profile. This happens, for example, when someone skips profile setup. The relay's
POST /profiles/searchalready finds such people by their verified name. Each one comes back as a kind:30382 head with no kind:0. Mobile kept only kind:0 results, so these people did not appear.RelaySessionNotifier.searchProfileskeeps kind:30382 heads from the endpoint.VerifiedProfilesNotifier.searchedturns a search page into people:searchedPeople(inverified_profile.dart) builds one row per person, in the relay's order:glilienfeld, full name "Gabi Lilienfeld") came back from the relay for "gabi", and then the local filter dropped them.directoryUsersFromSearch.The desktop app has the same fix for Manage members: block/buzz-app#2554
Screenshots
These come from the real Add members sheet on an Android emulator. Only the relay session, verified-profile discovery and the member actions are faked. The names are made up. Jordan Park has a kind:0. jrivera has only a verified profile, with the full name "Jordan Rivera". The search is "jordan". The row shows the verified display name, which here is the same as the username.
Tests
add_members_sheet_names_test.dart: a journey in which Gabi hasdisplay_name=glilienfeldandfull_name= "Gabi Lilienfeld", and NIP-11 discovery is slow.verified_profile_test.dart: a table ofsearchedPeoplecases.relay_session_test.dartandchannel_management_provider_test.dart: rows for the kept heads and the directory row.flutter analyzeis clean, and the fullflutter testpasses on 6efef79: 4,462 tests.Note: mobile on
maindoes not compile at e558f15.account_identity_store.dartcalls the removed_keys. That fix is #9085. The local runs above had that one-line fix applied but not committed. Until it lands, mobile CI on this PR will fail.Not covered
🤖 Generated with Claude Code