slidge 0.2.5__tar.gz → 0.2.6__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. {slidge-0.2.5 → slidge-0.2.6}/PKG-INFO +9 -10
  2. {slidge-0.2.5 → slidge-0.2.6}/commitlint.config.js +1 -0
  3. {slidge-0.2.5 → slidge-0.2.6}/pyproject.toml +21 -21
  4. {slidge-0.2.5 → slidge-0.2.6}/slidge/__version__.py +1 -1
  5. {slidge-0.2.5 → slidge-0.2.6}/slidge/command/adhoc.py +8 -0
  6. {slidge-0.2.5 → slidge-0.2.6}/slidge/command/user.py +5 -0
  7. {slidge-0.2.5 → slidge-0.2.6}/slidge/contact/contact.py +1 -7
  8. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/config.py +0 -4
  9. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/gateway.py +4 -2
  10. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/mixins/message.py +6 -9
  11. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/session.py +11 -3
  12. slidge-0.2.6/slidge/db/alembic/versions/04cf35e3cf85_add_participant_nickname_no_illegal.py +33 -0
  13. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py +0 -51
  14. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/models.py +1 -0
  15. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/store.py +3 -0
  16. {slidge-0.2.5 → slidge-0.2.6}/slidge/group/participant.py +4 -1
  17. {slidge-0.2.5 → slidge-0.2.6}/slidge/group/room.py +1 -1
  18. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/__init__.py +0 -2
  19. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0100/gateway.py +1 -4
  20. {slidge-0.2.5 → slidge-0.2.6}/slidge/util/util.py +5 -1
  21. {slidge-0.2.5 → slidge-0.2.6}/slidge.egg-info/PKG-INFO +9 -10
  22. {slidge-0.2.5 → slidge-0.2.6}/slidge.egg-info/SOURCES.txt +1 -5
  23. slidge-0.2.6/slidge.egg-info/requires.txt +10 -0
  24. {slidge-0.2.5 → slidge-0.2.6}/tests/test_avatar.py +20 -0
  25. {slidge-0.2.5 → slidge-0.2.6}/tests/test_shakespeare.py +16 -95
  26. {slidge-0.2.5 → slidge-0.2.6}/tests/test_util.py +0 -1
  27. {slidge-0.2.5 → slidge-0.2.6}/uv.lock +8 -53
  28. slidge-0.2.5/slidge/db/alembic/old_user_store.py +0 -183
  29. slidge-0.2.5/slidge/slixfix/xep_0356_old/__init__.py +0 -7
  30. slidge-0.2.5/slidge/slixfix/xep_0356_old/privilege.py +0 -167
  31. slidge-0.2.5/slidge/slixfix/xep_0356_old/stanza.py +0 -44
  32. slidge-0.2.5/slidge/util/db.py +0 -5
  33. slidge-0.2.5/slidge.egg-info/requires.txt +0 -11
  34. {slidge-0.2.5 → slidge-0.2.6}/.gitignore +0 -0
  35. {slidge-0.2.5 → slidge-0.2.6}/.pre-commit-config.yaml +0 -0
  36. {slidge-0.2.5 → slidge-0.2.6}/.woodpecker/container-cache.yml +0 -0
  37. {slidge-0.2.5 → slidge-0.2.6}/.woodpecker/container-ci.yaml +0 -0
  38. {slidge-0.2.5 → slidge-0.2.6}/.woodpecker/container.yml +0 -0
  39. {slidge-0.2.5 → slidge-0.2.6}/.woodpecker/docs.yaml +0 -0
  40. {slidge-0.2.5 → slidge-0.2.6}/.woodpecker/package.yaml +0 -0
  41. {slidge-0.2.5 → slidge-0.2.6}/.woodpecker/test.yaml +0 -0
  42. {slidge-0.2.5 → slidge-0.2.6}/Dockerfile +0 -0
  43. {slidge-0.2.5 → slidge-0.2.6}/LICENSE +0 -0
  44. {slidge-0.2.5 → slidge-0.2.6}/README.md +0 -0
  45. {slidge-0.2.5 → slidge-0.2.6}/dev/assets/5x5.png +0 -0
  46. {slidge-0.2.5 → slidge-0.2.6}/dev/assets/slidge-color-small.png +0 -0
  47. {slidge-0.2.5 → slidge-0.2.6}/dev/assets/slidge-color.png +0 -0
  48. {slidge-0.2.5 → slidge-0.2.6}/dev/assets/slidge-mono-black.png +0 -0
  49. {slidge-0.2.5 → slidge-0.2.6}/dev/assets/slidge-mono-white.png +0 -0
  50. {slidge-0.2.5 → slidge-0.2.6}/dev/assets/slidge.svg +0 -0
  51. {slidge-0.2.5 → slidge-0.2.6}/dev/confs/movim.env +0 -0
  52. {slidge-0.2.5 → slidge-0.2.6}/dev/confs/nginx.conf +0 -0
  53. {slidge-0.2.5 → slidge-0.2.6}/dev/confs/slidge-example.ini +0 -0
  54. {slidge-0.2.5 → slidge-0.2.6}/dev/prettify_tests.py +0 -0
  55. {slidge-0.2.5 → slidge-0.2.6}/doap.xml +0 -0
  56. {slidge-0.2.5 → slidge-0.2.6}/docker-compose.yml +0 -0
  57. {slidge-0.2.5 → slidge-0.2.6}/docs/Makefile +0 -0
  58. {slidge-0.2.5 → slidge-0.2.6}/docs/source/admin/attachments.rst +0 -0
  59. {slidge-0.2.5 → slidge-0.2.6}/docs/source/admin/component.rst +0 -0
  60. {slidge-0.2.5 → slidge-0.2.6}/docs/source/admin/config/index.rst +0 -0
  61. {slidge-0.2.5 → slidge-0.2.6}/docs/source/admin/daemon.rst +0 -0
  62. {slidge-0.2.5 → slidge-0.2.6}/docs/source/admin/examples/ejabberd.yaml +0 -0
  63. {slidge-0.2.5 → slidge-0.2.6}/docs/source/admin/examples/index.rst +0 -0
  64. {slidge-0.2.5 → slidge-0.2.6}/docs/source/admin/examples/prosody.cfg.lua +0 -0
  65. {slidge-0.2.5 → slidge-0.2.6}/docs/source/admin/index.rst +0 -0
  66. {slidge-0.2.5 → slidge-0.2.6}/docs/source/admin/install.rst +0 -0
  67. {slidge-0.2.5 → slidge-0.2.6}/docs/source/admin/note.rst +0 -0
  68. {slidge-0.2.5 → slidge-0.2.6}/docs/source/admin/privilege.rst +0 -0
  69. {slidge-0.2.5 → slidge-0.2.6}/docs/source/codeberg.svg +0 -0
  70. {slidge-0.2.5 → slidge-0.2.6}/docs/source/conf.py +0 -0
  71. {slidge-0.2.5 → slidge-0.2.6}/docs/source/dev/contributing.rst +0 -0
  72. {slidge-0.2.5 → slidge-0.2.6}/docs/source/dev/design.rst +0 -0
  73. {slidge-0.2.5 → slidge-0.2.6}/docs/source/dev/howto.rst +0 -0
  74. {slidge-0.2.5 → slidge-0.2.6}/docs/source/dev/index.rst +0 -0
  75. {slidge-0.2.5 → slidge-0.2.6}/docs/source/dev/tutorial.rst +0 -0
  76. {slidge-0.2.5 → slidge-0.2.6}/docs/source/glossary.rst +0 -0
  77. {slidge-0.2.5 → slidge-0.2.6}/docs/source/index.rst +0 -0
  78. {slidge-0.2.5 → slidge-0.2.6}/docs/source/user/commands.rst +0 -0
  79. {slidge-0.2.5 → slidge-0.2.6}/docs/source/user/contacts.rst +0 -0
  80. {slidge-0.2.5 → slidge-0.2.6}/docs/source/user/foxyproxy.png +0 -0
  81. {slidge-0.2.5 → slidge-0.2.6}/docs/source/user/gajim.png +0 -0
  82. {slidge-0.2.5 → slidge-0.2.6}/docs/source/user/index.rst +0 -0
  83. {slidge-0.2.5 → slidge-0.2.6}/docs/source/user/low_profile.rst +0 -0
  84. {slidge-0.2.5 → slidge-0.2.6}/docs/source/user/movim1.png +0 -0
  85. {slidge-0.2.5 → slidge-0.2.6}/docs/source/user/movim2.png +0 -0
  86. {slidge-0.2.5 → slidge-0.2.6}/docs/source/user/note.rst +0 -0
  87. {slidge-0.2.5 → slidge-0.2.6}/docs/source/user/register.rst +0 -0
  88. {slidge-0.2.5 → slidge-0.2.6}/setup.cfg +0 -0
  89. {slidge-0.2.5 → slidge-0.2.6}/slidge/__init__.py +0 -0
  90. {slidge-0.2.5 → slidge-0.2.6}/slidge/__main__.py +0 -0
  91. {slidge-0.2.5 → slidge-0.2.6}/slidge/command/__init__.py +0 -0
  92. {slidge-0.2.5 → slidge-0.2.6}/slidge/command/admin.py +0 -0
  93. {slidge-0.2.5 → slidge-0.2.6}/slidge/command/base.py +0 -0
  94. {slidge-0.2.5 → slidge-0.2.6}/slidge/command/categories.py +0 -0
  95. {slidge-0.2.5 → slidge-0.2.6}/slidge/command/chat_command.py +0 -0
  96. {slidge-0.2.5 → slidge-0.2.6}/slidge/command/register.py +0 -0
  97. {slidge-0.2.5 → slidge-0.2.6}/slidge/contact/__init__.py +0 -0
  98. {slidge-0.2.5 → slidge-0.2.6}/slidge/contact/roster.py +0 -0
  99. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/__init__.py +0 -0
  100. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/__init__.py +0 -0
  101. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/caps.py +0 -0
  102. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/disco.py +0 -0
  103. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/message/__init__.py +0 -0
  104. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/message/chat_state.py +0 -0
  105. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/message/marker.py +0 -0
  106. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/message/message.py +0 -0
  107. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/muc/__init__.py +0 -0
  108. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/muc/admin.py +0 -0
  109. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/muc/mam.py +0 -0
  110. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/muc/misc.py +0 -0
  111. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/muc/owner.py +0 -0
  112. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/muc/ping.py +0 -0
  113. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/presence.py +0 -0
  114. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/registration.py +0 -0
  115. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/search.py +0 -0
  116. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/session_dispatcher.py +0 -0
  117. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/util.py +0 -0
  118. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/dispatcher/vcard.py +0 -0
  119. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/mixins/__init__.py +0 -0
  120. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/mixins/attachment.py +0 -0
  121. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/mixins/avatar.py +0 -0
  122. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/mixins/base.py +0 -0
  123. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/mixins/db.py +0 -0
  124. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/mixins/disco.py +0 -0
  125. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/mixins/lock.py +0 -0
  126. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/mixins/message_maker.py +0 -0
  127. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/mixins/message_text.py +0 -0
  128. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/mixins/presence.py +0 -0
  129. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/mixins/recipient.py +0 -0
  130. {slidge-0.2.5 → slidge-0.2.6}/slidge/core/pubsub.py +0 -0
  131. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/__init__.py +0 -0
  132. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/__init__.py +0 -0
  133. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/env.py +0 -0
  134. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/script.py.mako +0 -0
  135. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py +0 -0
  136. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/15b0bd83407a_remove_bogus_unique_constraints_on_room_.py +0 -0
  137. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py +0 -0
  138. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py +0 -0
  139. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/2b1f45ab7379_store_room_subject_setter_by_nickname.py +0 -0
  140. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/3071e0fa69d4_add_contact_client_type.py +0 -0
  141. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/45c24cc73c91_add_bob.py +0 -0
  142. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/5bd48bfdffa2_lift_room_legacy_id_constraint.py +0 -0
  143. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/82a4af84b679_add_muc_history_filled.py +0 -0
  144. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/8b993243a536_add_vcard_content_to_contact_table.py +0 -0
  145. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py +0 -0
  146. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/abba1ae0edb3_store_avatar_legacy_id_in_the_contact_.py +0 -0
  147. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py +0 -0
  148. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/b64b1a793483_add_source_and_legacy_id_for_archived_.py +0 -0
  149. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/c4a8ec35a0e8_per_room_user_nick.py +0 -0
  150. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py +0 -0
  151. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/avatar.py +0 -0
  152. {slidge-0.2.5 → slidge-0.2.6}/slidge/db/meta.py +0 -0
  153. {slidge-0.2.5 → slidge-0.2.6}/slidge/group/__init__.py +0 -0
  154. {slidge-0.2.5 → slidge-0.2.6}/slidge/group/archive.py +0 -0
  155. {slidge-0.2.5 → slidge-0.2.6}/slidge/group/bookmarks.py +0 -0
  156. {slidge-0.2.5 → slidge-0.2.6}/slidge/main.py +0 -0
  157. {slidge-0.2.5 → slidge-0.2.6}/slidge/migration.py +0 -0
  158. {slidge-0.2.5 → slidge-0.2.6}/slidge/py.typed +0 -0
  159. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/delivery_receipt.py +0 -0
  160. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/link_preview/__init__.py +0 -0
  161. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/link_preview/link_preview.py +0 -0
  162. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/link_preview/stanza.py +0 -0
  163. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/roster.py +0 -0
  164. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0077/__init__.py +0 -0
  165. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0077/register.py +0 -0
  166. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0077/stanza.py +0 -0
  167. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0100/__init__.py +0 -0
  168. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0100/stanza.py +0 -0
  169. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0153/__init__.py +0 -0
  170. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0153/vcard_avatar.py +0 -0
  171. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0292/__init__.py +0 -0
  172. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0292/vcard4.py +0 -0
  173. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0492/__init__.py +0 -0
  174. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0492/notify.py +0 -0
  175. {slidge-0.2.5 → slidge-0.2.6}/slidge/slixfix/xep_0492/stanza.py +0 -0
  176. {slidge-0.2.5 → slidge-0.2.6}/slidge/util/__init__.py +0 -0
  177. {slidge-0.2.5 → slidge-0.2.6}/slidge/util/archive_msg.py +0 -0
  178. {slidge-0.2.5 → slidge-0.2.6}/slidge/util/conf.py +0 -0
  179. {slidge-0.2.5 → slidge-0.2.6}/slidge/util/test.py +0 -0
  180. {slidge-0.2.5 → slidge-0.2.6}/slidge/util/types.py +0 -0
  181. {slidge-0.2.5 → slidge-0.2.6}/slidge.egg-info/dependency_links.txt +0 -0
  182. {slidge-0.2.5 → slidge-0.2.6}/slidge.egg-info/entry_points.txt +0 -0
  183. {slidge-0.2.5 → slidge-0.2.6}/slidge.egg-info/top_level.txt +0 -0
  184. {slidge-0.2.5 → slidge-0.2.6}/superduper/__init__.py +0 -0
  185. {slidge-0.2.5 → slidge-0.2.6}/superduper/contact.py +0 -0
  186. {slidge-0.2.5 → slidge-0.2.6}/superduper/gateway.py +0 -0
  187. {slidge-0.2.5 → slidge-0.2.6}/superduper/group.py +0 -0
  188. {slidge-0.2.5 → slidge-0.2.6}/superduper/legacy_client.py +0 -0
  189. {slidge-0.2.5 → slidge-0.2.6}/superduper/session.py +0 -0
  190. {slidge-0.2.5 → slidge-0.2.6}/superduper/util.py +0 -0
  191. {slidge-0.2.5 → slidge-0.2.6}/tests/conftest.py +0 -0
  192. {slidge-0.2.5 → slidge-0.2.6}/tests/test_adhoc/test_access.py +0 -0
  193. {slidge-0.2.5 → slidge-0.2.6}/tests/test_adhoc/test_confirmation.py +0 -0
  194. {slidge-0.2.5 → slidge-0.2.6}/tests/test_adhoc/test_form.py +0 -0
  195. {slidge-0.2.5 → slidge-0.2.6}/tests/test_adhoc/test_reported.py +0 -0
  196. {slidge-0.2.5 → slidge-0.2.6}/tests/test_attachment.py +0 -0
  197. {slidge-0.2.5 → slidge-0.2.6}/tests/test_backfill.py +0 -0
  198. {slidge-0.2.5 → slidge-0.2.6}/tests/test_chat_commands.py +0 -0
  199. {slidge-0.2.5 → slidge-0.2.6}/tests/test_config.py +0 -0
  200. {slidge-0.2.5 → slidge-0.2.6}/tests/test_db/test_store.py +0 -0
  201. {slidge-0.2.5 → slidge-0.2.6}/tests/test_db/test_user.py +0 -0
  202. {slidge-0.2.5 → slidge-0.2.6}/tests/test_feature_restriction.py +0 -0
  203. {slidge-0.2.5 → slidge-0.2.6}/tests/test_mds.py +0 -0
  204. {slidge-0.2.5 → slidge-0.2.6}/tests/test_muc.py +0 -0
  205. {slidge-0.2.5 → slidge-0.2.6}/tests/test_name_in_constructor.py +0 -0
  206. {slidge-0.2.5 → slidge-0.2.6}/tests/test_resourceprep.py +0 -0
  207. {slidge-0.2.5 → slidge-0.2.6}/tests/test_session.py +0 -0
  208. {slidge-0.2.5 → slidge-0.2.6}/tests/test_session_2.py +0 -0
  209. {slidge-0.2.5 → slidge-0.2.6}/tests/test_set_name_before_fill.py +0 -0
  210. {slidge-0.2.5 → slidge-0.2.6}/tests/test_stanza_link_preview.py +0 -0
  211. {slidge-0.2.5 → slidge-0.2.6}/tests/test_vcard.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: slidge
