slidge 0.2.5__tar.gz → 0.2.7__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 (211) hide show
  1. {slidge-0.2.5 → slidge-0.2.7}/PKG-INFO +9 -10
  2. {slidge-0.2.5 → slidge-0.2.7}/commitlint.config.js +1 -0
  3. {slidge-0.2.5 → slidge-0.2.7}/pyproject.toml +21 -21
  4. {slidge-0.2.5 → slidge-0.2.7}/slidge/__version__.py +1 -1
  5. {slidge-0.2.5 → slidge-0.2.7}/slidge/command/adhoc.py +14 -3
  6. {slidge-0.2.5 → slidge-0.2.7}/slidge/command/user.py +5 -0
  7. {slidge-0.2.5 → slidge-0.2.7}/slidge/contact/contact.py +1 -7
  8. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/config.py +0 -4
  9. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/gateway.py +4 -2
  10. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/message.py +6 -9
  11. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/session.py +11 -3
  12. slidge-0.2.7/slidge/db/alembic/versions/04cf35e3cf85_add_participant_nickname_no_illegal.py +33 -0
  13. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py +0 -51
  14. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/models.py +1 -0
  15. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/store.py +3 -0
  16. {slidge-0.2.5 → slidge-0.2.7}/slidge/group/participant.py +4 -1
  17. {slidge-0.2.5 → slidge-0.2.7}/slidge/group/room.py +115 -61
  18. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/__init__.py +0 -2
  19. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0100/gateway.py +1 -4
  20. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0492/stanza.py +7 -2
  21. {slidge-0.2.5 → slidge-0.2.7}/slidge/util/util.py +10 -6
  22. {slidge-0.2.5 → slidge-0.2.7}/slidge.egg-info/PKG-INFO +9 -10
  23. {slidge-0.2.5 → slidge-0.2.7}/slidge.egg-info/SOURCES.txt +1 -5
  24. slidge-0.2.7/slidge.egg-info/requires.txt +10 -0
  25. {slidge-0.2.5 → slidge-0.2.7}/tests/test_avatar.py +20 -0
  26. {slidge-0.2.5 → slidge-0.2.7}/tests/test_muc.py +76 -35
  27. {slidge-0.2.5 → slidge-0.2.7}/tests/test_shakespeare.py +49 -95
  28. {slidge-0.2.5 → slidge-0.2.7}/tests/test_util.py +0 -1
  29. {slidge-0.2.5 → slidge-0.2.7}/uv.lock +8 -53
  30. slidge-0.2.5/slidge/db/alembic/old_user_store.py +0 -183
  31. slidge-0.2.5/slidge/slixfix/xep_0356_old/__init__.py +0 -7
  32. slidge-0.2.5/slidge/slixfix/xep_0356_old/privilege.py +0 -167
  33. slidge-0.2.5/slidge/slixfix/xep_0356_old/stanza.py +0 -44
  34. slidge-0.2.5/slidge/util/db.py +0 -5
  35. slidge-0.2.5/slidge.egg-info/requires.txt +0 -11
  36. {slidge-0.2.5 → slidge-0.2.7}/.gitignore +0 -0
  37. {slidge-0.2.5 → slidge-0.2.7}/.pre-commit-config.yaml +0 -0
  38. {slidge-0.2.5 → slidge-0.2.7}/.woodpecker/container-cache.yml +0 -0
  39. {slidge-0.2.5 → slidge-0.2.7}/.woodpecker/container-ci.yaml +0 -0
  40. {slidge-0.2.5 → slidge-0.2.7}/.woodpecker/container.yml +0 -0
  41. {slidge-0.2.5 → slidge-0.2.7}/.woodpecker/docs.yaml +0 -0
  42. {slidge-0.2.5 → slidge-0.2.7}/.woodpecker/package.yaml +0 -0
  43. {slidge-0.2.5 → slidge-0.2.7}/.woodpecker/test.yaml +0 -0
  44. {slidge-0.2.5 → slidge-0.2.7}/Dockerfile +0 -0
  45. {slidge-0.2.5 → slidge-0.2.7}/LICENSE +0 -0
  46. {slidge-0.2.5 → slidge-0.2.7}/README.md +0 -0
  47. {slidge-0.2.5 → slidge-0.2.7}/dev/assets/5x5.png +0 -0
  48. {slidge-0.2.5 → slidge-0.2.7}/dev/assets/slidge-color-small.png +0 -0
  49. {slidge-0.2.5 → slidge-0.2.7}/dev/assets/slidge-color.png +0 -0
  50. {slidge-0.2.5 → slidge-0.2.7}/dev/assets/slidge-mono-black.png +0 -0
  51. {slidge-0.2.5 → slidge-0.2.7}/dev/assets/slidge-mono-white.png +0 -0
  52. {slidge-0.2.5 → slidge-0.2.7}/dev/assets/slidge.svg +0 -0
  53. {slidge-0.2.5 → slidge-0.2.7}/dev/confs/movim.env +0 -0
  54. {slidge-0.2.5 → slidge-0.2.7}/dev/confs/nginx.conf +0 -0
  55. {slidge-0.2.5 → slidge-0.2.7}/dev/confs/slidge-example.ini +0 -0
  56. {slidge-0.2.5 → slidge-0.2.7}/dev/prettify_tests.py +0 -0
  57. {slidge-0.2.5 → slidge-0.2.7}/doap.xml +0 -0
  58. {slidge-0.2.5 → slidge-0.2.7}/docker-compose.yml +0 -0
  59. {slidge-0.2.5 → slidge-0.2.7}/docs/Makefile +0 -0
  60. {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/attachments.rst +0 -0
  61. {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/component.rst +0 -0
  62. {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/config/index.rst +0 -0
  63. {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/daemon.rst +0 -0
  64. {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/examples/ejabberd.yaml +0 -0
  65. {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/examples/index.rst +0 -0
  66. {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/examples/prosody.cfg.lua +0 -0
  67. {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/index.rst +0 -0
  68. {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/install.rst +0 -0
  69. {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/note.rst +0 -0
  70. {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/privilege.rst +0 -0
  71. {slidge-0.2.5 → slidge-0.2.7}/docs/source/codeberg.svg +0 -0
  72. {slidge-0.2.5 → slidge-0.2.7}/docs/source/conf.py +0 -0
  73. {slidge-0.2.5 → slidge-0.2.7}/docs/source/dev/contributing.rst +0 -0
  74. {slidge-0.2.5 → slidge-0.2.7}/docs/source/dev/design.rst +0 -0
  75. {slidge-0.2.5 → slidge-0.2.7}/docs/source/dev/howto.rst +0 -0
  76. {slidge-0.2.5 → slidge-0.2.7}/docs/source/dev/index.rst +0 -0
  77. {slidge-0.2.5 → slidge-0.2.7}/docs/source/dev/tutorial.rst +0 -0
  78. {slidge-0.2.5 → slidge-0.2.7}/docs/source/glossary.rst +0 -0
  79. {slidge-0.2.5 → slidge-0.2.7}/docs/source/index.rst +0 -0
  80. {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/commands.rst +0 -0
  81. {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/contacts.rst +0 -0
  82. {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/foxyproxy.png +0 -0
  83. {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/gajim.png +0 -0
  84. {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/index.rst +0 -0
  85. {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/low_profile.rst +0 -0
  86. {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/movim1.png +0 -0
  87. {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/movim2.png +0 -0
  88. {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/note.rst +0 -0
  89. {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/register.rst +0 -0
  90. {slidge-0.2.5 → slidge-0.2.7}/setup.cfg +0 -0
  91. {slidge-0.2.5 → slidge-0.2.7}/slidge/__init__.py +0 -0
  92. {slidge-0.2.5 → slidge-0.2.7}/slidge/__main__.py +0 -0
  93. {slidge-0.2.5 → slidge-0.2.7}/slidge/command/__init__.py +0 -0
  94. {slidge-0.2.5 → slidge-0.2.7}/slidge/command/admin.py +0 -0
  95. {slidge-0.2.5 → slidge-0.2.7}/slidge/command/base.py +0 -0
  96. {slidge-0.2.5 → slidge-0.2.7}/slidge/command/categories.py +0 -0
  97. {slidge-0.2.5 → slidge-0.2.7}/slidge/command/chat_command.py +0 -0
  98. {slidge-0.2.5 → slidge-0.2.7}/slidge/command/register.py +0 -0
  99. {slidge-0.2.5 → slidge-0.2.7}/slidge/contact/__init__.py +0 -0
  100. {slidge-0.2.5 → slidge-0.2.7}/slidge/contact/roster.py +0 -0
  101. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/__init__.py +0 -0
  102. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/__init__.py +0 -0
  103. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/caps.py +0 -0
  104. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/disco.py +0 -0
  105. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/message/__init__.py +0 -0
  106. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/message/chat_state.py +0 -0
  107. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/message/marker.py +0 -0
  108. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/message/message.py +0 -0
  109. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/muc/__init__.py +0 -0
  110. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/muc/admin.py +0 -0
  111. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/muc/mam.py +0 -0
  112. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/muc/misc.py +0 -0
  113. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/muc/owner.py +0 -0
  114. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/muc/ping.py +0 -0
  115. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/presence.py +0 -0
  116. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/registration.py +0 -0
  117. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/search.py +0 -0
  118. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/session_dispatcher.py +0 -0
  119. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/util.py +0 -0
  120. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/vcard.py +0 -0
  121. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/__init__.py +0 -0
  122. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/attachment.py +0 -0
  123. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/avatar.py +0 -0
  124. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/base.py +0 -0
  125. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/db.py +0 -0
  126. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/disco.py +0 -0
  127. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/lock.py +0 -0
  128. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/message_maker.py +0 -0
  129. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/message_text.py +0 -0
  130. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/presence.py +0 -0
  131. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/recipient.py +0 -0
  132. {slidge-0.2.5 → slidge-0.2.7}/slidge/core/pubsub.py +0 -0
  133. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/__init__.py +0 -0
  134. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/__init__.py +0 -0
  135. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/env.py +0 -0
  136. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/script.py.mako +0 -0
  137. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py +0 -0
  138. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/15b0bd83407a_remove_bogus_unique_constraints_on_room_.py +0 -0
  139. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py +0 -0
  140. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py +0 -0
  141. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/2b1f45ab7379_store_room_subject_setter_by_nickname.py +0 -0
  142. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/3071e0fa69d4_add_contact_client_type.py +0 -0
  143. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/45c24cc73c91_add_bob.py +0 -0
  144. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/5bd48bfdffa2_lift_room_legacy_id_constraint.py +0 -0
  145. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/82a4af84b679_add_muc_history_filled.py +0 -0
  146. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/8b993243a536_add_vcard_content_to_contact_table.py +0 -0
  147. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py +0 -0
  148. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/abba1ae0edb3_store_avatar_legacy_id_in_the_contact_.py +0 -0
  149. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py +0 -0
  150. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/b64b1a793483_add_source_and_legacy_id_for_archived_.py +0 -0
  151. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/c4a8ec35a0e8_per_room_user_nick.py +0 -0
  152. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py +0 -0
  153. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/avatar.py +0 -0
  154. {slidge-0.2.5 → slidge-0.2.7}/slidge/db/meta.py +0 -0
  155. {slidge-0.2.5 → slidge-0.2.7}/slidge/group/__init__.py +0 -0
  156. {slidge-0.2.5 → slidge-0.2.7}/slidge/group/archive.py +0 -0
  157. {slidge-0.2.5 → slidge-0.2.7}/slidge/group/bookmarks.py +0 -0
  158. {slidge-0.2.5 → slidge-0.2.7}/slidge/main.py +0 -0
  159. {slidge-0.2.5 → slidge-0.2.7}/slidge/migration.py +0 -0
  160. {slidge-0.2.5 → slidge-0.2.7}/slidge/py.typed +0 -0
  161. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/delivery_receipt.py +0 -0
  162. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/link_preview/__init__.py +0 -0
  163. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/link_preview/link_preview.py +0 -0
  164. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/link_preview/stanza.py +0 -0
  165. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/roster.py +0 -0
  166. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0077/__init__.py +0 -0
  167. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0077/register.py +0 -0
  168. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0077/stanza.py +0 -0
  169. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0100/__init__.py +0 -0
  170. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0100/stanza.py +0 -0
  171. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0153/__init__.py +0 -0
  172. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0153/vcard_avatar.py +0 -0
  173. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0292/__init__.py +0 -0
  174. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0292/vcard4.py +0 -0
  175. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0492/__init__.py +0 -0
  176. {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0492/notify.py +0 -0
  177. {slidge-0.2.5 → slidge-0.2.7}/slidge/util/__init__.py +0 -0
  178. {slidge-0.2.5 → slidge-0.2.7}/slidge/util/archive_msg.py +0 -0
  179. {slidge-0.2.5 → slidge-0.2.7}/slidge/util/conf.py +0 -0
  180. {slidge-0.2.5 → slidge-0.2.7}/slidge/util/test.py +0 -0
  181. {slidge-0.2.5 → slidge-0.2.7}/slidge/util/types.py +0 -0
  182. {slidge-0.2.5 → slidge-0.2.7}/slidge.egg-info/dependency_links.txt +0 -0
  183. {slidge-0.2.5 → slidge-0.2.7}/slidge.egg-info/entry_points.txt +0 -0
  184. {slidge-0.2.5 → slidge-0.2.7}/slidge.egg-info/top_level.txt +0 -0
  185. {slidge-0.2.5 → slidge-0.2.7}/superduper/__init__.py +0 -0
  186. {slidge-0.2.5 → slidge-0.2.7}/superduper/contact.py +0 -0
  187. {slidge-0.2.5 → slidge-0.2.7}/superduper/gateway.py +0 -0
  188. {slidge-0.2.5 → slidge-0.2.7}/superduper/group.py +0 -0
  189. {slidge-0.2.5 → slidge-0.2.7}/superduper/legacy_client.py +0 -0
  190. {slidge-0.2.5 → slidge-0.2.7}/superduper/session.py +0 -0
  191. {slidge-0.2.5 → slidge-0.2.7}/superduper/util.py +0 -0
  192. {slidge-0.2.5 → slidge-0.2.7}/tests/conftest.py +0 -0
  193. {slidge-0.2.5 → slidge-0.2.7}/tests/test_adhoc/test_access.py +0 -0
  194. {slidge-0.2.5 → slidge-0.2.7}/tests/test_adhoc/test_confirmation.py +0 -0
  195. {slidge-0.2.5 → slidge-0.2.7}/tests/test_adhoc/test_form.py +0 -0
  196. {slidge-0.2.5 → slidge-0.2.7}/tests/test_adhoc/test_reported.py +0 -0
  197. {slidge-0.2.5 → slidge-0.2.7}/tests/test_attachment.py +0 -0
  198. {slidge-0.2.5 → slidge-0.2.7}/tests/test_backfill.py +0 -0
  199. {slidge-0.2.5 → slidge-0.2.7}/tests/test_chat_commands.py +0 -0
  200. {slidge-0.2.5 → slidge-0.2.7}/tests/test_config.py +0 -0
  201. {slidge-0.2.5 → slidge-0.2.7}/tests/test_db/test_store.py +0 -0
  202. {slidge-0.2.5 → slidge-0.2.7}/tests/test_db/test_user.py +0 -0
  203. {slidge-0.2.5 → slidge-0.2.7}/tests/test_feature_restriction.py +0 -0
  204. {slidge-0.2.5 → slidge-0.2.7}/tests/test_mds.py +0 -0
  205. {slidge-0.2.5 → slidge-0.2.7}/tests/test_name_in_constructor.py +0 -0
  206. {slidge-0.2.5 → slidge-0.2.7}/tests/test_resourceprep.py +0 -0
  207. {slidge-0.2.5 → slidge-0.2.7}/tests/test_session.py +0 -0
  208. {slidge-0.2.5 → slidge-0.2.7}/tests/test_session_2.py +0 -0
  209. {slidge-0.2.5 → slidge-0.2.7}/tests/test_set_name_before_fill.py +0 -0
  210. {slidge-0.2.5 → slidge-0.2.7}/tests/test_stanza_link_preview.py +0 -0
  211. {slidge-0.2.5 → slidge-0.2.7}/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.7
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.7"
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.7"
@@ -235,18 +235,29 @@ class AdhocProvider:
235
235
  """
236
236
  Get items for a disco query
237
237
 
238
- :param jid: who is requesting the disco
238
+ :param jid: the entity that should return its items
239
239
  :param node: which command node is requested
240
240
  :param iq: the disco query IQ
241
241
  :return: commands accessible to the given JID will be listed
242
242
  """
243
+ ifrom = iq.get_from()
244
+ ifrom_str = str(ifrom)
245
+ if (
246
+ not self.xmpp.jid_validator.match(ifrom_str)
247
+ and ifrom_str not in config.ADMINS
248
+ ):
249
+ raise XMPPError(
250
+ "forbidden",
251
+ "You are not authorized to execute adhoc commands on this gateway. "
252
+ "If this is unexpected, ask your administrator to verify that "
253
+ "'user-jid-validator' is correctly set in slidge's configuration.",
254
+ )
255
+
243
256
  all_items = self.xmpp.plugin["xep_0030"].static.get_items(jid, node, None, None)
244
257
  log.debug("Static items: %r", all_items)
245
258
  if not all_items:
246
259
  return DiscoItems()
247
260
 
248
- ifrom = iq.get_from()
249
-
250
261
  filtered_items = DiscoItems()
251
262
  filtered_items["node"] = self.xmpp.plugin["xep_0050"].stanza.Command.namespace
252
263
  for item in 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: