Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-magic-wormhole for 
openSUSE:Factory checked in at 2026-07-23 23:34:46
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-magic-wormhole (Old)
 and      /work/SRC/openSUSE:Factory/.python-magic-wormhole.new.2004 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-magic-wormhole"

Thu Jul 23 23:34:46 2026 rev:18 rq:1367526 version:0.24.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-magic-wormhole/python-magic-wormhole.changes  
    2026-04-26 21:14:02.128094554 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-magic-wormhole.new.2004/python-magic-wormhole.changes
    2026-07-23 23:34:53.263990348 +0200
@@ -1,0 +2,11 @@
+Thu Jul 23 19:54:15 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 0.24.0 (bsc#1272449, CVE-2026-42448):
+  * **SECURITY**: @marduc812 noticed that there is also a missing
+    "basename()" when a receiving user specifies an output
+    directory (via "--output") that already exists. Users on past
+    releases can mitigate this bug by ensuring that any specified
+    "--output" filename is not an already-existing directory.
+    CVE-2026-42448
+
+-------------------------------------------------------------------

Old:
----
  magic_wormhole-0.23.0.tar.gz

New:
----
  magic_wormhole-0.24.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-magic-wormhole.spec ++++++
--- /var/tmp/diff_new_pack.rM4eXL/_old  2026-07-23 23:34:54.060018251 +0200
+++ /var/tmp/diff_new_pack.rM4eXL/_new  2026-07-23 23:34:54.064018391 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           python-magic-wormhole
-Version:        0.23.0
+Version:        0.24.0
 Release:        0
 Summary:        Tool for transferring files through a secure channel
 License:        MIT

++++++ magic_wormhole-0.23.0.tar.gz -> magic_wormhole-0.24.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/magic_wormhole-0.23.0/NEWS.md 
new/magic_wormhole-0.24.0/NEWS.md
--- old/magic_wormhole-0.23.0/NEWS.md   2026-03-10 23:39:34.000000000 +0100
+++ new/magic_wormhole-0.24.0/NEWS.md   2026-05-05 18:25:10.000000000 +0200
@@ -5,6 +5,10 @@
 * (add release-notes here when making PRs)
 
 
+## Release 0.24.0 (5-May-2026)
+* **SECURITY**: @marduc812 noticed that there is also a missing "basename()" 
when a receiving user specifies an output directory (via "--output") that 
already exists. Users on past releases can mitigate this bug by ensuring that 
any specified "--output" filename is not an already-existing directory. 
CVE-2026-42448
+
+
 ## Release 0.23.0 (10-Mar-2026)
 * **SECURITY**: Ian McKenzie @ikmckenz noticed a regression that deleted 
"basename()" usage, exposing receivers to path-name traversal attacks. Ian 
provided a patch and unit-test. Versions 0.21 and 0.22 are affected. This has 
been fixed and released (thanks, Ian!), users should upgrade.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/magic_wormhole-0.23.0/PKG-INFO 
new/magic_wormhole-0.24.0/PKG-INFO
--- old/magic_wormhole-0.23.0/PKG-INFO  2026-03-10 23:51:03.380799800 +0100
+++ new/magic_wormhole-0.24.0/PKG-INFO  2026-05-05 18:31:36.385144700 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: magic-wormhole
-Version: 0.23.0
+Version: 0.24.0
 Summary: Securely transfer data between computers
 Home-page: https://github.com/warner/magic-wormhole
 Author: Brian Warner
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/magic_wormhole-0.23.0/docs/CONTRIBUTING.rst 
new/magic_wormhole-0.24.0/docs/CONTRIBUTING.rst
--- old/magic_wormhole-0.23.0/docs/CONTRIBUTING.rst     2026-01-18 
06:48:16.000000000 +0100
+++ new/magic_wormhole-0.24.0/docs/CONTRIBUTING.rst     2026-04-01 
09:19:54.000000000 +0200
@@ -99,7 +99,7 @@
 
 
 ``eventually()`` and ``EventualQueue``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+``````````````````````````````````````
 
 This pattern ensures that an async thing happens only after at least one 
"reactor turn".
 
@@ -110,7 +110,7 @@
 
 
 global reactor
-~~~~~~~~~~~~~~
+``````````````
 
 It is ideal if things that use a reactor get it passed to them (instead of 
relying on importing "the global reactor" in Twisted).
 Although many things do already accept a reactor parameter, not everything 
does.
@@ -119,6 +119,6 @@
 
 
 Other Confusing Things
-~~~~~~~~~~~~~~~~~~~~~~~
+``````````````````````
 
 Are you confused about a thing? Please: **reach out and ask us!**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._allocator.Allocator.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._allocator.Allocator.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._allocator.Allocator.m.dot
        2024-10-31 09:39:10.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._allocator.Allocator.m.dot
        1970-01-01 01:00:00.000000000 +0100
@@ -1,37 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S0B_idle_connected [color=blue fontame=Menlo shape=ellipse style=""]
-       S0A_idle [color=blue fontame="Menlo-Bold" shape=ellipse style=bold]
-       S2_done [color=blue fontame=Menlo shape=ellipse style=""]
-       S1B_allocating_connected [color=blue fontame=Menlo shape=ellipse 
style=""]
-       S1A_allocating [color=blue fontame=Menlo shape=ellipse style=""]
-       t0 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">allocate</font></td></tr><tr ><td 
color="pink"><font point-size="9">stash</font></td></tr></table>> margin=0.2 
shape=none]
-       S0A_idle -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> S1A_allocating
-       t1 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S1B_allocating_connected -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S1A_allocating
-       t2 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">connected</font></td></tr></table>> margin=0.2 shape=none]
-       S2_done -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S2_done
-       t3 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">allocate</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">stash_and_RC_rx_allocate</font></td></tr></table>> margin=0.2 
shape=none]
-       S0B_idle_connected -> t3:tableport:w [arrowhead=none]
-       t3:tableport:e -> S1B_allocating_connected
-       t4 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">connected</font></td></tr></table>> margin=0.2 shape=none]
-       S0A_idle -> t4:tableport:w [arrowhead=none]
-       t4:tableport:e -> S0B_idle_connected
-       t5 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S2_done -> t5:tableport:w [arrowhead=none]
-       t5:tableport:e -> S2_done
-       t6 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">connected</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_allocate</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1A_allocating -> t6:tableport:w [arrowhead=none]
-       t6:tableport:e -> S1B_allocating_connected
-       t7 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S0B_idle_connected -> t7:tableport:w [arrowhead=none]
-       t7:tableport:e -> S0A_idle
-       t8 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_allocated</font></td></tr><tr 
><td color="pink"><font 
point-size="9">build_and_notify</font></td></tr></table>> margin=0.2 shape=none]
-       S1B_allocating_connected -> t8:tableport:w [arrowhead=none]
-       t8:tableport:e -> S2_done
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._boss.Boss.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._boss.Boss.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._boss.Boss.m.dot
  2024-10-31 09:39:10.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._boss.Boss.m.dot
  1970-01-01 01:00:00.000000000 +0100
@@ -1,182 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S0_empty [color=blue fontame="Menlo-Bold" shape=ellipse style=bold]
-       S4_closed [color=blue fontame=Menlo shape=ellipse style=""]
-       S3_closing [color=blue fontame=Menlo shape=ellipse style=""]
-       S2_happy [color=blue fontame=Menlo shape=ellipse style=""]
-       S1_lonely [color=blue fontame=Menlo shape=ellipse style=""]
-       S1_growing [color=blue fontame=Menlo shape=ellipse style=""]
-       t0 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">send</font></td></tr></table>> margin=0.2 shape=none]
-       S3_closing -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> S3_closing
-       t1 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">closed</font></td></tr><tr ><td 
color="pink"><font point-size="9">W_closed</font></td></tr></table>> margin=0.2 
shape=none]
-       S3_closing -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S4_closed
-       t2 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">error</font></td></tr><tr ><td 
color="pink"><font point-size="9">W_close_with_error</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0_empty -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S4_closed
-       t3 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">_got_dilate</font></td></tr><tr ><td 
color="pink"><font point-size="9">D_received_dilate</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_happy -> t3:tableport:w [arrowhead=none]
-       t3:tableport:e -> S2_happy
-       t4 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">send</font></td></tr><tr ><td 
color="pink"><font point-size="9">S_send</font></td></tr></table>> margin=0.2 
shape=none]
-       S1_lonely -> t4:tableport:w [arrowhead=none]
-       t4:tableport:e -> S1_lonely
-       t5 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_unwelcome</font></td></tr><tr 
><td color="pink"><font 
point-size="9">close_unwelcome</font></td></tr></table>> margin=0.2 shape=none]
-       S2_happy -> t5:tableport:w [arrowhead=none]
-       t5:tableport:e -> S3_closing
-       t6 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">_got_phase</font></td></tr><tr ><td 
color="pink"><font point-size="9">_grow_got_phase</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_growing -> t6:tableport:w [arrowhead=none]
-       t6:tableport:e -> S1_growing
-       t7 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">scared</font></td></tr><tr ><td 
color="pink"><font point-size="9">close_scared</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_growing -> t7:tableport:w [arrowhead=none]
-       t7:tableport:e -> S3_closing
-       t8 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">_got_phase</font></td></tr></table>> margin=0.2 shape=none]
-       S3_closing -> t8:tableport:w [arrowhead=none]
-       t8:tableport:e -> S3_closing
-       t9 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">send</font></td></tr></table>> margin=0.2 shape=none]
-       S4_closed -> t9:tableport:w [arrowhead=none]
-       t9:tableport:e -> S4_closed
-       t10 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">_got_welcome</font></td></tr><tr 
><td color="pink"><font point-size="9">water_seed</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_growing -> t10:tableport:w [arrowhead=none]
-       t10:tableport:e -> S1_growing
-       t11 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_unwelcome</font></td></tr><tr 
><td color="pink"><font 
point-size="9">close_unwelcome</font></td></tr></table>> margin=0.2 shape=none]
-       S1_growing -> t11:tableport:w [arrowhead=none]
-       t11:tableport:e -> S3_closing
-       t12 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_code</font></td></tr><tr ><td 
color="pink"><font point-size="9">do_got_code</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0_empty -> t12:tableport:w [arrowhead=none]
-       t12:tableport:e -> S1_lonely
-       t13 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">error</font></td></tr><tr ><td 
color="pink"><font point-size="9">W_close_with_error</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_lonely -> t13:tableport:w [arrowhead=none]
-       t13:tableport:e -> S4_closed
-       t14 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_error</font></td></tr><tr ><td 
color="pink"><font point-size="9">W_close_rx_error</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0_empty -> t14:tableport:w [arrowhead=none]
-       t14:tableport:e -> S3_closing
-       t15 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_unwelcome</font></td></tr><tr 
><td color="pink"><font 
point-size="9">close_unwelcome</font></td></tr></table>> margin=0.2 shape=none]
-       S0_empty -> t15:tableport:w [arrowhead=none]
-       t15:tableport:e -> S3_closing
-       t16 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">close</font></td></tr></table>> margin=0.2 shape=none]
-       S3_closing -> t16:tableport:w [arrowhead=none]
-       t16:tableport:e -> S3_closing
-       t17 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_error</font></td></tr><tr ><td 
color="pink"><font point-size="9">W_close_rx_error</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_growing -> t17:tableport:w [arrowhead=none]
-       t17:tableport:e -> S3_closing
-       t18 [label=<<table ><tr ><td color="purple" colspan="2" 
port="tableport"><font face="menlo-italic">got_key</font></td></tr><tr ><td 
color="pink"><font point-size="9">W_got_key</font></td><td color="pink"><font 
point-size="9">D_got_key</font></td></tr></table>> margin=0.2 shape=none]
-       S1_growing -> t18:tableport:w [arrowhead=none]
-       t18:tableport:e -> S1_growing
-       t19 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">scared</font></td></tr><tr ><td 
color="pink"><font point-size="9">close_scared</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_happy -> t19:tableport:w [arrowhead=none]
-       t19:tableport:e -> S3_closing
-       t20 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">_got_phase</font></td></tr></table>> margin=0.2 shape=none]
-       S4_closed -> t20:tableport:w [arrowhead=none]
-       t20:tableport:e -> S4_closed
-       t21 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">scared</font></td></tr></table>> margin=0.2 shape=none]
-       S4_closed -> t21:tableport:w [arrowhead=none]
-       t21:tableport:e -> S4_closed
-       t22 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">error</font></td></tr><tr ><td 
color="pink"><font point-size="9">W_close_with_error</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_happy -> t22:tableport:w [arrowhead=none]
-       t22:tableport:e -> S4_closed
-       t23 [label=<<table ><tr ><td color="purple" colspan="2" 
port="tableport"><font face="menlo-italic">got_key</font></td></tr><tr ><td 
color="pink"><font point-size="9">W_got_key</font></td><td color="pink"><font 
point-size="9">D_got_key</font></td></tr></table>> margin=0.2 shape=none]
-       S1_lonely -> t23:tableport:w [arrowhead=none]
-       t23:tableport:e -> S1_lonely
-       t24 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">close_lonely</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_growing -> t24:tableport:w [arrowhead=none]
-       t24:tableport:e -> S3_closing
-       t25 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">close_happy</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_happy -> t25:tableport:w [arrowhead=none]
-       t25:tableport:e -> S3_closing
-       t26 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">happy</font></td></tr></table>> margin=0.2 shape=none]
-       S1_growing -> t26:tableport:w [arrowhead=none]
-       t26:tableport:e -> S2_happy
-       t27 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_error</font></td></tr><tr ><td 
color="pink"><font point-size="9">close_error</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_happy -> t27:tableport:w [arrowhead=none]
-       t27:tableport:e -> S3_closing
-       t28 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_error</font></td></tr><tr ><td 
color="pink"><font point-size="9">W_close_rx_error</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_lonely -> t28:tableport:w [arrowhead=none]
-       t28:tableport:e -> S3_closing
-       t29 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">rx_unwelcome</font></td></tr></table>> margin=0.2 
shape=none]
-       S3_closing -> t29:tableport:w [arrowhead=none]
-       t29:tableport:e -> S3_closing
-       t30 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">rx_error</font></td></tr></table>> margin=0.2 shape=none]
-       S3_closing -> t30:tableport:w [arrowhead=none]
-       t30:tableport:e -> S3_closing
-       t31 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">got_verifier</font></td></tr></table>> margin=0.2 
shape=none]
-       S3_closing -> t31:tableport:w [arrowhead=none]
-       t31:tableport:e -> S3_closing
-       t32 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">error</font></td></tr><tr ><td 
color="pink"><font point-size="9">W_close_with_error</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_growing -> t32:tableport:w [arrowhead=none]
-       t32:tableport:e -> S4_closed
-       t33 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">scared</font></td></tr></table>> margin=0.2 shape=none]
-       S3_closing -> t33:tableport:w [arrowhead=none]
-       t33:tableport:e -> S3_closing
-       t34 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">send</font></td></tr><tr ><td 
color="pink"><font point-size="9">S_send</font></td></tr></table>> margin=0.2 
shape=none]
-       S1_growing -> t34:tableport:w [arrowhead=none]
-       t34:tableport:e -> S1_growing
-       t35 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_unwelcome</font></td></tr><tr 
><td color="pink"><font 
point-size="9">close_unwelcome</font></td></tr></table>> margin=0.2 shape=none]
-       S1_lonely -> t35:tableport:w [arrowhead=none]
-       t35:tableport:e -> S3_closing
-       t36 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">_got_version</font></td></tr></table>> margin=0.2 
shape=none]
-       S3_closing -> t36:tableport:w [arrowhead=none]
-       t36:tableport:e -> S3_closing
-       t37 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">happy</font></td></tr></table>> margin=0.2 shape=none]
-       S3_closing -> t37:tableport:w [arrowhead=none]
-       t37:tableport:e -> S3_closing
-       t38 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">send</font></td></tr><tr ><td 
color="pink"><font point-size="9">S_send</font></td></tr></table>> margin=0.2 
shape=none]
-       S2_happy -> t38:tableport:w [arrowhead=none]
-       t38:tableport:e -> S2_happy
-       t39 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">error</font></td></tr></table>> margin=0.2 shape=none]
-       S4_closed -> t39:tableport:w [arrowhead=none]
-       t39:tableport:e -> S4_closed
-       t40 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">rx_unwelcome</font></td></tr></table>> margin=0.2 
shape=none]
-       S4_closed -> t40:tableport:w [arrowhead=none]
-       t40:tableport:e -> S4_closed
-       t41 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">close_lonely</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0_empty -> t41:tableport:w [arrowhead=none]
-       t41:tableport:e -> S3_closing
-       t42 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">got_verifier</font></td></tr></table>> margin=0.2 
shape=none]
-       S4_closed -> t42:tableport:w [arrowhead=none]
-       t42:tableport:e -> S4_closed
-       t43 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">_got_dilate</font></td></tr></table>> margin=0.2 shape=none]
-       S4_closed -> t43:tableport:w [arrowhead=none]
-       t43:tableport:e -> S4_closed
-       t44 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">_got_phase</font></td></tr><tr ><td 
color="pink"><font point-size="9">W_received</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_happy -> t44:tableport:w [arrowhead=none]
-       t44:tableport:e -> S2_happy
-       t45 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">send</font></td></tr><tr ><td 
color="pink"><font point-size="9">S_send</font></td></tr></table>> margin=0.2 
shape=none]
-       S0_empty -> t45:tableport:w [arrowhead=none]
-       t45:tableport:e -> S0_empty
-       t46 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">scared</font></td></tr><tr ><td 
color="pink"><font point-size="9">close_scared</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_lonely -> t46:tableport:w [arrowhead=none]
-       t46:tableport:e -> S3_closing
-       t47 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">error</font></td></tr><tr ><td 
color="pink"><font point-size="9">W_close_with_error</font></td></tr></table>> 
margin=0.2 shape=none]
-       S3_closing -> t47:tableport:w [arrowhead=none]
-       t47:tableport:e -> S4_closed
-       t48 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">happy</font></td></tr></table>> margin=0.2 shape=none]
-       S1_lonely -> t48:tableport:w [arrowhead=none]
-       t48:tableport:e -> S2_happy
-       t49 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">_got_version</font></td></tr><tr 
><td color="pink"><font 
point-size="9">process_version</font></td></tr></table>> margin=0.2 shape=none]
-       S2_happy -> t49:tableport:w [arrowhead=none]
-       t49:tableport:e -> S2_happy
-       t50 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">_got_dilate</font></td></tr></table>> margin=0.2 shape=none]
-       S3_closing -> t50:tableport:w [arrowhead=none]
-       t50:tableport:e -> S3_closing
-       t51 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">_got_version</font></td></tr></table>> margin=0.2 
shape=none]
-       S4_closed -> t51:tableport:w [arrowhead=none]
-       t51:tableport:e -> S4_closed
-       t52 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">happy</font></td></tr></table>> margin=0.2 shape=none]
-       S4_closed -> t52:tableport:w [arrowhead=none]
-       t52:tableport:e -> S4_closed
-       t53 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">close_lonely</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_lonely -> t53:tableport:w [arrowhead=none]
-       t53:tableport:e -> S3_closing
-       t54 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_verifier</font></td></tr><tr 
><td color="pink"><font point-size="9">W_got_verifier</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_happy -> t54:tableport:w [arrowhead=none]
-       t54:tableport:e -> S2_happy
-       t55 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">got_seed</font></td></tr></table>> margin=0.2 shape=none]
-       S0_empty -> t55:tableport:w [arrowhead=none]
-       t55:tableport:e -> S1_growing
-       t56 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">close</font></td></tr></table>> margin=0.2 shape=none]
-       S4_closed -> t56:tableport:w [arrowhead=none]
-       t56:tableport:e -> S4_closed
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._code.Code.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._code.Code.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._code.Code.m.dot
  2024-10-31 09:39:10.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._code.Code.m.dot
  1970-01-01 01:00:00.000000000 +0100