3
- Version: 0.2.5
3
+ Version: 0.2.6
4
4
  Summary: XMPP bridging framework
5
5
  Author-email: Nicolas Cedilnik <nicoco@nicoco.fr>
6
6
  License: GNU AFFERO GENERAL PUBLIC LICENSE
@@ -676,16 +676,15 @@ Classifier: Topic :: Internet :: XMPP
676
676
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
677
677
  Requires-Python: >=3.11
678
678
  Description-Content-Type: text/markdown
679
- Requires-Dist: aiohttp[speedups]>=3.11.11
680
- Requires-Dist: alembic>=1.14.0
681
- Requires-Dist: configargparse>=1.7
679
+ Requires-Dist: aiohttp[speedups]<4,>=3.11.11
680
+ Requires-Dist: alembic<2,>=1.14.0
681
+ Requires-Dist: configargparse<2,>=1.7
682
682
  Requires-Dist: defusedxml>=0.7.1
683
- Requires-Dist: pickle-secure>=0.99.9
684
- Requires-Dist: pillow>=11.0.0
685
- Requires-Dist: python-magic>=0.4.27
686
- Requires-Dist: qrcode>=8.0
687
- Requires-Dist: slixmpp>=1.8.6
688
- Requires-Dist: sqlalchemy>=2.0.36
683
+ Requires-Dist: pillow<12,>=11.0.0
684
+ Requires-Dist: python-magic<0.5,>=0.4.27
685
+ Requires-Dist: qrcode<9,>=8.0
686
+ Requires-Dist: slixmpp<2,>=1.8.6
687
+ Requires-Dist: sqlalchemy<3,>=2
689
688
  Requires-Dist: thumbhash>=0.1.2
