slidge 0.3.0a1__tar.gz → 0.3.0a3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. {slidge-0.3.0a1 → slidge-0.3.0a3}/PKG-INFO +1 -1
  2. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/gateway.py +2 -3
  3. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/mixins/attachment.py +5 -2
  4. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/mixins/avatar.py +11 -1
  5. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/session.py +1 -1
  6. slidge-0.3.0a3/slidge/db/alembic/versions/3231d2c623bc_add_unique_contraint_for_attachment_.py +33 -0
  7. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/models.py +1 -0
  8. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/store.py +6 -4
  9. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/group/room.py +2 -17
  10. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge.egg-info/PKG-INFO +1 -1
  11. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge.egg-info/SOURCES.txt +1 -0
  12. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_shakespeare.py +2 -1
  13. {slidge-0.3.0a1 → slidge-0.3.0a3}/.gitignore +0 -0
  14. {slidge-0.3.0a1 → slidge-0.3.0a3}/.pre-commit-config.yaml +0 -0
  15. {slidge-0.3.0a1 → slidge-0.3.0a3}/.woodpecker/container-ci.yaml +0 -0
  16. {slidge-0.3.0a1 → slidge-0.3.0a3}/.woodpecker/docs.yaml +0 -0
  17. {slidge-0.3.0a1 → slidge-0.3.0a3}/.woodpecker/package.yaml +0 -0
  18. {slidge-0.3.0a1 → slidge-0.3.0a3}/.woodpecker/test.yaml +0 -0
  19. {slidge-0.3.0a1 → slidge-0.3.0a3}/Dockerfile +0 -0
  20. {slidge-0.3.0a1 → slidge-0.3.0a3}/LICENSE +0 -0
  21. {slidge-0.3.0a1 → slidge-0.3.0a3}/README.md +0 -0
  22. {slidge-0.3.0a1 → slidge-0.3.0a3}/commitlint.config.js +0 -0
  23. {slidge-0.3.0a1 → slidge-0.3.0a3}/dev/assets/5x5.png +0 -0
  24. {slidge-0.3.0a1 → slidge-0.3.0a3}/dev/assets/slidge-color-small.png +0 -0
  25. {slidge-0.3.0a1 → slidge-0.3.0a3}/dev/assets/slidge-color.png +0 -0
  26. {slidge-0.3.0a1 → slidge-0.3.0a3}/dev/assets/slidge-mono-black.png +0 -0
  27. {slidge-0.3.0a1 → slidge-0.3.0a3}/dev/assets/slidge-mono-white.png +0 -0
  28. {slidge-0.3.0a1 → slidge-0.3.0a3}/dev/assets/slidge.svg +0 -0
  29. {slidge-0.3.0a1 → slidge-0.3.0a3}/dev/confs/movim.env +0 -0
  30. {slidge-0.3.0a1 → slidge-0.3.0a3}/dev/confs/nginx.conf +0 -0
  31. {slidge-0.3.0a1 → slidge-0.3.0a3}/dev/confs/slidge-dev.ini +0 -0
  32. {slidge-0.3.0a1 → slidge-0.3.0a3}/dev/confs/slidge-example.ini +0 -0
  33. {slidge-0.3.0a1 → slidge-0.3.0a3}/dev/hot-reload.sh +0 -0
  34. {slidge-0.3.0a1 → slidge-0.3.0a3}/dev/prettify_tests.py +0 -0
  35. {slidge-0.3.0a1 → slidge-0.3.0a3}/doap.xml +0 -0
  36. {slidge-0.3.0a1 → slidge-0.3.0a3}/docker-compose.yml +0 -0
  37. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/Makefile +0 -0
  38. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/admin/attachments.rst +0 -0
  39. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/admin/component.rst +0 -0
  40. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/admin/config/index.rst +0 -0
  41. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/admin/daemon.rst +0 -0
  42. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/admin/examples/ejabberd.yaml +0 -0
  43. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/admin/examples/index.rst +0 -0
  44. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/admin/examples/prosody.cfg.lua +0 -0
  45. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/admin/index.rst +0 -0
  46. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/admin/install.rst +0 -0
  47. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/admin/note.rst +0 -0
  48. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/admin/privilege.rst +0 -0
  49. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/codeberg.svg +0 -0
  50. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/conf.py +0 -0
  51. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/dev/contributing.rst +0 -0
  52. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/dev/design.rst +0 -0
  53. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/dev/howto.rst +0 -0
  54. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/dev/index.rst +0 -0
  55. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/dev/tutorial.rst +0 -0
  56. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/glossary.rst +0 -0
  57. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/index.rst +0 -0
  58. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/user/commands.rst +0 -0
  59. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/user/contacts.rst +0 -0
  60. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/user/foxyproxy.png +0 -0
  61. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/user/gajim.png +0 -0
  62. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/user/index.rst +0 -0
  63. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/user/low_profile.rst +0 -0
  64. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/user/movim1.png +0 -0
  65. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/user/movim2.png +0 -0
  66. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/user/note.rst +0 -0
  67. {slidge-0.3.0a1 → slidge-0.3.0a3}/docs/source/user/register.rst +0 -0
  68. {slidge-0.3.0a1 → slidge-0.3.0a3}/pyproject.toml +0 -0
  69. {slidge-0.3.0a1 → slidge-0.3.0a3}/setup.cfg +0 -0
  70. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/__init__.py +0 -0
  71. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/__main__.py +0 -0
  72. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/command/__init__.py +0 -0
  73. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/command/adhoc.py +0 -0
  74. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/command/admin.py +0 -0
  75. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/command/base.py +0 -0
  76. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/command/categories.py +0 -0
  77. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/command/chat_command.py +0 -0
  78. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/command/register.py +0 -0
  79. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/command/user.py +0 -0
  80. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/contact/__init__.py +0 -0
  81. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/contact/contact.py +0 -0
  82. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/contact/roster.py +0 -0
  83. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/__init__.py +0 -0
  84. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/config.py +0 -0
  85. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/__init__.py +0 -0
  86. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/caps.py +0 -0
  87. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/disco.py +0 -0
  88. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/message/__init__.py +0 -0
  89. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/message/chat_state.py +0 -0
  90. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/message/marker.py +0 -0
  91. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/message/message.py +0 -0
  92. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/muc/__init__.py +0 -0
  93. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/muc/admin.py +0 -0
  94. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/muc/mam.py +0 -0
  95. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/muc/misc.py +0 -0
  96. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/muc/owner.py +0 -0
  97. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/muc/ping.py +0 -0
  98. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/presence.py +0 -0
  99. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/registration.py +0 -0
  100. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/search.py +0 -0
  101. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/session_dispatcher.py +0 -0
  102. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/util.py +0 -0
  103. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/dispatcher/vcard.py +0 -0
  104. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/mixins/__init__.py +0 -0
  105. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/mixins/base.py +0 -0
  106. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/mixins/db.py +0 -0
  107. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/mixins/disco.py +0 -0
  108. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/mixins/message.py +0 -0
  109. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/mixins/message_maker.py +0 -0
  110. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/mixins/message_text.py +0 -0
  111. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/mixins/presence.py +0 -0
  112. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/mixins/recipient.py +0 -0
  113. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/core/pubsub.py +0 -0
  114. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/__init__.py +0 -0
  115. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/__init__.py +0 -0
  116. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/env.py +0 -0
  117. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/script.py.mako +0 -0
  118. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/0337c90c0b96_unify_legacy_xmpp_id_mappings.py +0 -0
  119. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/04cf35e3cf85_add_participant_nickname_no_illegal.py +0 -0
  120. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py +0 -0
  121. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/15b0bd83407a_remove_bogus_unique_constraints_on_room_.py +0 -0
  122. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py +0 -0
  123. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py +0 -0
  124. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/2b1f45ab7379_store_room_subject_setter_by_nickname.py +0 -0
  125. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/3071e0fa69d4_add_contact_client_type.py +0 -0
  126. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/45c24cc73c91_add_bob.py +0 -0
  127. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/4dbd23a3f868_new_avatar_store.py +0 -0
  128. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/54ce3cde350c_use_hash_for_avatar_filenames.py +0 -0
  129. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/58b98dacf819_refactor.py +0 -0
  130. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/5bd48bfdffa2_lift_room_legacy_id_constraint.py +0 -0
  131. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/75a62b74b239_ditch_hats_table.py +0 -0
  132. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/82a4af84b679_add_muc_history_filled.py +0 -0
  133. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/8b993243a536_add_vcard_content_to_contact_table.py +0 -0
  134. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py +0 -0
  135. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py +0 -0
  136. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/abba1ae0edb3_store_avatar_legacy_id_in_the_contact_.py +0 -0
  137. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py +0 -0
  138. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/b64b1a793483_add_source_and_legacy_id_for_archived_.py +0 -0
  139. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/c4a8ec35a0e8_per_room_user_nick.py +0 -0
  140. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py +0 -0
  141. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/avatar.py +0 -0
  142. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/db/meta.py +0 -0
  143. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/group/__init__.py +0 -0
  144. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/group/archive.py +0 -0
  145. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/group/bookmarks.py +0 -0
  146. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/group/participant.py +0 -0
  147. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/main.py +0 -0
  148. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/migration.py +0 -0
  149. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/py.typed +0 -0
  150. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/__init__.py +0 -0
  151. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/delivery_receipt.py +0 -0
  152. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/link_preview/__init__.py +0 -0
  153. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/link_preview/link_preview.py +0 -0
  154. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/link_preview/stanza.py +0 -0
  155. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/roster.py +0 -0
  156. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/xep_0077/__init__.py +0 -0
  157. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/xep_0077/register.py +0 -0
  158. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/xep_0077/stanza.py +0 -0
  159. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/xep_0100/__init__.py +0 -0
  160. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/xep_0100/gateway.py +0 -0
  161. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/xep_0100/stanza.py +0 -0
  162. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/xep_0153/__init__.py +0 -0
  163. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/xep_0153/vcard_avatar.py +0 -0
  164. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/xep_0292/__init__.py +0 -0
  165. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/slixfix/xep_0292/vcard4.py +0 -0
  166. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/util/__init__.py +0 -0
  167. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/util/archive_msg.py +0 -0
  168. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/util/conf.py +0 -0
  169. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/util/jid_escaping.py +0 -0
  170. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/util/lock.py +0 -0
  171. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/util/test.py +0 -0
  172. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/util/types.py +0 -0
  173. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge/util/util.py +0 -0
  174. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge.egg-info/dependency_links.txt +0 -0
  175. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge.egg-info/entry_points.txt +0 -0
  176. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge.egg-info/requires.txt +0 -0
  177. {slidge-0.3.0a1 → slidge-0.3.0a3}/slidge.egg-info/top_level.txt +0 -0
  178. {slidge-0.3.0a1 → slidge-0.3.0a3}/superduper/__init__.py +0 -0
  179. {slidge-0.3.0a1 → slidge-0.3.0a3}/superduper/__main__.py +0 -0
  180. {slidge-0.3.0a1 → slidge-0.3.0a3}/superduper/contact.py +0 -0
  181. {slidge-0.3.0a1 → slidge-0.3.0a3}/superduper/gateway.py +0 -0
  182. {slidge-0.3.0a1 → slidge-0.3.0a3}/superduper/group.py +0 -0
  183. {slidge-0.3.0a1 → slidge-0.3.0a3}/superduper/legacy_client.py +0 -0
  184. {slidge-0.3.0a1 → slidge-0.3.0a3}/superduper/session.py +0 -0
  185. {slidge-0.3.0a1 → slidge-0.3.0a3}/superduper/util.py +0 -0
  186. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/conftest.py +0 -0
  187. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_adhoc/test_access.py +0 -0
  188. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_adhoc/test_confirmation.py +0 -0
  189. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_adhoc/test_form.py +0 -0
  190. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_adhoc/test_reported.py +0 -0
  191. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_attachment.py +0 -0
  192. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_avatar.py +0 -0
  193. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_backfill.py +0 -0
  194. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_chat_commands.py +0 -0
  195. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_config.py +0 -0
  196. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_db/test_store.py +0 -0
  197. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_db/test_user.py +0 -0
  198. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_feature_restriction.py +0 -0
  199. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_mam_archivable.py +0 -0
  200. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_mds.py +0 -0
  201. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_muc.py +0 -0
  202. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_resourceprep.py +0 -0
  203. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_session.py +0 -0
  204. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_session_2.py +0 -0
  205. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_set_name_before_fill.py +0 -0
  206. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_stanza_link_preview.py +0 -0
  207. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_util.py +0 -0
  208. {slidge-0.3.0a1 → slidge-0.3.0a3}/tests/test_vcard.py +0 -0
  209. {slidge-0.3.0a1 → slidge-0.3.0a3}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: slidge