@@ -1,28 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S4_known [color=blue fontame=Menlo shape=ellipse style=""]
-       S3_allocating [color=blue fontame=Menlo shape=ellipse style=""]
-       S2_inputting_words [color=blue fontame=Menlo shape=ellipse style=""]
-       S1_inputting_nameplate [color=blue fontame=Menlo shape=ellipse style=""]
-       S0_idle [color=blue fontame="Menlo-Bold" shape=ellipse style=bold]
-       t0 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_nameplate</font></td></tr><tr 
><td color="pink"><font 
point-size="9">do_middle_input</font></td></tr></table>> margin=0.2 shape=none]
-       S1_inputting_nameplate -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> S2_inputting_words
-       t1 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">input_code</font></td></tr><tr ><td 
color="pink"><font point-size="9">do_start_input</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0_idle -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S1_inputting_nameplate
-       t2 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">allocate_code</font></td></tr><tr 
><td color="pink"><font 
point-size="9">do_start_allocate</font></td></tr></table>> margin=0.2 
shape=none]
-       S0_idle -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S3_allocating
-       t3 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">_set_code</font></td></tr><tr ><td 
color="pink"><font point-size="9">do_set_code</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0_idle -> t3:tableport:w [arrowhead=none]
-       t3:tableport:e -> S4_known
-       t4 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">allocated</font></td></tr><tr ><td 
color="pink"><font point-size="9">do_finish_allocate</font></td></tr></table>> 
margin=0.2 shape=none]
-       S3_allocating -> t4:tableport:w [arrowhead=none]
-       t4:tableport:e -> S4_known
-       t5 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">finished_input</font></td></tr><tr 
><td color="pink"><font 
point-size="9">do_finish_input</font></td></tr></table>> margin=0.2 shape=none]
-       S2_inputting_words -> t5:tableport:w [arrowhead=none]
-       t5:tableport:e -> S4_known
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._input.Input.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._input.Input.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._input.Input.m.dot
        2024-10-31 09:39:10.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._input.Input.m.dot
        1970-01-01 01:00:00.000000000 +0100
@@ -1,94 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S4_done [color=blue fontame=Menlo shape=ellipse style=""]
-       S3_typing_code_yes_wordlist [color=blue fontame=Menlo shape=ellipse 
style=""]
-       S2_typing_code_no_wordlist [color=blue fontame=Menlo shape=ellipse 
style=""]
-       S1_typing_nameplate [color=blue fontame=Menlo shape=ellipse style=""]
-       S0_idle [color=blue fontame="Menlo-Bold" shape=ellipse style=bold]
-       t0 [label=<<table ><tr ><td color="purple" colspan="2" 
port="tableport"><font face="menlo-italic">got_wordlist</font></td></tr><tr 
><td color="pink"><font point-size="9">record_wordlist</font></td><td 
color="pink"><font 
point-size="9">notify_wordlist_waiters</font></td></tr></table>> margin=0.2 
shape=none]
-       S0_idle -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> S0_idle
-       t1 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">_choose_nameplate</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">record_all_nameplates</font></td></tr></table>> margin=0.2 
shape=none]
-       S1_typing_nameplate -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S2_typing_code_no_wordlist
-       t2 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">got_nameplates</font></td></tr></table>> margin=0.2 
shape=none]
-       S2_typing_code_no_wordlist -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S2_typing_code_no_wordlist
-       t3 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">refresh_nameplates</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">raise_already_chose_nameplate1</font></td></tr></table>> 
margin=0.2 shape=none]
-       S3_typing_code_yes_wordlist -> t3:tableport:w [arrowhead=none]
-       t3:tableport:e -> S3_typing_code_yes_wordlist
-       t4 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">get_word_completions</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">_get_word_completions</font></td></tr></table>> margin=0.2 
shape=none]
-       S3_typing_code_yes_wordlist -> t4:tableport:w [arrowhead=none]
-       t4:tableport:e -> S3_typing_code_yes_wordlist
-       t5 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">choose_words</font></td></tr><tr 
><td color="pink"><font point-size="9">do_words</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_typing_code_no_wordlist -> t5:tableport:w [arrowhead=none]
-       t5:tableport:e -> S4_done
-       t6 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">get_nameplate_completions</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">raise_already_chose_nameplate2</font></td></tr></table>> 
margin=0.2 shape=none]
-       S3_typing_code_yes_wordlist -> t6:tableport:w [arrowhead=none]
-       t6:tableport:e -> S3_typing_code_yes_wordlist
-       t7 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">_choose_nameplate</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">raise_already_chose_nameplate3</font></td></tr></table>> 
margin=0.2 shape=none]
-       S3_typing_code_yes_wordlist -> t7:tableport:w [arrowhead=none]
-       t7:tableport:e -> S3_typing_code_yes_wordlist
-       t8 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">get_word_completions</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">raise_must_choose_nameplate1</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_typing_nameplate -> t8:tableport:w [arrowhead=none]
-       t8:tableport:e -> S1_typing_nameplate
-       t9 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">choose_words</font></td></tr><tr 
><td color="pink"><font 
point-size="9">raise_must_choose_nameplate2</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_typing_nameplate -> t9:tableport:w [arrowhead=none]
-       t9:tableport:e -> S1_typing_nameplate
-       t10 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">choose_words</font></td></tr><tr 
><td color="pink"><font 
point-size="9">raise_already_chose_words2</font></td></tr></table>> margin=0.2 
shape=none]
-       S4_done -> t10:tableport:w [arrowhead=none]
-       t10:tableport:e -> S4_done
-       t11 [label=<<table ><tr ><td color="purple" colspan="2" 
port="tableport"><font face="menlo-italic">got_wordlist</font></td></tr><tr 
><td color="pink"><font point-size="9">record_wordlist</font></td><td 
color="pink"><font 
point-size="9">notify_wordlist_waiters</font></td></tr></table>> margin=0.2 
shape=none]
-       S2_typing_code_no_wordlist -> t11:tableport:w [arrowhead=none]
-       t11:tableport:e -> S3_typing_code_yes_wordlist
-       t12 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">got_nameplates</font></td></tr></table>> margin=0.2 
shape=none]
-       S4_done -> t12:tableport:w [arrowhead=none]
-       t12:tableport:e -> S4_done
-       t13 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">get_word_completions</font></td></tr><tr ><td 
color="pink"><font point-size="9">no_word_completions</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_typing_code_no_wordlist -> t13:tableport:w [arrowhead=none]
-       t13:tableport:e -> S2_typing_code_no_wordlist
-       t14 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">get_nameplate_completions</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">_get_nameplate_completions</font></td></tr></table>> margin=0.2 
shape=none]
-       S1_typing_nameplate -> t14:tableport:w [arrowhead=none]
-       t14:tableport:e -> S1_typing_nameplate
-       t15 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">refresh_nameplates</font></td></tr><tr ><td 
color="pink"><font point-size="9">do_refresh</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_typing_nameplate -> t15:tableport:w [arrowhead=none]
-       t15:tableport:e -> S1_typing_nameplate
-       t16 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">got_nameplates</font></td></tr></table>> margin=0.2 
shape=none]
-       S3_typing_code_yes_wordlist -> t16:tableport:w [arrowhead=none]
-       t16:tableport:e -> S3_typing_code_yes_wordlist
-       t17 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">_choose_nameplate</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">raise_already_chose_nameplate3</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_typing_code_no_wordlist -> t17:tableport:w [arrowhead=none]
-       t17:tableport:e -> S2_typing_code_no_wordlist
-       t18 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">refresh_nameplates</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">raise_already_chose_nameplate1</font></td></tr></table>> 
margin=0.2 shape=none]
-       S4_done -> t18:tableport:w [arrowhead=none]
-       t18:tableport:e -> S4_done
-       t19 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">refresh_nameplates</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">raise_already_chose_nameplate1</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_typing_code_no_wordlist -> t19:tableport:w [arrowhead=none]
-       t19:tableport:e -> S2_typing_code_no_wordlist
-       t20 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">get_nameplate_completions</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">raise_already_chose_nameplate2</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_typing_code_no_wordlist -> t20:tableport:w [arrowhead=none]
-       t20:tableport:e -> S2_typing_code_no_wordlist
-       t21 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">got_wordlist</font></td></tr></table>> margin=0.2 
shape=none]
-       S4_done -> t21:tableport:w [arrowhead=none]
-       t21:tableport:e -> S4_done
-       t22 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">choose_words</font></td></tr><tr 
><td color="pink"><font point-size="9">do_words</font></td></tr></table>> 
margin=0.2 shape=none]
-       S3_typing_code_yes_wordlist -> t22:tableport:w [arrowhead=none]
-       t22:tableport:e -> S4_done
-       t23 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">_choose_nameplate</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">raise_already_chose_nameplate3</font></td></tr></table>> 
margin=0.2 shape=none]
-       S4_done -> t23:tableport:w [arrowhead=none]
-       t23:tableport:e -> S4_done
-       t24 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">start</font></td></tr><tr ><td 
color="pink"><font point-size="9">do_start</font></td></tr></table>> margin=0.2 
shape=none]
-       S0_idle -> t24:tableport:w [arrowhead=none]
-       t24:tableport:e -> S1_typing_nameplate
-       t25 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">get_word_completions</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">raise_already_chose_words1</font></td></tr></table>> margin=0.2 
shape=none]
-       S4_done -> t25:tableport:w [arrowhead=none]
-       t25:tableport:e -> S4_done
-       t26 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">get_nameplate_completions</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">raise_already_chose_nameplate2</font></td></tr></table>> 
margin=0.2 shape=none]
-       S4_done -> t26:tableport:w [arrowhead=none]
-       t26:tableport:e -> S4_done
-       t27 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_nameplates</font></td></tr><tr 
><td color="pink"><font 
point-size="9">record_nameplates</font></td></tr></table>> margin=0.2 
shape=none]
-       S1_typing_nameplate -> t27:tableport:w [arrowhead=none]
-       t27:tableport:e -> S1_typing_nameplate
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._key.Key.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._key.Key.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._key.Key.m.dot
    2024-10-31 09:39:11.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._key.Key.m.dot
    1970-01-01 01:00:00.000000000 +0100
@@ -1,21 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S01 [color=blue fontame=Menlo shape=ellipse style=""]
-       S00 [color=blue fontame="Menlo-Bold" shape=ellipse style=bold]
-       S11 [color=blue fontame=Menlo shape=ellipse style=""]
-       S10 [color=blue fontame=Menlo shape=ellipse style=""]
-       t0 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_code</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">deliver_code_and_stashed_pake</font></td></tr></table>> 
margin=0.2 shape=none]
-       S01 -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> S11
-       t1 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_code</font></td></tr><tr ><td 
color="pink"><font point-size="9">deliver_code</font></td></tr></table>> 
margin=0.2 shape=none]
-       S00 -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S10
-       t2 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_pake</font></td></tr><tr ><td 
color="pink"><font point-size="9">deliver_pake</font></td></tr></table>> 
margin=0.2 shape=none]
-       S10 -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S11
-       t3 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_pake</font></td></tr><tr ><td 
color="pink"><font point-size="9">stash_pake</font></td></tr></table>> 
margin=0.2 shape=none]
-       S00 -> t3:tableport:w [arrowhead=none]
-       t3:tableport:e -> S01
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._key._SortedKey.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._key._SortedKey.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._key._SortedKey.m.dot
     2024-10-31 09:39:11.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._key._SortedKey.m.dot
     1970-01-01 01:00:00.000000000 +0100
@@ -1,18 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S2_know_key [color=blue fontame=Menlo shape=ellipse style=""]
-       S1_know_code [color=blue fontame=Menlo shape=ellipse style=""]
-       S0_know_nothing [color=blue fontame="Menlo-Bold" shape=ellipse 
style=bold]
-       S3_scared [color=blue fontame=Menlo shape=ellipse style=""]
-       t0 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_code</font></td></tr><tr ><td 
color="pink"><font point-size="9">build_pake</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0_know_nothing -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> S1_know_code
-       t1 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_pake_bad</font></td></tr><tr 
><td color="pink"><font point-size="9">scared</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_know_code -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S3_scared
-       t2 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_pake_good</font></td></tr><tr 
><td color="pink"><font point-size="9">compute_key</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_know_code -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S2_know_key
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._lister.Lister.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._lister.Lister.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._lister.Lister.m.dot
      2024-10-31 09:39:11.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._lister.Lister.m.dot
      1970-01-01 01:00:00.000000000 +0100
@@ -1,39 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S1B_wanting_connected [color=blue fontame=Menlo shape=ellipse style=""]
-       S0B_idle_connected [color=blue fontame=Menlo shape=ellipse style=""]
-       S1A_wanting_disconnected [color=blue fontame=Menlo shape=ellipse 
style=""]
-       S0A_idle_disconnected [color=blue fontame="Menlo-Bold" shape=ellipse 
style=bold]
-       t0 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">refresh</font></td></tr></table>> margin=0.2 shape=none]
-       S1A_wanting_disconnected -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> S1A_wanting_disconnected
-       t1 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">connected</font></td></tr></table>> margin=0.2 shape=none]
-       S0A_idle_disconnected -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S0B_idle_connected
-       t2 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">connected</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_list</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1A_wanting_disconnected -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S1B_wanting_connected
-       t3 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_nameplates</font></td></tr><tr 
><td color="pink"><font 
point-size="9">I_got_nameplates</font></td></tr></table>> margin=0.2 shape=none]
-       S0B_idle_connected -> t3:tableport:w [arrowhead=none]
-       t3:tableport:e -> S0B_idle_connected
-       t4 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S0B_idle_connected -> t4:tableport:w [arrowhead=none]
-       t4:tableport:e -> S0A_idle_disconnected
-       t5 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">refresh</font></td></tr></table>> margin=0.2 shape=none]
-       S0A_idle_disconnected -> t5:tableport:w [arrowhead=none]
-       t5:tableport:e -> S1A_wanting_disconnected
-       t6 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">refresh</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_list</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1B_wanting_connected -> t6:tableport:w [arrowhead=none]
-       t6:tableport:e -> S1B_wanting_connected
-       t7 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">refresh</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_list</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0B_idle_connected -> t7:tableport:w [arrowhead=none]
-       t7:tableport:e -> S1B_wanting_connected
-       t8 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S1B_wanting_connected -> t8:tableport:w [arrowhead=none]
-       t8:tableport:e -> S1A_wanting_disconnected
-       t9 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_nameplates</font></td></tr><tr 
><td color="pink"><font 
point-size="9">I_got_nameplates</font></td></tr></table>> margin=0.2 shape=none]
-       S1B_wanting_connected -> t9:tableport:w [arrowhead=none]
-       t9:tableport:e -> S0B_idle_connected
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._mailbox.Mailbox.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._mailbox.Mailbox.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._mailbox.Mailbox.m.dot
    2024-10-31 09:39:11.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._mailbox.Mailbox.m.dot
    1970-01-01 01:00:00.000000000 +0100