690
689
 
691
690
  ![Slidge logo](https://codeberg.org/slidge/slidge/raw/branch/main/dev/assets/slidge-color-small.png)
@@ -22,6 +22,7 @@ const Configuration = {
22
22
  'test',
23
23
  'compat', // workaround to play nice with non-compliant clients or servers; ideally reverted once fixed upstream
24
24
  'cfix', // fixes an unreleased commit, should not appear in changelog
25
+ 'imprv', // improvement of an existing feature
25
26
  ]
26
27
  ],
27
28
  },
@@ -3,16 +3,15 @@ name = "slidge"
3
3
  description = "XMPP bridging framework"
4
4
  requires-python = ">= 3.11"
5
5
  dependencies = [
6
- "aiohttp[speedups]>=3.11.11",
7
- "alembic>=1.14.0",
8
- "configargparse>=1.7",
6
+ "aiohttp[speedups]>=3.11.11,<4",
7
+ "alembic>=1.14.0,<2",
8
+ "configargparse>=1.7,<2",
9
9
  "defusedxml>=0.7.1",
10
- "pickle-secure>=0.99.9",
11
- "pillow>=11.0.0",
12
- "python-magic>=0.4.27",
13
- "qrcode>=8.0",
14
- "slixmpp>=1.8.6",
15
- "sqlalchemy>=2.0.36",
10
+ "pillow>=11.0.0,<12",
11
+ "python-magic>=0.4.27,<0.5",
12
+ "qrcode>=8.0,<9",
13
+ "slixmpp>=1.8.6,<2",
14
+ "sqlalchemy>=2,<3",
16
15
  "thumbhash>=0.1.2",
17
16
  ]