3
- Version: 0.3.0a1
3
+ Version: 0.3.0a3
4
4
  Summary: XMPP bridging framework
5
5
  Author-email: Nicolas Cedilnik <nicoco@nicoco.fr>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -906,16 +906,15 @@ class BaseGateway(
906
906
  await self.xmpp.plugin["xep_0077"].api["user_remove"](None, None, user.jid)
907
907
  await self.xmpp._session_cls.kill_by_jid(user.jid)
908
908
 
909
- async def unregister(self, user: GatewayUser) -> None:
909
+ async def unregister(self, session: BaseSession) -> None:
910
910
  """
911
911
  Optionally override this if you need to clean additional
912
912
  stuff after a user has been removed from the persistent user store.
913
913
 
914
914
  By default, this just calls :meth:`BaseSession.logout`.
915
915
 
916
- :param user:
916
+ :param session: The session of the user who just unregistered
917
917
  """
918
- session = self.get_session_from_user(user)
919
918
  try:
920
919
  await session.logout()
921
920
  except NotImplementedError:
@@ -141,11 +141,14 @@ class AttachmentMixin(TextMessageMixin):
141
141
  return r.status < 400
142
142
 
143
143
  async def __get_stored(self, attachment: LegacyAttachment) -> Attachment:
144
- if attachment.legacy_file_id is not None:
144
+ if attachment.legacy_file_id is not None and self.session is not NotImplemented:
145
145
  with self.xmpp.store.session() as orm:
146
146
  stored = (
147
147
  orm.query(Attachment)
148
- .filter_by(legacy_file_id=str(attachment.legacy_file_id))
148
+ .filter_by(
149
+ legacy_file_id=str(attachment.legacy_file_id),
150
+ user_account_id=self.session.user_pk,
151
+ )
149
152
  .one_or_none()
150
153
  )
151
154
  if stored is not None:
@@ -4,6 +4,7 @@ from typing import TYPE_CHECKING, Optional
4
4
 
5
5
  from PIL import UnidentifiedImageError
6
6
  from slixmpp import JID
7
+ from sqlalchemy.exc import IntegrityError
7
8
  from sqlalchemy.orm.exc import DetachedInstanceError
8
9
 
9
10
  from ...db.avatar import CachedAvatar, avatar_cache
@@ -126,7 +127,16 @@ class AvatarMixin(UpdateInfoMixin):
126
127
  self.stored.avatar = None
127
128
  else:
128
129
  self.stored.avatar = cached_avatar.stored
129
- self.commit(merge=True)
130
+ try:
131
+ self.commit(merge=True)
132
+ except IntegrityError as e:
133
+ self.log.debug(
134
+ "Hit integrity error, attempting to fix by refreshing participants"
135
+ )
136
+ with self.xmpp.store.session() as orm:
137
+ orm.refresh(self.stored, ["participants"])
138
+ self.commit(merge=True)
139
+
130
140
  self._post_avatar_update(cached_avatar)
131
141
 
132
142
  def get_cached_avatar(self) -> Optional["CachedAvatar"]:
@@ -704,8 +704,8 @@ class BaseSession(
704
704
  log.warning("User not found during unregistration")
705
705
  return
706
706
 
707
+ await cls.xmpp.unregister(session)
707
708
  with cls.xmpp.store.session() as orm:
708
- await cls.xmpp.unregister(session.user)
709
709
  orm.delete(session.user)
710
710
  orm.commit()
711
711
 
@@ -0,0 +1,33 @@
1
+ """Add unique contraint for attachment user/file_id
2
+
3
+ Revision ID: 3231d2c623bc
4
+ Revises: 75a62b74b239
5
+ Create Date: 2025-05-14 06:08:15.425495
6
+
7
+ """
8
+
9
+ from typing import Sequence, Union
10
+
11
+ import sqlalchemy as sa
12
+ from alembic import op
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision: str = "3231d2c623bc"
16
+ down_revision: Union[str, None] = "75a62b74b239"
17
+ branch_labels: Union[str, Sequence[str], None] = None
18
+ depends_on: Union[str, Sequence[str], None] = None
19
+
20
+
21
+ def upgrade() -> None:
22
+ with op.batch_alter_table("attachment", schema=None) as batch_op:
23
+ batch_op.create_unique_constraint(
24
+ batch_op.f("uq_attachment_user_account_id"),
25
+ ["user_account_id", "legacy_file_id"],
26
+ )
27
+
28
+
29
+ def downgrade() -> None:
30
+ with op.batch_alter_table("attachment", schema=None) as batch_op:
31
+ batch_op.drop_constraint(
32
+ batch_op.f("uq_attachment_user_account_id"), type_="unique"
33
+ )
@@ -300,6 +300,7 @@ class Attachment(Base):
300
300
  """
301
301
 
302
302
  __tablename__ = "attachment"
303
+ __table_args__ = (UniqueConstraint("user_account_id", "legacy_file_id"),)
303
304
 
304
305
  id: Mapped[int] = mapped_column(primary_key=True)
305
306
  user_account_id: Mapped[int] = mapped_column(ForeignKey("user_account.id"))
@@ -324,9 +324,10 @@ class MAMStore:
324
324
  if before_id is not None:
325
325
  stamp = session.execute(
326
326
  select(ArchivedMessage.timestamp).where(
327
- ArchivedMessage.stanza_id == before_id
327
+ ArchivedMessage.stanza_id == before_id,
328
+ ArchivedMessage.room_id == room_pk,
328
329
  )
329
- ).scalar()
330
+ ).scalar_one_or_none()
330
331
  if stamp is None:
331
332
  raise XMPPError(
332
333
  "item-not-found",
@@ -336,9 +337,10 @@ class MAMStore:
336
337
  if after_id is not None:
337
338
  stamp = session.execute(
338
339
  select(ArchivedMessage.timestamp).where(
339
- ArchivedMessage.stanza_id == after_id
340
+ ArchivedMessage.stanza_id == after_id,
341
+ ArchivedMessage.room_id == room_pk,
340
342
  )
341
- ).scalar()
343
+ ).scalar_one_or_none()
342
344
  if stamp is None:
343
345
  raise XMPPError(
344
346
  "item-not-found",
@@ -19,6 +19,7 @@ from slixmpp.plugins.xep_0492.stanza import NS as NOTIFY_NS
19
19
  from slixmpp.plugins.xep_0492.stanza import WhenLiteral
20
20
  from slixmpp.xmlstream import ET
21
21
  from sqlalchemy.orm import Session as OrmSession
22
+ from sqlalchemy.orm.exc import DetachedInstanceError
22
23
 
23
24
  from ..contact.contact import LegacyContact
24
25
  from ..contact.roster import ContactIsUser
@@ -87,17 +88,6 @@ class LegacyMUC(
87
88
  This is just a flag on archive responses that most clients ignore anyway.
88
89
  """
89
90
 
90
- KEEP_BACKFILLED_PARTICIPANTS = False
91
- """
92
- Set this to ``True`` if the participant list is not full after calling
93
- ``fill_participants()``. This is a workaround for networks with huge
94
- participant lists which do not map really well the MUCs where all presences
95
- are sent on join.
96
- It allows to ensure that the participants that last spoke (within the
97
- ``fill_history()`` method are effectively participants, thus making possible
98
- for XMPP clients to fetch their avatars.
99
- """
100
-
101
91
  _ALL_INFO_FILLED_ON_STARTUP = False
102
92
  """
103
93
  Set this to true if the fill_participants() / fill_participants() design does not
@@ -320,10 +310,6 @@ class LegacyMUC(
320
310
  return
321
311
  async with self.lock("fill history"):
322
312
  log.debug("Fetching history for %s", self)
323
- if not self.KEEP_BACKFILLED_PARTICIPANTS:
324
- with self.xmpp.store.session() as orm:
325
- orm.add(self.stored)
326
- participants = list(self.stored.participants)
327
313
  try:
328
314
  before, after = self.archive.get_hole_bounds()
329
315
  if before is not None:
@@ -339,8 +325,7 @@ class LegacyMUC(
339
325
  return
340
326
  except Exception as e:
341
327
  self.log.exception("Could not backfill", exc_info=e)
342
- if not self.KEEP_BACKFILLED_PARTICIPANTS:
343
- self.stored.participants = participants
328
+
344
329
  self.stored.history_filled = True
345
330
  self.commit(merge=True)
346
331
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: slidge
3
- Version: 0.3.0a1
3
+ Version: 0.3.0a3
4
4
  Summary: XMPP bridging framework
5
5
  Author-email: Nicolas Cedilnik <nicoco@nicoco.fr>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -128,6 +128,7 @@ slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py
128
128
  slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py
129
129
  slidge/db/alembic/versions/2b1f45ab7379_store_room_subject_setter_by_nickname.py
130
130
  slidge/db/alembic/versions/3071e0fa69d4_add_contact_client_type.py
131
+ slidge/db/alembic/versions/3231d2c623bc_add_unique_contraint_for_attachment_.py
131
132
  slidge/db/alembic/versions/45c24cc73c91_add_bob.py
132
133
  slidge/db/alembic/versions/4dbd23a3f868_new_avatar_store.py
133
134
  slidge/db/alembic/versions/54ce3cde350c_use_hash_for_avatar_filenames.py
@@ -463,7 +463,8 @@ class TestAimShakespeareBase(Base):
463
463
  """
464
464
  )
465
465
  assert len(unregistered) == 1
466
- assert unregistered[0].jid == "romeo@montague.lit"
466
+ assert unregistered[0].user.jid == "romeo@montague.lit"
467
+ unregistered.clear()
467
468
 
468
469
  def test_jid_validator(self):
469
470
  self.xmpp.jid_validator = re.compile(".*@noteverybody")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes