vms: own-account devices, encryption and file actions for batch 1 #17

Merged
asxpi merged 4 commits from vms/h1-h6-devices-encryption into main 2026-11-09 11:35:13 +00:00
Member

Harness packages H1 (devices) and H6 (encryption, files) for run batch 1.

  • H1: a client signed in as another client's account gets its own disk <client>-<account>-<server>.qcow2 (existing names unchanged); vmrun.zsh peers take CLIENT[:ACCOUNT] (web:aim, gajim:aim, aim:web); --record of aim vs aim keeps the second aim's log. Example owndevice.py.
  • H6: set_encryption(False)/encryption() for aim, web, Kaidan (Kaidan's switch found by label, state read from the composer); trust()/omemo_keys()/undecryptable_count() for aim and web; aim send_files_directly(); Dino accept_file(); saved_file(sha256); aim presses "Try again" on the keyring flake.
  • Examples verified on ejabberd (unrecorded): plaintext.py (Kaidan), owndevice.py (Gajim as vm-aim), xep0234.py (aim↔aim under JET-OMEMO works; Dino fails, see below), xep0363.py (Gajim), omemo_sync.py (web as vm-aim: harness steps run, the sync checks fail on product behaviour).

Bug candidates for batch 1 to record: Dino rejects aim's JET cipher …aes-128-gcm-nopadding:0; plain Jingle FT to Dino ends failed-transport (SOCKS5 fails, IBB replace collision; ejabberd proxy65 announces 127.0.0.2); omemo-chats / omemo-trust own-device sync not applied.

🤖 Generated with Claude Code

Harness packages H1 (devices) and H6 (encryption, files) for run batch 1. - H1: a client signed in as another client's account gets its own disk `<client>-<account>-<server>.qcow2` (existing names unchanged); `vmrun.zsh` peers take `CLIENT[:ACCOUNT]` (`web:aim`, `gajim:aim`, `aim:web`); `--record` of aim vs aim keeps the second aim's log. Example `owndevice.py`. - H6: `set_encryption(False)`/`encryption()` for aim, web, Kaidan (Kaidan's switch found by label, state read from the composer); `trust()`/`omemo_keys()`/`undecryptable_count()` for aim and web; aim `send_files_directly()`; Dino `accept_file()`; `saved_file(sha256)`; aim presses "Try again" on the keyring flake. - Examples verified on ejabberd (unrecorded): plaintext.py (Kaidan), owndevice.py (Gajim as vm-aim), xep0234.py (aim↔aim under JET-OMEMO works; Dino fails, see below), xep0363.py (Gajim), omemo_sync.py (web as vm-aim: harness steps run, the sync checks fail on product behaviour). Bug candidates for batch 1 to record: Dino rejects aim's JET cipher `…aes-128-gcm-nopadding:0`; plain Jingle FT to Dino ends failed-transport (SOCKS5 fails, IBB replace collision; ejabberd proxy65 announces 127.0.0.2); omemo-chats / omemo-trust own-device sync not applied. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Batch 1 and 3 need a second device of aim's account (anotherim-web or
Gajim as vm-aim) and a second desktop aim as a peer. On the existing
disk names, <client>-<server>.qcow2, signing in as another account
wipes the client's profile, and another run's keys with it.

A VM whose account is not the client's own vm-<client> now gets
<client>-<account>-<server>.qcow2 (web-aim-ejabberd, gajim-aim-...,
aim-web-...). The client's own account keeps its name, so the disks
in use stay as they are. vmrun.zsh takes CLIENT[:ACCOUNT] for both
peers (web:aim, aim:web), and --record copies a second aim's log as
the peer's when aim runs against aim. owndevice.py checks the carbons
between two devices of aim's account.

Assisted-by: Claude:opus-5-5
Batch 1 (OMEMO, files, Jingle FT) needs actions the harness lacked:
reading and setting a key's trust, reading whether a chat encrypts,
counting messages aim cannot decrypt, turning on "Send files
directly" and checking that a file landed intact on the receiver.

aim and web: encryption(), omemo_keys(jid) and trust(jid, fp, level)
work in the keys column a tap on the header lock opens (the own JID
through "Saved messages": the account's devices); undecryptable_count()
reads the chat's "can't be read" pills; send_files_directly(on)
searches Preferences and reads the switch by colour (row_pixels).
Turning encryption off finds the dialog's red button from Cancel and
copes with a chat that is off already. Kaidan: set_encryption finds
its switch by label and reads the state from the composer, which an
offset switch had left on unnoticed. Dino: accept_file(). Every
client but aim/web, which keep files in their store: saved_file().
aim's start also presses "Try again" on "Your data cannot be opened".

Examples: plaintext.py (encryption off both sides), omemo_sync.py
(aim's OMEMO choices on its second device, web:aim), xep0234.py
(Jingle file transfer with the setting on); xep0363.py now checks
the receiver's copy by hash. AGENTS.md has the positions and what
the ejabberd verification runs found: Dino rejects aim's JET cipher
URI, a plain transfer to Dino dies in a transport-replace tie-break,
and web as a second device does not take aim's synced OMEMO choices.

Assisted-by: Claude:opus-5-5
# Conflicts:
#	vms/AGENTS.md
#	vms/README.md
#	vms/clients/web.py
#	vms/interopvm.py
vms: note that Gajim as vm-aim starts a chat unencrypted
All checks were successful
/ check (pull_request) Successful in 4m23s
96f9950951
Seen in owndevice.py with gajim:aim on ejabberd: aim's line arrived
encrypted and Gajim's carbon came back in clear, the chat being new
to that profile.

Assisted-by: Claude:opus-5-5
asxpi merged commit 8802d1bfe4 into main 2026-11-09 11:35:13 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
1 participant
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/interop!17
No description provided.