@@ -1,109 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S3A [color=blue fontame=Menlo shape=ellipse style=""]
-       S3B [color=blue fontame=Menlo shape=ellipse style=""]
-       S1A [color=blue fontame=Menlo shape=ellipse style=""]
-       S4 [color=blue fontame=Menlo shape=ellipse style=""]
-       S2B [color=blue fontame=Menlo shape=ellipse style=""]
-       S2A [color=blue fontame=Menlo shape=ellipse style=""]
-       S0B [color=blue fontame=Menlo shape=ellipse style=""]
-       S0A [color=blue fontame="Menlo-Bold" shape=ellipse style=bold]
-       t0 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">add_message</font></td></tr></table>> margin=0.2 shape=none]
-       S3B -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> S3B
-       t1 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">close</font></td></tr></table>> margin=0.2 shape=none]
-       S4 -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S4
-       t2 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">ignore_mood_and_T_mailbox_done</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0A -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S4
-       t3 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S4 -> t3:tableport:w [arrowhead=none]
-       t3:tableport:e -> S4
-       t4 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">add_message</font></td></tr><tr ><td 
color="pink"><font point-size="9">queue</font></td></tr></table>> margin=0.2 
shape=none]
-       S0B -> t4:tableport:w [arrowhead=none]
-       t4:tableport:e -> S0B
-       t5 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">rx_message_theirs</font></td></tr></table>> margin=0.2 
shape=none]
-       S4 -> t5:tableport:w [arrowhead=none]
-       t5:tableport:e -> S4
-       t6 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">add_message</font></td></tr><tr ><td 
color="pink"><font point-size="9">queue</font></td></tr></table>> margin=0.2 
shape=none]
-       S2A -> t6:tableport:w [arrowhead=none]
-       t6:tableport:e -> S2A
-       t7 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">record_mood</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2A -> t7:tableport:w [arrowhead=none]
-       t7:tableport:e -> S3A
-       t8 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">ignore_mood_and_T_mailbox_done</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0B -> t8:tableport:w [arrowhead=none]
-       t8:tableport:e -> S4
-       t9 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">connected</font></td></tr></table>> margin=0.2 shape=none]
-       S4 -> t9:tableport:w [arrowhead=none]
-       t9:tableport:e -> S4
-       t10 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">add_message</font></td></tr></table>> margin=0.2 shape=none]
-       S4 -> t10:tableport:w [arrowhead=none]
-       t10:tableport:e -> S4
-       t11 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">rx_message_ours</font></td></tr></table>> margin=0.2 
shape=none]
-       S4 -> t11:tableport:w [arrowhead=none]
-       t11:tableport:e -> S4
-       t12 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">add_message</font></td></tr><tr ><td 
color="pink"><font point-size="9">queue</font></td></tr></table>> margin=0.2 
shape=none]
-       S1A -> t12:tableport:w [arrowhead=none]
-       t12:tableport:e -> S1A
-       t13 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_message_ours</font></td></tr><tr 
><td color="pink"><font point-size="9">dequeue</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2B -> t13:tableport:w [arrowhead=none]
-       t13:tableport:e -> S2B
-       t14 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">add_message</font></td></tr><tr ><td 
color="pink"><font point-size="9">queue</font></td></tr></table>> margin=0.2 
shape=none]
-       S0A -> t14:tableport:w [arrowhead=none]
-       t14:tableport:e -> S0A
-       t15 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">ignore_mood_and_T_mailbox_done</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1A -> t15:tableport:w [arrowhead=none]
-       t15:tableport:e -> S4
-       t16 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">connected</font></td></tr></table>> margin=0.2 shape=none]
-       S0A -> t16:tableport:w [arrowhead=none]
-       t16:tableport:e -> S0B
-       t17 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">rx_message_ours</font></td></tr></table>> margin=0.2 
shape=none]
-       S3B -> t17:tableport:w [arrowhead=none]
-       t17:tableport:e -> S3B
-       t18 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_closed</font></td></tr><tr ><td 
color="pink"><font point-size="9">T_mailbox_done</font></td></tr></table>> 
margin=0.2 shape=none]
-       S3B -> t18:tableport:w [arrowhead=none]
-       t18:tableport:e -> S4
-       t19 [label=<<table ><tr ><td color="purple" colspan="2" 
port="tableport"><font face="menlo-italic">connected</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_open</font></td><td color="pink"><font 
point-size="9">drain</font></td></tr></table>> margin=0.2 shape=none]
-       S2A -> t19:tableport:w [arrowhead=none]
-       t19:tableport:e -> S2B
-       t20 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">close</font></td></tr></table>> margin=0.2 shape=none]
-       S3B -> t20:tableport:w [arrowhead=none]
-       t20:tableport:e -> S3B
-       t21 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_mailbox</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">record_mailbox_and_RC_tx_open_and_drain</font></td></tr></table>>
 margin=0.2 shape=none]
-       S0B -> t21:tableport:w [arrowhead=none]
-       t21:tableport:e -> S2B
-       t22 [label=<<table ><tr ><td color="purple" colspan="2" 
port="tableport"><font face="menlo-italic">add_message</font></td></tr><tr ><td 
color="pink"><font point-size="9">queue</font></td><td color="pink"><font 
point-size="9">RC_tx_add</font></td></tr></table>> margin=0.2 shape=none]
-       S2B -> t22:tableport:w [arrowhead=none]
-       t22:tableport:e -> S2B
-       t23 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S2B -> t23:tableport:w [arrowhead=none]
-       t23:tableport:e -> S2A
-       t24 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S3B -> t24:tableport:w [arrowhead=none]
-       t24:tableport:e -> S3A
-       t25 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_mailbox</font></td></tr><tr ><td 
color="pink"><font point-size="9">record_mailbox</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0A -> t25:tableport:w [arrowhead=none]
-       t25:tableport:e -> S1A
-       t26 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">record_mood_and_RC_tx_close</font></td></tr></table>> margin=0.2 
shape=none]
-       S2B -> t26:tableport:w [arrowhead=none]
-       t26:tableport:e -> S3B
-       t27 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">connected</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_close</font></td></tr></table>> 
margin=0.2 shape=none]
-       S3A -> t27:tableport:w [arrowhead=none]
-       t27:tableport:e -> S3B
-       t28 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font 
face="menlo-italic">rx_message_theirs</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">N_release_and_accept</font></td></tr></table>> margin=0.2 
shape=none]
-       S2B -> t28:tableport:w [arrowhead=none]
-       t28:tableport:e -> S2B
-       t29 [label=<<table ><tr ><td color="purple" colspan="2" 
port="tableport"><font face="menlo-italic">connected</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_open</font></td><td color="pink"><font 
point-size="9">drain</font></td></tr></table>> margin=0.2 shape=none]
-       S1A -> t29:tableport:w [arrowhead=none]
-       t29:tableport:e -> S2B
-       t30 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S0B -> t30:tableport:w [arrowhead=none]
-       t30:tableport:e -> S0A
-       t31 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">rx_message_theirs</font></td></tr></table>> margin=0.2 
shape=none]
-       S3B -> t31:tableport:w [arrowhead=none]
-       t31:tableport:e -> S3B
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._nameplate.Nameplate.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._nameplate.Nameplate.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._nameplate.Nameplate.m.dot
        2024-10-31 09:39:11.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._nameplate.Nameplate.m.dot
        1970-01-01 01:00:00.000000000 +0100
@@ -1,105 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S2B [color=blue fontame=Menlo shape=ellipse style=""]
-       S2A [color=blue fontame=Menlo shape=ellipse style=""]
-       S1A [color=blue fontame=Menlo shape=ellipse style=""]
-       S4A [color=blue fontame=Menlo shape=ellipse style=""]
-       S4B [color=blue fontame=Menlo shape=ellipse style=""]
-       S0B [color=blue fontame=Menlo shape=ellipse style=""]
-       S3B [color=blue fontame=Menlo shape=ellipse style=""]
-       S5 [color=blue fontame=Menlo shape=ellipse style=""]
-       S3A [color=blue fontame=Menlo shape=ellipse style=""]
-       S0A [color=blue fontame="Menlo-Bold" shape=ellipse style=bold]
-       t0 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S0B -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> S0A
-       t1 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">close</font></td></tr></table>> margin=0.2 shape=none]
-       S2A -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S4A
-       t2 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_release</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2B -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S4B
-       t3 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S3B -> t3:tableport:w [arrowhead=none]
-       t3:tableport:e -> S3A
-       t4 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S4B -> t4:tableport:w [arrowhead=none]
-       t4:tableport:e -> S4A
-       t5 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">close</font></td></tr></table>> margin=0.2 shape=none]
-       S4B -> t5:tableport:w [arrowhead=none]
-       t5:tableport:e -> S4B
-       t6 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">release</font></td></tr></table>> margin=0.2 shape=none]
-       S4B -> t6:tableport:w [arrowhead=none]
-       t6:tableport:e -> S4B
-       t7 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">_set_nameplate</font></td></tr><tr 
><td color="pink"><font 
point-size="9">record_nameplate</font></td></tr></table>> margin=0.2 shape=none]
-       S0A -> t7:tableport:w [arrowhead=none]
-       t7:tableport:e -> S1A
-       t8 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">close</font></td></tr></table>> margin=0.2 shape=none]
-       S3A -> t8:tableport:w [arrowhead=none]
-       t8:tableport:e -> S4A
-       t9 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">close</font></td></tr></table>> margin=0.2 shape=none]
-       S5 -> t9:tableport:w [arrowhead=none]
-       t9:tableport:e -> S5
-       t10 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">connected</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_claim</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2A -> t10:tableport:w [arrowhead=none]
-       t10:tableport:e -> S2B
-       t11 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">rx_released</font></td></tr><tr ><td 
color="pink"><font point-size="9">T_nameplate_done</font></td></tr></table>> 
margin=0.2 shape=none]
-       S4B -> t11:tableport:w [arrowhead=none]
-       t11:tableport:e -> S5
-       t12 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_release</font></td></tr></table>> 
margin=0.2 shape=none]
-       S3B -> t12:tableport:w [arrowhead=none]
-       t12:tableport:e -> S4B
-       t13 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">release</font></td></tr><tr ><td 
color="pink"><font point-size="9">T_nameplate_done</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0B -> t13:tableport:w [arrowhead=none]
-       t13:tableport:e -> S5
-       t14 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">rx_claimed</font></td></tr></table>> margin=0.2 shape=none]
-       S4B -> t14:tableport:w [arrowhead=none]
-       t14:tableport:e -> S4B
-       t15 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">T_nameplate_done</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0B -> t15:tableport:w [arrowhead=none]
-       t15:tableport:e -> S5
-       t16 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">connected</font></td></tr></table>> margin=0.2 shape=none]
-       S3A -> t16:tableport:w [arrowhead=none]
-       t16:tableport:e -> S3B
-       t17 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">release</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_release</font></td></tr></table>> 
margin=0.2 shape=none]
-       S3B -> t17:tableport:w [arrowhead=none]
-       t17:tableport:e -> S4B
-       t18 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">_set_nameplate</font></td></tr><tr 
><td color="pink"><font 
point-size="9">record_nameplate_and_RC_tx_claim</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0B -> t18:tableport:w [arrowhead=none]
-       t18:tableport:e -> S2B
-       t19 [label=<<table ><tr ><td color="purple" colspan="2" 
port="tableport"><font face="menlo-italic">rx_claimed</font></td></tr><tr ><td 
color="pink"><font point-size="9">I_got_wordlist</font></td><td 
color="pink"><font point-size="9">M_got_mailbox</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2B -> t19:tableport:w [arrowhead=none]
-       t19:tableport:e -> S3B
-       t20 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">release</font></td></tr></table>> margin=0.2 shape=none]
-       S5 -> t20:tableport:w [arrowhead=none]
-       t20:tableport:e -> S5
-       t21 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">connected</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_claim</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1A -> t21:tableport:w [arrowhead=none]
-       t21:tableport:e -> S2B
-       t22 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S2B -> t22:tableport:w [arrowhead=none]
-       t22:tableport:e -> S2A
-       t23 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">connected</font></td></tr><tr ><td 
color="pink"><font point-size="9">RC_tx_release</font></td></tr></table>> 
margin=0.2 shape=none]
-       S4A -> t23:tableport:w [arrowhead=none]
-       t23:tableport:e -> S4B
-       t24 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">lost</font></td></tr></table>> margin=0.2 shape=none]
-       S5 -> t24:tableport:w [arrowhead=none]
-       t24:tableport:e -> S5
-       t25 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">T_nameplate_done</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0A -> t25:tableport:w [arrowhead=none]
-       t25:tableport:e -> S5
-       t26 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">connected</font></td></tr></table>> margin=0.2 shape=none]
-       S0A -> t26:tableport:w [arrowhead=none]
-       t26:tableport:e -> S0B
-       t27 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">close</font></td></tr></table>> margin=0.2 shape=none]
-       S4A -> t27:tableport:w [arrowhead=none]
-       t27:tableport:e -> S4A
-       t28 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">T_nameplate_done</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1A -> t28:tableport:w [arrowhead=none]
-       t28:tableport:e -> S5
-       t29 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">connected</font></td></tr></table>> margin=0.2 shape=none]
-       S5 -> t29:tableport:w [arrowhead=none]
-       t29:tableport:e -> S5
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._order.Order.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._order.Order.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._order.Order.m.dot
        2024-10-31 09:39:11.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._order.Order.m.dot
        1970-01-01 01:00:00.000000000 +0100
