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

|
@@ -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
|
@@ -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")
|