18
17
  authors = [
@@ -24,7 +23,7 @@ classifiers = [
24
23
  "Topic :: Software Development :: Libraries :: Python Modules",
25
24
  ]
26
25
  keywords = ["xmpp", "gateway", "bridge", "instant messaging"]
27
- version = "v0.2.5"
26
+ version = "v0.2.6"
28
27
  readme = "README.md"
29
28
 
30
29
  [build-system]
@@ -149,20 +148,21 @@ conventional_commits = true
149
148
  filter_unconventional = false
150
149
  commit_parsers = [
151
150
  { message = "^feat", group = "<!-- 0 -->🚀 Features" },
152
- { message = "^fix", group = "<!-- 1 -->🐛 Bug Fixes" },
153
- { message = "^compat", group = "<!-- 2 -->💑 Compatibility" },
154
- { message = "^refactor", group = "<!-- 3 -->🚜 Refactor" },
155
- { message = "^doc", group = "<!-- 4 -->📚 Documentation" },
156
- { message = "^perf", group = "<!-- 5 -->⚡ Performance" },
157
- { message = "^style", group = "<!-- 6 -->🎨 Styling" },
158
- { message = "^test", group = "<!-- 7 -->🧪 Testing" },
151
+ { message = "^imprv", group = "<!-- 1 -->✨ Improvements" },
152
+ { message = "^fix", group = "<!-- 2 -->🐛 Bug Fixes" },
153
+ { message = "^compat", group = "<!-- 3 -->💑 Compatibility" },
154
+ { message = "^refactor", group = "<!-- 4 -->🚜 Refactor" },
155
+ { message = "^doc", group = "<!-- 5 -->📚 Documentation" },
156
+ { message = "^perf", group = "<!-- 6 -->⚡ Performance" },
157
+ { message = "^style", group = "<!-- 7 -->🎨 Styling" },
158
+ { message = "^test", group = "<!-- 8 -->🧪 Testing" },
159
159
  { message = "^chore\\(release\\): prepare for", skip = true },
160
160
  { message = "^chore\\(deps.*\\)", skip = true },
161
161
  { message = "^chore\\(pr\\)", skip = true },
162
162
  { message = "^chore\\(pull\\)", skip = true },
163
163
  { message = "^cfix", skip = true },
164
- { message = "^chore|^ci", group = "<!-- 8 -->⚙️ Miscellaneous Tasks" },
165
- { body = ".*security", group = "<!-- 9 -->🛡️ Security" },
166
- { message = "^revert", group = "<!-- 10 -->◀️ Revert" },
167
- { message = ".*", group = "<!-- 11 -->💼 Other" },
164
+ { message = "^chore|^ci", group = "<!-- 9 -->⚙️ Miscellaneous Tasks" },
165
+ { body = ".*security", group = "<!-- 10 -->🛡️ Security" },
166
+ { message = "^revert", group = "<!-- 11 -->◀️ Revert" },
167
+ { message = ".*", group = "<!-- 12 -->💼 Other" },
168
168
  ]
@@ -2,4 +2,4 @@ from slidge.util.util import get_version # noqa: F401
2
2
 
3
3
  # this is modified before publish, but if someone cloned from the repo,
4
4
  # it can help
5
- __version__ = "v0.2.5"
5
+ __version__ = "v0.2.6"
@@ -240,6 +240,14 @@ class AdhocProvider:
240
240
  :param iq: the disco query IQ
241
241
  :return: commands accessible to the given JID will be listed
242
242
  """
243
+ if not self.xmpp.jid_validator.match(str(jid)) and jid not in config.ADMINS:
244
+ raise XMPPError(
245
+ "forbidden",
246
+ "You are not authorized to execute adhoc commands on this gateway. "
247
+ "If this is unexpected, ask your administrator to verify that "
248
+ "'user-jid-validator' is correctly set in slidge's configuration.",
249
+ )
250
+
243
251
  all_items = self.xmpp.plugin["xep_0030"].static.get_items(jid, node, None, None)
244
252
  log.debug("Static items: %r", all_items)
245
253
  if not all_items:
@@ -172,6 +172,9 @@ class Login(Command):
172
172
 
173
173
  async def run(self, session: Optional[AnyBaseSession], _ifrom, *_):
174
174
  assert session is not None
175
+ if session.is_logging_in:
176
+ raise XMPPError("bad-request", "You are already logging in.")
177
+ session.is_logging_in = True
175
178
  try:
176
179
  msg = await session.login()
177
180
  except Exception as e:
@@ -179,6 +182,8 @@ class Login(Command):
179
182
  raise XMPPError(
180
183
  "internal-server-error", etype="wait", text=f"Could not login: {e}"
181
184
  )
185
+ finally:
186
+ session.is_logging_in = False
182
187
  session.logged = True
183
188
  session.send_gateway_status(msg or "Re-connected", show="chat")
184
189
  session.send_gateway_message(msg or "Re-connected")
@@ -448,7 +448,7 @@ class LegacyContact(
448
448
  log.debug("Roster push request by plugin ignored (--no-roster-push)")
449
449
  return
450
450
  try:
451
- await self._set_roster(
451
+ await self.xmpp["xep_0356"].set_roster(
452
452
  jid=self.user_jid, roster_items=self.get_roster_item()
453
453
  )
454
454
  except PermissionError:
@@ -490,12 +490,6 @@ class LegacyContact(
490
490
  nick,
491
491
  )
492
492
 
493
- async def _set_roster(self, **kw):
494
- try:
495
- await self.xmpp["xep_0356"].set_roster(**kw)
496
- except PermissionError:
497
- await self.xmpp["xep_0356_old"].set_roster(**kw)
498
-
499
493
  def send_friend_request(self, text: Optional[str] = None):
500
494
  presence = self._make_presence(ptype="subscribe", pstatus=text, bare=True)
501
495
  self._send(presence, nick=True)
@@ -68,7 +68,6 @@ USER_JID_VALIDATOR__DYNAMIC_DEFAULT = True
68
68
  ADMINS: tuple[JIDType, ...] = ()
69
69
  ADMINS__DOC = "JIDs of the gateway admins"
70
70
 
71
-
72
71
  UPLOAD_SERVICE: Optional[str] = None
73
72
  UPLOAD_SERVICE__DOC = (
74
73
  "JID of an HTTP upload service the gateway can use. "
@@ -76,9 +75,6 @@ UPLOAD_SERVICE__DOC = (
76
75
  "discovery."
77
76
  )
78
77
 
79
- SECRET_KEY: Optional[str] = None
80
- SECRET_KEY__DOC = "Encryption for disk storage. Deprecated."
81
-
82
78
  NO_ROSTER_PUSH = False
83
79
  NO_ROSTER_PUSH__DOC = "Do not fill users' rosters with legacy contacts automatically"
84
80
 
@@ -515,6 +515,7 @@ class BaseGateway(
515
515
  @timeit
516
516
  async def login_wrap(self, session: "BaseSession"):
517
517
  session.send_gateway_status("Logging in…", show="dnd")
518
+ session.is_logging_in = True
518
519
  try:
519
520
  status = await session.login()
520
521
  except Exception as e:
@@ -808,7 +809,9 @@ class BaseGateway(
808
809
 
809
810
  async def unregister_user(self, user: GatewayUser):
810
811
  self.send_presence(
811
- pshow="busy", pstatus="You are not registered to this gateway anymore."
812
+ pshow="dnd",
813
+ pstatus="You unregistered from this gateway.",
814
+ pto=user.jid,
812
815
  )
813
816
  await self.xmpp.plugin["xep_0077"].api["user_remove"](None, None, user.jid)
814
817
  await self.xmpp.session_cls.kill_by_jid(user.jid)
@@ -913,7 +916,6 @@ SLIXMPP_PLUGINS = [
913
916
  "xep_0333", # Chat markers
914
917
  "xep_0334", # Message Processing Hints
915
918
  "xep_0356", # Privileged Entity
916
- "xep_0356_old", # Privileged Entity (old namespace)
917
919
  "xep_0363", # HTTP file upload
918
920
  "xep_0385", # Stateless in-line media sharing
919
921
  "xep_0402", # PEP Native Bookmarks
@@ -177,15 +177,12 @@ class CarbonMessageMixin(ContentMessageMixin, MarkerMixin):
177
177
  try:
178
178
  self.xmpp["xep_0356"].send_privileged_message(msg)
179
179
  except PermissionError:
180
- try:
181
- self.xmpp["xep_0356_old"].send_privileged_message(msg)
182
- except PermissionError:
183
- warnings.warn(
184
- "Slidge does not have privileges to send message on behalf of"
185
- " user.Refer to"
186
- " https://slidge.im/docs/slidge/main/admin/privilege.html"
187
- " for more info."
188
- )
180
+ warnings.warn(
181
+ "Slidge does not have privileges to send message on behalf of"
182
+ " user.Refer to"
183
+ " https://slidge.im/docs/slidge/main/admin/privilege.html"
184
+ " for more info."
185
+ )
189
186
 
190
187
 
191
188
  class InviteMixin(MessageMaker):
@@ -33,7 +33,7 @@ from ..util.types import (
33
33
  ResourceDict,
34
34
  Sticker,
35
35
  )
36
- from ..util.util import deprecated
36
+ from ..util.util import deprecated, noop_coro
37
37
 
38
38
  if TYPE_CHECKING:
39
39
  from ..group.participant import LegacyParticipant
@@ -98,6 +98,7 @@ class BaseSession(
98
98
  self.ignore_messages = set[str]()
99
99
 
100
100
  self.contacts: LegacyRoster = LegacyRoster.get_self_or_unique_subclass()(self)
101
+ self.is_logging_in = False
101
102
  self._logged = False
102
103
  self.__reset_ready()
103
104
 
@@ -527,11 +528,13 @@ class BaseSession(
527
528
 
528
529
  @logged.setter
529
530
  def logged(self, v: bool):
531
+ self.is_logging_in = False
530
532
  self._logged = v
531
533
  if self.ready.done():
532
534
  if v:
533
535
  return
534
536
  self.__reset_ready()
537
+ self.shutdown(logout=False)
535
538
  else:
536
539
  if v:
537
540
  self.ready.set_result(True)
@@ -539,12 +542,15 @@ class BaseSession(
539
542
  def __repr__(self):
540
543
  return f"<Session of {self.user_jid}>"
541
544
 
542
- def shutdown(self) -> asyncio.Task:
545
+ def shutdown(self, logout=True) -> asyncio.Task:
543
546
  for c in self.contacts:
544
547
  c.offline()
545
548
  for m in self.bookmarks:
546
549
  m.shutdown()
547
- return self.xmpp.loop.create_task(self.logout())
550
+ if logout:
551
+ return self.xmpp.loop.create_task(self.logout())
552
+ else:
553
+ return self.xmpp.loop.create_task(noop_coro())
548
554
 
549
555
  @staticmethod
550
556
  def legacy_to_xmpp_msg_id(legacy_msg_id: LegacyMessageType) -> str:
@@ -657,6 +663,8 @@ class BaseSession(
657
663
  return
658
664
  for c in session.contacts:
659
665
  c.unsubscribe()
666
+ for m in session.bookmarks:
667
+ m.shutdown()
660
668
  user = cls.xmpp.store.users.get(jid)
661
669
  if user is None:
662
670
  log.warning("User not found during unregistration")
@@ -0,0 +1,33 @@
1
+ """Add Participant.nickname_no_illegal
2
+
3
+ Revision ID: 04cf35e3cf85
4
+ Revises: 15b0bd83407a
5
+ Create Date: 2025-02-22 06:57:45.491326
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 = "04cf35e3cf85"
16
+ down_revision: Union[str, None] = "15b0bd83407a"
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
+ # ### commands auto generated by Alembic - please adjust! ###
23
+ with op.batch_alter_table("participant", schema=None) as batch_op:
24
+ batch_op.add_column(
25
+ sa.Column("nickname_no_illegal", sa.String(), nullable=True)
26
+ )
27
+
28
+ # ### end Alembic commands ###
29
+
30
+
31
+ def downgrade() -> None:
32
+ with op.batch_alter_table("participant", schema=None) as batch_op:
33
+ batch_op.drop_column("nickname_no_illegal")
@@ -8,8 +8,6 @@ Create Date: 2024-04-17 20:57:01.357041
8
8
 
9
9
  """
10
10
 
11
- import logging
12
- from datetime import datetime
13
11
  from typing import Sequence, Union
14
12
 
15
13
  import sqlalchemy as sa
@@ -44,58 +42,9 @@ def upgrade() -> None:
44
42
  sa.UniqueConstraint("jid"),
45
43
  )
46
44
  # ### end Alembic commands ###
47
- try:
48
- migrate_from_shelf(accounts)
49
- except Exception:
50
- downgrade()
51
- raise
52
45
 
53
46
 
54
47
  def downgrade() -> None:
55
48
  # ### commands auto generated by Alembic - please adjust! ###
56
49
  op.drop_table("user_account")
57
50
  # ### end Alembic commands ###
58
-
59
-
60
- def migrate_from_shelf(accounts: sa.Table) -> None:
61
- from slidge import global_config
62
-
63
- home = getattr(global_config, "HOME_DIR", None)
64
- if home is None:
65
- return
66
-
67
- db_file = home / "slidge.db"
68
- if not db_file.exists():
69
- return
70
-
71
- try:
72
- from slidge.db.alembic.old_user_store import user_store
73
- except ImportError:
74
- return
75
-
76
- user_store.set_file(db_file, global_config.SECRET_KEY)
77
-
78
- try:
79
- users = list(user_store.get_all())
80
- except AttributeError:
81
- return
82
- logging.info("Migrating %s users from the deprecated user_store shelf", len(users))
83
- op.bulk_insert(
84
- accounts,
85
- [
86
- {
87
- "jid": user.jid,
88
- "registration_date": (
89
- user.registration_date
90
- if user.registration_date is not None
91
- else datetime.now()
92
- ),
93
- "legacy_module_data": user.registration_form,
94
- "preferences": {},
95
- }
96
- for user in users
97
- ],
98
- )
99
-
100
- user_store.close()
101
- db_file.unlink()
@@ -388,6 +388,7 @@ class Participant(Base):
388
388
 
389
389
  resource: Mapped[Optional[str]] = mapped_column(default=None)
390
390
  nickname: Mapped[str] = mapped_column(nullable=True, default=None)
391
+ nickname_no_illegal: Mapped[str] = mapped_column(nullable=True, default=None)
391
392
 
392
393
  hats: Mapped[list["Hat"]] = relationship(
393
394
  secondary=participant_hats, back_populates="participants"
@@ -698,6 +698,8 @@ class MultiStore(EngineMixin):
698
698
  ).scalar()
699
699
  if multi is None:
700
700
  return []
701
+ if multi.legacy_ids_multi is None:
702
+ return []
701
703
  return [m.xmpp_id for m in multi.legacy_ids_multi.xmpp_ids]
702
704
 
703
705
  def set_xmpp_ids(
@@ -1072,6 +1074,7 @@ class ParticipantStore(EngineMixin):
1072
1074
  .where(Participant.id == participant.pk)
1073
1075
  .values(
1074
1076
  resource=participant.jid.resource,
1077
+ nickname_no_illegal=participant._nickname_no_illegal,
1075
1078
  affiliation=participant.affiliation,
1076
1079
  role=participant.role,
1077
1080
  presence_sent=participant._presence_sent, # type:ignore
@@ -71,6 +71,7 @@ class LegacyParticipant(
71
71
  role: MucRole = "participant",
72
72
  affiliation: MucAffiliation = "member",
73
73
  resource: str | None = None,
74
+ nickname_no_illegal: str | None = None,
74
75
  ):
75
76
  self.session = session = muc.session
76
77
  self.xmpp = session.xmpp
@@ -87,7 +88,8 @@ class LegacyParticipant(
87
88
  if resource is None:
88
89
  self.__update_jid(nickname)
89
90
  else:
90
- self._nickname_no_illegal = resource
91
+ assert nickname_no_illegal is not None
92
+ self._nickname_no_illegal = nickname_no_illegal
91
93
  self.jid = JID(self.muc.jid)
92
94
  self.jid.resource = resource
93
95
 
@@ -518,6 +520,7 @@ class LegacyParticipant(
518
520
  role=stored.role,
519
521
  affiliation=stored.affiliation,
520
522
  resource=stored.resource,
523
+ nickname_no_illegal=stored.nickname_no_illegal,
521
524
  )
522
525
  part.pk = stored.id
523
526
  if contact is not None:
@@ -423,7 +423,7 @@ class LegacyMUC(
423
423
 
424
424
  if subject_setter == self._subject_setter:
425
425
  return
426
- assert isinstance(subject_setter, str)
426
+ assert isinstance(subject_setter, str | None)
427
427
  self._subject_setter = subject_setter
428
428
  if self._updating_info:
429
429
  return
@@ -20,7 +20,6 @@ from . import (
20
20
  xep_0100,
21
21
  xep_0153,
22
22
  xep_0292,
23
- xep_0356_old,
24
23
  xep_0492,
25
24
  )
26
25
 
@@ -148,7 +147,6 @@ slixmpp.plugins.PLUGINS.extend(
148
147
  [
149
148
  "link_preview",
150
149
  "xep_0292_provider",
151
- "xep_0356_old",
152
150
  "xep_0492",
153
151
  ]
154
152
  )
@@ -93,10 +93,7 @@ class XEP_0100(BasePlugin):
93
93
  self.xmpp.send_presence(ptype="subscribe", pto=jid.bare)
94
94
 
95
95
  async def _set_roster(self, jid, items):
96
- try:
97
- await self.xmpp["xep_0356"].set_roster(jid=jid.bare, roster_items=items)
98
- except PermissionError:
99
- await self.xmpp["xep_0356_old"].set_roster(jid=jid.bare, roster_items=items)
96
+ await self.xmpp["xep_0356"].set_roster(jid=jid.bare, roster_items=items)
100
97
 
101
98
  def on_presence_unsubscribe(self, p: Presence):
102
99
  if p.get_to() == self.xmpp.boundjid.bare:
@@ -321,7 +321,7 @@ def timeit(func):
321
321
  async def wrapped(self, *args, **kwargs):
322
322
  start = time()
323
323
  r = await func(self, *args, **kwargs)
324
- self.log.info("%s took %s ms", func.__name__, round((time() - start) * 1000))
324
+ self.log.debug("%s took %s ms", func.__name__, round((time() - start) * 1000))
325
325
  return r
326
326
 
327
327
  return wrapped
@@ -336,3 +336,7 @@ def strip_leading_emoji(text: str) -> str:
336
336
  if len(words) > 1 and emoji.purely_emoji(words[0]):
337
337
  return " ".join(words[1:])
338
338
  return text
339
+
340
+
341
+ async def noop_coro():
342
+ pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: slidge
3
- Version: 0.2.5
3
+ Version: 0.2.6
4
4
  Summary: XMPP bridging framework
5
5
  Author-email: Nicolas Cedilnik <nicoco@nicoco.fr>
6
6
  License: GNU AFFERO GENERAL PUBLIC LICENSE
@@ -676,16 +676,15 @@ Classifier: Topic :: Internet :: XMPP
676
676
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
677
677
  Requires-Python: >=3.11
678
678
  Description-Content-Type: text/markdown
679
- Requires-Dist: aiohttp[speedups]>=3.11.11
680
- Requires-Dist: alembic>=1.14.0
681
- Requires-Dist: configargparse>=1.7
679
+ Requires-Dist: aiohttp[speedups]<4,>=3.11.11
680
+ Requires-Dist: alembic<2,>=1.14.0
681
+ Requires-Dist: configargparse<2,>=1.7
682
682
  Requires-Dist: defusedxml>=0.7.1
683
- Requires-Dist: pickle-secure>=0.99.9
684
- Requires-Dist: pillow>=11.0.0
685
- Requires-Dist: python-magic>=0.4.27
686
- Requires-Dist: qrcode>=8.0
687
- Requires-Dist: slixmpp>=1.8.6
688
- Requires-Dist: sqlalchemy>=2.0.36
683
+ Requires-Dist: pillow<12,>=11.0.0
684
+ Requires-Dist: python-magic<0.5,>=0.4.27
685
+ Requires-Dist: qrcode<9,>=8.0
686
+ Requires-Dist: slixmpp<2,>=1.8.6
687
+ Requires-Dist: sqlalchemy<3,>=2
689
688
  Requires-Dist: thumbhash>=0.1.2
690
689
 
691
690
  ![Slidge logo](https://codeberg.org/slidge/slidge/raw/branch/main/dev/assets/slidge-color-small.png)
@@ -121,8 +121,8 @@ slidge/db/models.py
121
121
  slidge/db/store.py
122
122
  slidge/db/alembic/__init__.py
123
123
  slidge/db/alembic/env.py
124
- slidge/db/alembic/old_user_store.py
125
124
  slidge/db/alembic/script.py.mako
125
+ slidge/db/alembic/versions/04cf35e3cf85_add_participant_nickname_no_illegal.py
126
126
  slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py
127
127
  slidge/db/alembic/versions/15b0bd83407a_remove_bogus_unique_constraints_on_room_.py
128
128
  slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py
@@ -161,16 +161,12 @@ slidge/slixfix/xep_0153/__init__.py
161
161
  slidge/slixfix/xep_0153/vcard_avatar.py
162
162
  slidge/slixfix/xep_0292/__init__.py
163
163
  slidge/slixfix/xep_0292/vcard4.py
164
- slidge/slixfix/xep_0356_old/__init__.py
165
- slidge/slixfix/xep_0356_old/privilege.py
166
- slidge/slixfix/xep_0356_old/stanza.py
167
164
  slidge/slixfix/xep_0492/__init__.py
168
165
  slidge/slixfix/xep_0492/notify.py
169
166
  slidge/slixfix/xep_0492/stanza.py
170
167
  slidge/util/__init__.py
171
168
  slidge/util/archive_msg.py
172
169
  slidge/util/conf.py
173
- slidge/util/db.py
174
170
  slidge/util/test.py
175
171
  slidge/util/types.py
176
172
  slidge/util/util.py
@@ -0,0 +1,10 @@
1
+ aiohttp[speedups]<4,>=3.11.11
2
+ alembic<2,>=1.14.0
3
+ configargparse<2,>=1.7
4
+ defusedxml>=0.7.1
5
+ pillow<12,>=11.0.0
6
+ python-magic<0.5,>=0.4.27
7
+ qrcode<9,>=8.0
8
+ slixmpp<2,>=1.8.6
9
+ sqlalchemy<3,>=2
10
+ thumbhash>=0.1.2
@@ -408,6 +408,26 @@ class TestParticipantAvatar(BaseMUC, AvatarFixtureMixin):
408
408
  """
409
409
  )
410
410
  assert self.next_sent() is None
411
+ juliet = self.run_coro(self.get_muc(False).get_participant_by_contact(juliet))
412
+ juliet.send_text("prout")
413
+ self.send( # language=XML
414
+ f"""
415
+ <message xmlns="jabber:component:accept"
416
+ type="groupchat"
417
+ from="room@aim.shakespeare.lit/juliet-1934e"
418
+ to="romeo@montague.lit/gajim">
419
+ <body>prout</body>
420
+ <active xmlns="http://jabber.org/protocol/chatstates" />
421
+ <markable xmlns="urn:xmpp:chat-markers:0" />
422
+ <stanza-id xmlns="urn:xmpp:sid:0"
423
+ id="uuid4"
424
+ by="room@aim.shakespeare.lit" />
425
+ <occupant-id xmlns="urn:xmpp:occupant-id:0"
426
+ id="juliet@aim.shakespeare.lit/slidge" />
427
+ <nick xmlns="http://jabber.org/protocol/nick">juliet🎉</nick>
428
+ </message>
429
+ """
430
+ )
411
431
 
412
432
 
413
433
  @pytest.mark.usefixtures("avatar")