@@ -1,16 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S1_yes_pake [color=blue fontame=Menlo shape=ellipse style=""]
-       S0_no_pake [color=blue fontame="Menlo-Bold" shape=ellipse style=bold]
-       t0 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_non_pake</font></td></tr><tr 
><td color="pink"><font point-size="9">deliver</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_yes_pake -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> S1_yes_pake
-       t1 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_non_pake</font></td></tr><tr 
><td color="pink"><font point-size="9">queue</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0_no_pake -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S0_no_pake
-       t2 [label=<<table ><tr ><td color="purple" colspan="2" 
port="tableport"><font face="menlo-italic">got_pake</font></td></tr><tr ><td 
color="pink"><font point-size="9">notify_key</font></td><td color="pink"><font 
point-size="9">drain</font></td></tr></table>> margin=0.2 shape=none]
-       S0_no_pake -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S1_yes_pake
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._receive.Receive.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._receive.Receive.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._receive.Receive.m.dot
    2024-10-31 09:39:11.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._receive.Receive.m.dot
    1970-01-01 01:00:00.000000000 +0100
@@ -1,30 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S1_unverified_key [color=blue fontame=Menlo shape=ellipse style=""]
-       S3_scared [color=blue fontame=Menlo shape=ellipse style=""]
-       S0_unknown_key [color=blue fontame="Menlo-Bold" shape=ellipse 
style=bold]
-       S2_verified_key [color=blue fontame=Menlo shape=ellipse style=""]
-       t0 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">got_message_bad</font></td></tr></table>> margin=0.2 
shape=none]
-       S3_scared -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> S3_scared
-       t1 [label=<<table ><tr ><td color="purple" colspan="4" 
port="tableport"><font face="menlo-italic">got_message_good</font></td></tr><tr 
><td color="pink"><font point-size="9">S_got_verified_key</font></td><td 
color="pink"><font point-size="9">W_happy</font></td><td color="pink"><font 
point-size="9">W_got_verifier</font></td><td color="pink"><font 
point-size="9">W_got_message</font></td></tr></table>> margin=0.2 shape=none]
-       S1_unverified_key -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S2_verified_key
-       t2 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">got_message_good</font></td></tr></table>> margin=0.2 
shape=none]
-       S3_scared -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S3_scared
-       t3 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_message_good</font></td></tr><tr 
><td color="pink"><font point-size="9">W_got_message</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_verified_key -> t3:tableport:w [arrowhead=none]
-       t3:tableport:e -> S2_verified_key
-       t4 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_key</font></td></tr><tr ><td 
color="pink"><font point-size="9">record_key</font></td></tr></table>> 
margin=0.2 shape=none]
-       S0_unknown_key -> t4:tableport:w [arrowhead=none]
-       t4:tableport:e -> S1_unverified_key
-       t5 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_message_bad</font></td></tr><tr 
><td color="pink"><font point-size="9">W_scared</font></td></tr></table>> 
margin=0.2 shape=none]
-       S1_unverified_key -> t5:tableport:w [arrowhead=none]
-       t5:tableport:e -> S3_scared
-       t6 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">got_message_bad</font></td></tr><tr 
><td color="pink"><font point-size="9">W_scared</font></td></tr></table>> 
margin=0.2 shape=none]
-       S2_verified_key -> t6:tableport:w [arrowhead=none]
-       t6:tableport:e -> S3_scared
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._send.Send.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._send.Send.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._send.Send.m.dot
  2024-10-31 09:39:11.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._send.Send.m.dot
  1970-01-01 01:00:00.000000000 +0100
@@ -1,16 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S0_no_key [color=blue fontame="Menlo-Bold" shape=ellipse style=bold]
-       S1_verified_key [color=blue fontame=Menlo shape=ellipse style=""]
-       t0 [label=<<table ><tr ><td color="purple" colspan="2" 
port="tableport"><font face="menlo-italic">got_verified_key</font></td></tr><tr 
><td color="pink"><font point-size="9">record_key</font></td><td 
color="pink"><font point-size="9">drain</font></td></tr></table>> margin=0.2 
shape=none]
-       S0_no_key -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> S1_verified_key
-       t1 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">send</font></td></tr><tr ><td 
color="pink"><font point-size="9">deliver</font></td></tr></table>> margin=0.2 
shape=none]
-       S1_verified_key -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S1_verified_key
-       t2 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">send</font></td></tr><tr ><td 
color="pink"><font point-size="9">queue</font></td></tr></table>> margin=0.2 
shape=none]
-       S0_no_key -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S0_no_key
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._terminator.Terminator.m.dot
 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._terminator.Terminator.m.dot
--- 
old/magic_wormhole-0.23.0/docs/state-machines/.automat_visualize/wormhole._terminator.Terminator.m.dot
      2024-10-31 09:39:11.000000000 +0100
+++ 
new/magic_wormhole-0.24.0/docs/state-machines/.automat_visualize/wormhole._terminator.Terminator.m.dot
      1970-01-01 01:00:00.000000000 +0100
@@ -1,57 +0,0 @@
-digraph {
-       graph [dpi=100 pack=true]
-       node [fontname=Menlo]
-       edge [fontname=Menlo]
-       S0o [color=blue fontame=Menlo shape=ellipse style=""]
-       S_stoppingD [color=blue fontame=Menlo shape=ellipse style=""]
-       Smo [color=blue fontame=Menlo shape=ellipse style=""]
-       S_stopped [color=blue fontame=Menlo shape=ellipse style=""]
-       Sm [color=blue fontame=Menlo shape=ellipse style=""]
-       Snm [color=blue fontame=Menlo shape=ellipse style=""]
-       S_stoppingRC [color=blue fontame=Menlo shape=ellipse style=""]
-       Sn [color=blue fontame=Menlo shape=ellipse style=""]
-       Sno [color=blue fontame=Menlo shape=ellipse style=""]
-       Snmo [color=blue fontame="Menlo-Bold" shape=ellipse style=bold]
-       t0 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">close_mailbox</font></td></tr></table>> 
margin=0.2 shape=none]
-       Smo -> t0:tableport:w [arrowhead=none]
-       t0:tableport:e -> Sm
-       t1 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">stoppedRC</font></td></tr><tr ><td 
color="pink"><font point-size="9">stop_dilator</font></td></tr></table>> 
margin=0.2 shape=none]
-       S_stoppingRC -> t1:tableport:w [arrowhead=none]
-       t1:tableport:e -> S_stoppingD
-       t2 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">nameplate_done</font></td></tr><tr 
><td color="pink"><font point-size="9">RC_stop</font></td></tr></table>> 
margin=0.2 shape=none]
-       Sn -> t2:tableport:w [arrowhead=none]
-       t2:tableport:e -> S_stoppingRC
-       t3 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">mailbox_done</font></td></tr></table>> margin=0.2 
shape=none]
-       Snm -> t3:tableport:w [arrowhead=none]
-       t3:tableport:e -> Sn
-       t4 [label=<<table ><tr ><td color="purple" colspan="2" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">close_nameplate</font></td><td 
color="pink"><font point-size="9">close_mailbox</font></td></tr></table>> 
margin=0.2 shape=none]
-       Snmo -> t4:tableport:w [arrowhead=none]
-       t4:tableport:e -> Snm
-       t5 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">mailbox_done</font></td></tr></table>> margin=0.2 
shape=none]
-       Snmo -> t5:tableport:w [arrowhead=none]
-       t5:tableport:e -> Sno
-       t6 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">stoppedD</font></td></tr><tr ><td 
color="pink"><font point-size="9">B_closed</font></td></tr></table>> margin=0.2 
shape=none]
-       S_stoppingD -> t6:tableport:w [arrowhead=none]
-       t6:tableport:e -> S_stopped
-       t7 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">nameplate_done</font></td></tr></table>> margin=0.2 
shape=none]
-       Sno -> t7:tableport:w [arrowhead=none]
-       t7:tableport:e -> S0o
-       t8 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font 
point-size="9">ignore_mood_and_RC_stop</font></td></tr></table>> margin=0.2 
shape=none]
-       S0o -> t8:tableport:w [arrowhead=none]
-       t8:tableport:e -> S_stoppingRC
-       t9 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">close</font></td></tr><tr ><td 
color="pink"><font point-size="9">close_nameplate</font></td></tr></table>> 
margin=0.2 shape=none]
-       Sno -> t9:tableport:w [arrowhead=none]
-       t9:tableport:e -> Sn
-       t10 [label=<<table ><tr ><td color="purple" colspan="1" 
port="tableport"><font face="menlo-italic">mailbox_done</font></td></tr><tr 
><td color="pink"><font point-size="9">RC_stop</font></td></tr></table>> 
margin=0.2 shape=none]
-       Sm -> t10:tableport:w [arrowhead=none]
-       t10:tableport:e -> S_stoppingRC
-       t11 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">nameplate_done</font></td></tr></table>> margin=0.2 
shape=none]
-       Snm -> t11:tableport:w [arrowhead=none]
-       t11:tableport:e -> Sm
-       t12 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">mailbox_done</font></td></tr></table>> margin=0.2 
shape=none]
-       Smo -> t12:tableport:w [arrowhead=none]
-       t12:tableport:e -> S0o
-       t13 [label=<<table ><tr ><td color="purple" port="tableport"><font 
face="menlo-italic">nameplate_done</font></td></tr></table>> margin=0.2 
shape=none]
-       Snmo -> t13:tableport:w [arrowhead=none]
-       t13:tableport:e -> Smo
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/src/magic_wormhole.egg-info/PKG-INFO 
new/magic_wormhole-0.24.0/src/magic_wormhole.egg-info/PKG-INFO
--- old/magic_wormhole-0.23.0/src/magic_wormhole.egg-info/PKG-INFO      
2026-03-10 23:51:03.000000000 +0100
+++ new/magic_wormhole-0.24.0/src/magic_wormhole.egg-info/PKG-INFO      
2026-05-05 18:31:36.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: magic-wormhole
-Version: 0.23.0
+Version: 0.24.0
 Summary: Securely transfer data between computers
 Home-page: https://github.com/warner/magic-wormhole
 Author: Brian Warner
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/src/magic_wormhole.egg-info/SOURCES.txt 
new/magic_wormhole-0.24.0/src/magic_wormhole.egg-info/SOURCES.txt
--- old/magic_wormhole-0.23.0/src/magic_wormhole.egg-info/SOURCES.txt   
2026-03-10 23:51:03.000000000 +0100
+++ new/magic_wormhole-0.24.0/src/magic_wormhole.egg-info/SOURCES.txt   
2026-05-05 18:31:36.000000000 +0200
@@ -48,19 +48,6 @@
 docs/state-machines/receive.dot
 docs/state-machines/send.dot
 docs/state-machines/terminator.dot
-docs/state-machines/.automat_visualize/wormhole._allocator.Allocator.m.dot
-docs/state-machines/.automat_visualize/wormhole._boss.Boss.m.dot
-docs/state-machines/.automat_visualize/wormhole._code.Code.m.dot
-docs/state-machines/.automat_visualize/wormhole._input.Input.m.dot
-docs/state-machines/.automat_visualize/wormhole._key.Key.m.dot
-docs/state-machines/.automat_visualize/wormhole._key._SortedKey.m.dot
-docs/state-machines/.automat_visualize/wormhole._lister.Lister.m.dot
-docs/state-machines/.automat_visualize/wormhole._mailbox.Mailbox.m.dot
-docs/state-machines/.automat_visualize/wormhole._nameplate.Nameplate.m.dot
-docs/state-machines/.automat_visualize/wormhole._order.Order.m.dot
-docs/state-machines/.automat_visualize/wormhole._receive.Receive.m.dot
-docs/state-machines/.automat_visualize/wormhole._send.Send.m.dot
-docs/state-machines/.automat_visualize/wormhole._terminator.Terminator.m.dot
 misc/demo-journal.py
 misc/dump-stats.py
 misc/dump-timing.py
@@ -107,9 +94,6 @@
 src/wormhole/transit.py
 src/wormhole/util.py
 src/wormhole/wormhole.py
-src/wormhole/wormhole_complete.bash
-src/wormhole/wormhole_complete.fish
-src/wormhole/wormhole_complete.zsh
 src/wormhole/xfer_util.py
 src/wormhole/_dilation/__init__.py
 src/wormhole/_dilation/_noise.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/magic_wormhole-0.23.0/src/wormhole/_version.py 
new/magic_wormhole-0.24.0/src/wormhole/_version.py
--- old/magic_wormhole-0.23.0/src/wormhole/_version.py  2026-03-10 
23:51:03.380799800 +0100
+++ new/magic_wormhole-0.24.0/src/wormhole/_version.py  2026-05-05 
18:31:36.389144700 +0200
@@ -8,11 +8,11 @@
 
 version_json = '''
 {
- "date": "2026-03-10T16:39:48-0600",
+ "date": "2026-05-05T10:25:10-0600",
  "dirty": false,
  "error": null,
- "full-revisionid": "c0fc2dc3ea07b84cc88ca7bbb05d9e48264567de",
- "version": "0.23.0"
+ "full-revisionid": "3bf46e020341ff966aa1ca58d7260005256c1a8f",
+ "version": "0.24.0"
 }
 '''  # END VERSION_JSON
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/src/wormhole/cli/cmd_receive.py 
new/magic_wormhole-0.24.0/src/wormhole/cli/cmd_receive.py
--- old/magic_wormhole-0.23.0/src/wormhole/cli/cmd_receive.py   2026-03-10 
23:34:16.000000000 +0100
+++ new/magic_wormhole-0.24.0/src/wormhole/cli/cmd_receive.py   2026-05-05 
18:22:40.000000000 +0200
@@ -298,7 +298,7 @@
     def _handle_text(self, them_d, w):
         # we're receiving a text message
         self.args.timing.add("print")
-        print(them_d["message"], file=self.args.stdout)
+        print(repr(them_d["message"])[1:-1], file=self.args.stdout)
         self._send_data({"answer": {"message_ack": "ok"}}, w)
 
     def _handle_file(self, them_d):
@@ -376,7 +376,7 @@
                     # the incoming file _inside_ of it (i.e.. don't
                     # delete + overwrite whole tree)
                     abs_destname = os.path.abspath(
-                        os.path.join(self.args.cwd, self.args.output_file, 
destname)
+                        os.path.join(self.args.cwd, self.args.output_file, 
os.path.basename(destname))
                     )
                     overwrite_allowed = True
                 else:
