Skip to content

fix(ui): fix ID export for room owners and uncaptured memberships#190

Merged
sanity merged 3 commits intomainfrom
fix-187
Mar 22, 2026
Merged

fix(ui): fix ID export for room owners and uncaptured memberships#190
sanity merged 3 commits intomainfrom
fix-187

Conversation

@sanity
Copy link
Copy Markdown
Contributor

@sanity sanity commented Mar 22, 2026

Problem

Exporting an identity from any room other than the first showed "Cannot export: membership data not available" even when the user had sent messages. This happened because:

  1. Room owners could never export — capture_self_membership_data() skips owners (returns early when verifying_key == owner_vk), so self_authorized_member was always None
  2. Non-owners with uncaptured membership — if the member was pruned when capture_self_membership_data ran, or if room data predated the field, the export silently failed

Approach

Instead of requiring self_authorized_member to be pre-cached, the export modal now resolves the AuthorizedMember from three sources in priority order:

  1. Cached self_authorized_member — existing fast path, no change
  2. Owner self-sign — for room owners, creates a self-signed AuthorizedMember on the fly (owner signs themselves as invited_by: owner_id)
  3. State lookup — for non-owners without cached data, finds the member in the current room_state.members and builds the invite chain

Also looks up member_info from current state as fallback when self_member_info is None.

Testing

  • Added test_owner_self_signed_roundtrip to verify owner identity export/import works correctly (self-signed AuthorizedMember roundtrips, signature validates)
  • Updated example data to populate self_authorized_member for "Member" rooms so the export feature is testable in example mode
  • All existing identity tests pass (10/10)

Closes #187

[AI-assisted - Claude]

sanity and others added 3 commits March 22, 2026 11:53
…ership

The export identity modal failed for any room where self_authorized_member
was None. This affected room owners (capture_self_membership_data skips
owners) and non-owners whose membership hadn't been captured yet.

Fix: The export modal now resolves the AuthorizedMember from three sources:
1. Cached self_authorized_member (existing behavior)
2. For owners: creates a self-signed AuthorizedMember on the fly
3. For non-owners: looks up the member from current room state

Also populates self_authorized_member in example data for testability.

Closes #187

[AI-assisted - Claude]

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove `is_owner` temp variable, inline the comparison
- Move `params` construction into the only branch that uses it
- Tighten comments in test and example data

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix same export bug in riverctl CLI (was also hard-requiring
  self_authorized_member, failing for owners and uncaptured members)
- Change unwrap_or_default() to ok() for invite chain resolution in
  UI export — a broken chain now falls through to the error message
  instead of producing an invalid export token

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@sanity sanity merged commit 923b60d into main Mar 22, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ID export bug

1 participant