OMEMO trust lists: steady order, no choice without a key, steady member cards #12
Closed
asxpi
wants to merge 0 commits from
asxpi/anotherim-js:fix/omemo-trust-list into develop
pull from: asxpi/anotherim-js:fix/omemo-trust-list
merge into: another-im:develop
another-im:develop
another-im:fix/relock-dismiss
another-im:fix/settings-accounts
another-im:feat/unified-dialogs-1
another-im:feat/unified-dialogs-2
another-im:feat/unified-dialogs-3
another-im:feat/one-status
another-im:macos-0.6.1
another-im:fix/console-tab-out
another-im:fix/desktop-drop
another-im:fix/xml-console-menu
another-im:feat/telegram-connect
another-im:feat/chat-tags
another-im:feat/muc-omemo
another-im:integrate/origin-develop-2026-10-02
another-im:fix/media-bubble-size
another-im:fix/empty-click-focus
another-im:feat/system-font-default
another-im:integrate/develop-2026-10-02
another-im:fix/attachment-decrypt
another-im:feat/system-font
another-im:fix/chat-links
another-im:fix/android-background-network
another-im:feat/tray
another-im:feat/thumb-cache
another-im:fix/android-csi-native
another-im:feat/opfs-store
another-im:fix/alttab-focus
another-im:try/groupcalls
another-im:feat/pwa-install
another-im:integrate/0.3.0
another-im:fix/upload-bubble-030
another-im:feat/drag-select
another-im:fix/upload-bubble
another-im:feat/encryption-info
another-im:chore/libtacky-path
another-im:feat/chat-header-menus
another-im:integrate/develop
another-im:fix/saved-top-linux-voice
another-im:fix/dialog-close-icons
another-im:feat/window-title-unread
another-im:feat/groupcalls
another-im:fix/open-picture-one-tap
another-im:feat/server-info-console
another-im:fix/chat-open-scroll-end
another-im:fix/desktop-push-mutes
another-im:fix/android-mute-push-selection
another-im:feat/otr-lock-colours
another-im:otr-v3-secret-chats
another-im:chore/remove-otr
another-im:feat/room-invites
another-im:feat/voice-video-messages
another-im:docs/readme
another-im:fix/android-empty-files
another-im:api-freeze
another-im:feat/push-counts
another-im:feat/h264-android-save
another-im:feat/keep-attachments-decrypted
another-im:feat/media-player
another-im:feat/fix-subdomain-attachments
another-im:feat/fonts-pt-sans
another-im:feat/always-decrypt-on-the-fly
another-im:feat/default-scale-125
another-im:fix/composer-focus-after-send
another-im:feat/android-native-calls
another-im:feat/media-stream-decrypt
another-im:feat/download-failure
another-im:feat/outbox-cap
another-im:feat/web-call-sheet
another-im:feat/first-run-push-check
another-im:feat/font-size-110
another-im:feat/log-view
another-im:fix/failed-transfer-history
another-im:feat/secure-unlock
another-im:feat/tpm-desktop
another-im:feat/tpm-android
another-im:feat/api-freeze-client
No reviewers
Labels
Clear labels
bug
Something is not working
duplicate
This issue or pull request already exists
feature request
New feature
linux
linux exclusive
macos
macos exclusive
needsinfo
Needs more information
severity: high
Major issue, significantly impacts usability or blocks core functionality
severity: low
Minor issue, cosmetic or rarely affects usage
severity: medium
Noticeable issue, but there is a workaround or limited impact
telegram_gw
issues related to the telegram gw
ui/ux
issues related to the interface and user experience (visual glitches, layout, interactions, usability problems)
windows
windows exclusive
wontfix
This won't be fixed
No labels
bug
duplicate
feature request
linux
macos
needsinfo
severity: high
severity: low
severity: medium
telegram_gw
ui/ux
windows
wontfix
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
another-im/anotherim-js!12
Loading…
Reference in a new issue
No description provided.
Delete branch "asxpi/anotherim-js:fix/omemo-trust-list"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Three problems with the OMEMO trust lists, found while reviewing a room member's keys in the 0.5.2 desktop app.
1. Rows moved as their trust was set (
4f93f4b).omemo trust_listcomes in the backend store's order: devices with a stored row first, then those only on a device list. Setting trust adds or drops that row (Undecided is no row), so the device jumped within the list, under the pointer. The rows are now sorted by device id. Active and inactive devices were already drawn apart.2. Trust offered for a device whose key has not arrived (
0ffa4b5, then790ebbe). A device on a list whose bundle never came, such as an OMEMO 2 device never met, shows no fingerprint, yet its row offered all three choices.PendingTrust), fetches the bundle, and once the key is in, records it withRecordDecisionas the key the user verified. The device would then read "Verified" for a key nobody was shown.PendingTrustis in memory only. It isn't saved,trust_listdoesn't report it, and it applies only if the bundle is fetched. Don't trust was sent, but the row kept reading Undecided, and a restart forgot it.The fix:
settable. It gets no picker and is neither counted nor touched by Set all. In place of the fingerprint it says "Its key has not arrived yet, so there is nothing to decide." (all six language packs).wantsReview,ownDevicesToReview). The bar asked for a review that couldn't be done ("1 new device in … to review"). Its key arriving brings the row's choices, and the bar, back.0ffa4b5first only disabled Trust.790ebbetakes the rest away, for the reasons above.Refusing a device before its key arrives would be worth having, especially with blind trust on. It needs libtacky to keep and report the pending choice.
3. The room window jumped when a member's keys were set (
3bbcbe2).RoomStatuslists members needing attention first, then by JID, so trusting or refusing all of a member's keys moved that member's card. The cards were an unkeyed.map(), so other members were drawn into the places under the pointer, and the page seemed to jump to its end. The window now takes the order once, as it opens (attention first), and keeps it while open. A member who joins later goes at the end. The cards are keyed by JID. Opened again, the window starts from the backend's order.Checks.
tscandi18n-extract --checkpass. The OMEMO tests inomemo.test.ts,muc-omemo.test.ts,key-review-bar.test.ts,encryption-info.test.tsand four more pass (157), with new cases for the order, the key-less device (store, Set all, review, drawing) and the members' cards. All three were checked by hand in a local Flatpak build of 0.5.2 against a real room.🤖 Generated with Claude Code
Reviewed and merged into develop by hand with merge commit
83eb1d19, released in 0.5.6 (v0.5.6 =33b27872, https://dev.another.im/another-im/anotherim-js/releases/tag/v0.5.6). The forge does not mark a hand merge as merged, so this PR is closed here.Pull request closed