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.
- {slidge-0.2.5 → slidge-0.2.7}/PKG-INFO +9 -10
- {slidge-0.2.5 → slidge-0.2.7}/commitlint.config.js +1 -0
- {slidge-0.2.5 → slidge-0.2.7}/pyproject.toml +21 -21
- {slidge-0.2.5 → slidge-0.2.7}/slidge/__version__.py +1 -1
- {slidge-0.2.5 → slidge-0.2.7}/slidge/command/adhoc.py +14 -3
- {slidge-0.2.5 → slidge-0.2.7}/slidge/command/user.py +5 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/contact/contact.py +1 -7
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/config.py +0 -4
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/gateway.py +4 -2
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/message.py +6 -9
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/session.py +11 -3
- slidge-0.2.7/slidge/db/alembic/versions/04cf35e3cf85_add_participant_nickname_no_illegal.py +33 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py +0 -51
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/models.py +1 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/store.py +3 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/group/participant.py +4 -1
- {slidge-0.2.5 → slidge-0.2.7}/slidge/group/room.py +115 -61
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/__init__.py +0 -2
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0100/gateway.py +1 -4
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0492/stanza.py +7 -2
- {slidge-0.2.5 → slidge-0.2.7}/slidge/util/util.py +10 -6
- {slidge-0.2.5 → slidge-0.2.7}/slidge.egg-info/PKG-INFO +9 -10
- {slidge-0.2.5 → slidge-0.2.7}/slidge.egg-info/SOURCES.txt +1 -5
- slidge-0.2.7/slidge.egg-info/requires.txt +10 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_avatar.py +20 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_muc.py +76 -35
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_shakespeare.py +49 -95
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_util.py +0 -1
- {slidge-0.2.5 → slidge-0.2.7}/uv.lock +8 -53
- slidge-0.2.5/slidge/db/alembic/old_user_store.py +0 -183
- slidge-0.2.5/slidge/slixfix/xep_0356_old/__init__.py +0 -7
- slidge-0.2.5/slidge/slixfix/xep_0356_old/privilege.py +0 -167
- slidge-0.2.5/slidge/slixfix/xep_0356_old/stanza.py +0 -44
- slidge-0.2.5/slidge/util/db.py +0 -5
- slidge-0.2.5/slidge.egg-info/requires.txt +0 -11
- {slidge-0.2.5 → slidge-0.2.7}/.gitignore +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/.pre-commit-config.yaml +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/.woodpecker/container-cache.yml +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/.woodpecker/container-ci.yaml +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/.woodpecker/container.yml +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/.woodpecker/docs.yaml +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/.woodpecker/package.yaml +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/.woodpecker/test.yaml +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/Dockerfile +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/LICENSE +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/README.md +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/dev/assets/5x5.png +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/dev/assets/slidge-color-small.png +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/dev/assets/slidge-color.png +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/dev/assets/slidge-mono-black.png +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/dev/assets/slidge-mono-white.png +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/dev/assets/slidge.svg +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/dev/confs/movim.env +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/dev/confs/nginx.conf +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/dev/confs/slidge-example.ini +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/dev/prettify_tests.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/doap.xml +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docker-compose.yml +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/Makefile +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/attachments.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/component.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/config/index.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/daemon.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/examples/ejabberd.yaml +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/examples/index.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/examples/prosody.cfg.lua +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/index.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/install.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/note.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/admin/privilege.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/codeberg.svg +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/conf.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/dev/contributing.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/dev/design.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/dev/howto.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/dev/index.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/dev/tutorial.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/glossary.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/index.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/commands.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/contacts.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/foxyproxy.png +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/gajim.png +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/index.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/low_profile.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/movim1.png +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/movim2.png +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/note.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/docs/source/user/register.rst +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/setup.cfg +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/__main__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/command/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/command/admin.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/command/base.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/command/categories.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/command/chat_command.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/command/register.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/contact/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/contact/roster.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/caps.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/disco.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/message/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/message/chat_state.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/message/marker.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/message/message.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/muc/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/muc/admin.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/muc/mam.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/muc/misc.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/muc/owner.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/muc/ping.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/presence.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/registration.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/search.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/session_dispatcher.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/util.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/dispatcher/vcard.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/attachment.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/avatar.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/base.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/db.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/disco.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/lock.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/message_maker.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/message_text.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/presence.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/mixins/recipient.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/core/pubsub.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/env.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/script.py.mako +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/15b0bd83407a_remove_bogus_unique_constraints_on_room_.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/2b1f45ab7379_store_room_subject_setter_by_nickname.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/3071e0fa69d4_add_contact_client_type.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/45c24cc73c91_add_bob.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/5bd48bfdffa2_lift_room_legacy_id_constraint.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/82a4af84b679_add_muc_history_filled.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/8b993243a536_add_vcard_content_to_contact_table.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/abba1ae0edb3_store_avatar_legacy_id_in_the_contact_.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/b64b1a793483_add_source_and_legacy_id_for_archived_.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/c4a8ec35a0e8_per_room_user_nick.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/avatar.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/db/meta.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/group/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/group/archive.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/group/bookmarks.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/main.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/migration.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/py.typed +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/delivery_receipt.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/link_preview/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/link_preview/link_preview.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/link_preview/stanza.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/roster.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0077/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0077/register.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0077/stanza.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0100/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0100/stanza.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0153/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0153/vcard_avatar.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0292/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0292/vcard4.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0492/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/slixfix/xep_0492/notify.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/util/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/util/archive_msg.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/util/conf.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/util/test.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge/util/types.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge.egg-info/dependency_links.txt +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge.egg-info/entry_points.txt +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/slidge.egg-info/top_level.txt +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/superduper/__init__.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/superduper/contact.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/superduper/gateway.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/superduper/group.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/superduper/legacy_client.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/superduper/session.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/superduper/util.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/conftest.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_adhoc/test_access.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_adhoc/test_confirmation.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_adhoc/test_form.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_adhoc/test_reported.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_attachment.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_backfill.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_chat_commands.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_config.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_db/test_store.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_db/test_user.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_feature_restriction.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_mds.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_name_in_constructor.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_resourceprep.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_session.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_session_2.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_set_name_before_fill.py +0 -0
- {slidge-0.2.5 → slidge-0.2.7}/tests/test_stanza_link_preview.py +0 -0
- {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.
|
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]
|
680
|
-
Requires-Dist: alembic
|
681
|
-
Requires-Dist: configargparse
|
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:
|
684
|
-
Requires-Dist:
|
685
|
-
Requires-Dist:
|
686
|
-
Requires-Dist:
|
687
|
-
Requires-Dist:
|
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
|

|
@@ -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
|
-
"
|
11
|
-
"
|
12
|
-
"
|
13
|
-
"
|
14
|
-
"
|
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.
|
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 = "^
|
153
|
-
{ message = "^
|
154
|
-
{ message = "^
|
155
|
-
{ message = "^
|
156
|
-
{ message = "^
|
157
|
-
{ message = "^
|
158
|
-
{ message = "^
|
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 = "<!--
|
165
|
-
{ body = ".*security", group = "<!--
|
166
|
-
{ message = "^revert", group = "<!--
|
167
|
-
{ message = ".*", group = "<!--
|
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
|
]
|
@@ -235,18 +235,29 @@ class AdhocProvider:
|
|
235
235
|
"""
|
236
236
|
Get items for a disco query
|
237
237
|
|
238
|
-
:param jid:
|
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.
|
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="
|
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
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
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
|
-
|
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
|
-
|
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:
|