@@ -466,7 +466,7 @@
         """
         out_path = os.path.join(extract_dir, info.filename)
         out_path = os.path.abspath(out_path)
-        if not out_path.startswith(extract_dir):
+        if not out_path.startswith(extract_dir + os.sep):
             raise ValueError(
                 "malicious zipfile, %s outside of extract_dir %s" %
                 (info.filename, extract_dir))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/magic_wormhole-0.23.0/src/wormhole/test/test_cli.py 
new/magic_wormhole-0.24.0/src/wormhole/test/test_cli.py
--- old/magic_wormhole-0.23.0/src/wormhole/test/test_cli.py     2026-03-10 
23:34:16.000000000 +0100
+++ new/magic_wormhole-0.24.0/src/wormhole/test/test_cli.py     2026-05-05 
18:23:45.000000000 +0200
@@ -8,6 +8,7 @@
 import zipfile
 from functools import partial
 from textwrap import dedent, fill
+from pathlib import Path
 
 from click import UsageError
 from click.testing import CliRunner
@@ -24,6 +25,9 @@
 import pytest
 import pytest_twisted
 
+from hypothesis import given
+from hypothesis import strategies as st
+
 from .. import __version__
 from .._interfaces import ITorManager
 from ..cli import cli, cmd_receive, cmd_send, welcome
@@ -1161,6 +1165,7 @@
     args.output_file = None
     ef = cmd_receive.Receiver(args)._extract_file
     extract_dir = os.path.abspath(tmpdir_factory.mktemp("filenames"))
+    extract_base = os.path.basename(extract_dir)
 
     zf = mock.Mock()
     zi = mock.Mock()
@@ -1172,6 +1177,21 @@
         assert zf.extract.mock_calls == [mock.call(zi.filename, 
path=extract_dir)]
         assert chmod.mock_calls == [mock.call(expected, 5)]
 
+    # these test that the receiver prevents "Zip Slip", where zipfile
+    # members contain ".." or path-resetting extra slashes, to escape
+    # the target directory. The zipfile module already strips
+    # leading-slash, double-slash, ".", and "..", making the output safe
+    # against those, but we go further and throw an error if we see them
+
+    # basic reach-for-root attack
+    zf = mock.Mock()
+    zi = mock.Mock()
+    zi.filename = "/etc/passwd"
+    with pytest.raises(ValueError) as e:
+        ef(zf, zi, extract_dir)
+    assert "malicious zipfile" in str(e.value)
+
+    # basic climb-the-tree attack
     zf = mock.Mock()
     zi = mock.Mock()
     zi.filename = "../haha"
@@ -1179,23 +1199,32 @@
         ef(zf, zi, extract_dir)
         assert "malicious zipfile" in str(e)
 
+    # sneaky form that reaches for a sibling of the starting directory
+    # whose name is an extension of our own, like using
+    # "../target2/foo.txt" to escape a "target" directory. If the check
+    # in cmd_receive.py uses .startswith() *without* an extra / or
+    # os.sep, it won't catch this, and zipfile won't either.
     zf = mock.Mock()
     zi = mock.Mock()
-    zi.filename = "haha//root"  # abspath squashes this, hopefully zipfile
-    # does too
-    zi.external_attr = 5 << 16
-    expected = os.path.join(extract_dir, "haha", "root")
+    zi.filename = "../{}-plus-hyphen/haha".format(extract_base)
+    zi.external_attr = 0o600 << 16
     with mock.patch.object(cmd_receive.os, "chmod") as chmod:
-        ef(zf, zi, extract_dir)
-        assert zf.extract.mock_calls, [mock.call(zi.filename, 
path=extract_dir)]
-        assert chmod.mock_calls == [mock.call(expected, 5)]
+        with pytest.raises(ValueError) as e:
+            ef(zf, zi, extract_dir)
+        assert "malicious zipfile" in str(e)
 
+    # this form uses an internal extra slash to attempt access to the
+    # filesystem root, we rely on zipfile's handling (no error)
     zf = mock.Mock()
     zi = mock.Mock()
-    zi.filename = "/etc/passwd"
-    with pytest.raises(ValueError) as e:
+    # abspath squashes this, hopefully zipfile does too
+    zi.filename = "haha//root"
+    zi.external_attr = 5 << 16
+    expected = os.path.join(extract_dir, "haha", "root")
+    with mock.patch("os.chmod") as chmod:
         ef(zf, zi, extract_dir)
-    assert "malicious zipfile" in str(e.value)
+        assert zf.extract.mock_calls, [mock.call(zi.filename, 
path=extract_dir)]
+        assert chmod.mock_calls == [mock.call(expected, 5)]
 
 
     expected = os.path.join(extract_dir, "evil.txt")
@@ -1222,6 +1251,65 @@
     assert s == os.path.join(tmpdir, "destination_file")
 
 
+def test_existing_destdir_malicious(tmpdir_factory):
+    """
+    Test that our attempts to preserve an existing output
+    directory correctly work even if a zip contains a (possibly)
+    malicious path pointing outside of the destdir (e.g. via ../ and
+    similar)
+    """
+    args = mock.Mock()
+    args.relay_url = ""
+    tmpdir = tempfile.mkdtemp()
+    args.cwd = os.getcwd()
+    args.output_file = tmpdir
+    cmd = cmd_receive.Receiver(args)
+
+    s = cmd._decide_destname(None, "../../../destination_file")
+    assert s == os.path.join(tmpdir, "destination_file")
+
+
+@given(
+    st.lists(
+        st.one_of(
+            st.just(".."),
+            st.text(),
+        )
+    ),
+    st.one_of([st.just("file"), st.just("directory")]),
+    st.booleans(),
+)
+def test_destdir_traversal(tmpdir_factory, segments, mode, outdir):
+    """
+    Let Hypothesis explore the space of directories, and ensure we
+    can't traverse outside of our base.
+
+    segments: random path segments, including ".."'s
+    mode: "file" or "directory" (currently unused by _decide_destname)
+    outdir: whether to include an arg for pre-existing output directory
+    """
+    base = tmpdir_factory.mktemp("base")
+    args = mock.Mock()
+    args.relay_url = ""
+    if outdir:
+        args.output_file = base
+    else:
+        args.output_file = None
+
+    receiver = cmd_receive.Receiver(args)
+    receiver.args.cwd = base
+
+    try:
+        result = receiver._decide_destname(mode, "/".join(segments))
+    except cmd_receive.TransferRejectedError:
+        # in this case, we wouldn't even have tried to write to the
+        # path, so whatever happened to get here (path-wise) is fine
+        return
+    rpath = Path(result)
+    bpath = Path(base)
+    assert rpath.is_relative_to(bpath), "_decide_destname must always decide a 
subpath"
+
+
 def test_not_remove_existing_destdir(tmpdir_factory):
     """
     Do not remove an entire existing directory.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/src/wormhole/wormhole_complete.bash 
new/magic_wormhole-0.24.0/src/wormhole/wormhole_complete.bash
--- old/magic_wormhole-0.23.0/src/wormhole/wormhole_complete.bash       
2025-05-13 01:39:50.000000000 +0200
+++ new/magic_wormhole-0.24.0/src/wormhole/wormhole_complete.bash       
1970-01-01 01:00:00.000000000 +0100
@@ -1,29 +0,0 @@
-_wormhole_completion() {
-    local IFS=$'\n'
-    local response
-
-    response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD 
_WORMHOLE_COMPLETE=bash_complete $1)
-
-    for completion in $response; do
-        IFS=',' read type value <<< "$completion"
-
-        if [[ $type == 'dir' ]]; then
-            COMPREPLY=()
-            compopt -o dirnames
-        elif [[ $type == 'file' ]]; then
-            COMPREPLY=()
-            compopt -o default
-        elif [[ $type == 'plain' ]]; then
-            COMPREPLY+=($value)
-        fi
-    done
-
-    return 0
-}
-
-_wormhole_completion_setup() {
-    complete -o nosort -F _wormhole_completion wormhole
-}
-
-_wormhole_completion_setup;
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/src/wormhole/wormhole_complete.fish 
new/magic_wormhole-0.24.0/src/wormhole/wormhole_complete.fish
--- old/magic_wormhole-0.23.0/src/wormhole/wormhole_complete.fish       
2025-05-13 01:39:51.000000000 +0200
+++ new/magic_wormhole-0.24.0/src/wormhole/wormhole_complete.fish       
1970-01-01 01:00:00.000000000 +0100
@@ -1,18 +0,0 @@
-function _wormhole_completion;
-    set -l response (env _WORMHOLE_COMPLETE=fish_complete 
COMP_WORDS=(commandline -cp) COMP_CWORD=(commandline -t) wormhole);
-
-    for completion in $response;
-        set -l metadata (string split "," $completion);
-
-        if test $metadata[1] = "dir";
-            __fish_complete_directories $metadata[2];
-        else if test $metadata[1] = "file";
-            __fish_complete_path $metadata[2];
-        else if test $metadata[1] = "plain";
-            echo $metadata[2];
-        end;
-    end;
-end;
-
-complete --no-files --command wormhole --arguments "(_wormhole_completion)";
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/magic_wormhole-0.23.0/src/wormhole/wormhole_complete.zsh 
new/magic_wormhole-0.24.0/src/wormhole/wormhole_complete.zsh
--- old/magic_wormhole-0.23.0/src/wormhole/wormhole_complete.zsh        
2025-05-13 01:39:50.000000000 +0200
+++ new/magic_wormhole-0.24.0/src/wormhole/wormhole_complete.zsh        
1970-01-01 01:00:00.000000000 +0100
@@ -1,41 +0,0 @@
-#compdef wormhole
-
-_wormhole_completion() {
-    local -a completions
-    local -a completions_with_descriptions
-    local -a response
-    (( ! $+commands[wormhole] )) && return 1
-
-    response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) 
_WORMHOLE_COMPLETE=zsh_complete wormhole)}")
-
-    for type key descr in ${response}; do
-        if [[ "$type" == "plain" ]]; then
-            if [[ "$descr" == "_" ]]; then
-                completions+=("$key")
-            else
-                completions_with_descriptions+=("$key":"$descr")
-            fi
-        elif [[ "$type" == "dir" ]]; then
-            _path_files -/
-        elif [[ "$type" == "file" ]]; then
-            _path_files -f
-        fi
-    done
-
-    if [ -n "$completions_with_descriptions" ]; then
-        _describe -V unsorted completions_with_descriptions -U
-    fi
-
-    if [ -n "$completions" ]; then
-        compadd -U -V unsorted -a completions
-    fi
-}
-
-if [[ $zsh_eval_context[-1] == loadautofunc ]]; then
-    # autoload from fpath, call function directly
-    _wormhole_completion "$@"
-else
-    # eval/source/. command, register function for later
-    compdef _wormhole_completion wormhole
-fi
-

Reply via email to