slidge 0.2.3.post1__tar.gz → 0.2.4__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {slidge-0.2.3.post1 → slidge-0.2.4}/.woodpecker/test.yaml +1 -1
- {slidge-0.2.3.post1 → slidge-0.2.4}/Dockerfile +1 -1
- {slidge-0.2.3.post1/slidge.egg-info → slidge-0.2.4}/PKG-INFO +2 -2
- {slidge-0.2.3.post1 → slidge-0.2.4}/README.md +1 -1
- {slidge-0.2.3.post1 → slidge-0.2.4}/doap.xml +16 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docker-compose.yml +1 -1
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/install.rst +1 -1
- {slidge-0.2.3.post1 → slidge-0.2.4}/pyproject.toml +1 -1
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/__version__.py +1 -1
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/message/message.py +4 -1
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/gateway.py +2 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/recipient.py +2 -2
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/group/room.py +21 -1
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/__init__.py +72 -5
- slidge-0.2.4/slidge/slixfix/xep_0492/__init__.py +8 -0
- slidge-0.2.4/slidge/slixfix/xep_0492/notify.py +16 -0
- slidge-0.2.4/slidge/slixfix/xep_0492/stanza.py +102 -0
- {slidge-0.2.3.post1 → slidge-0.2.4/slidge.egg-info}/PKG-INFO +2 -2
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge.egg-info/SOURCES.txt +3 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_feature_restriction.py +1 -1
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_muc.py +296 -4
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_shakespeare.py +2 -1
- {slidge-0.2.3.post1 → slidge-0.2.4}/.gitignore +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/.pre-commit-config.yaml +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/.woodpecker/container-cache.yml +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/.woodpecker/container-ci.yaml +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/.woodpecker/container.yml +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/.woodpecker/docs.yaml +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/.woodpecker/package.yaml +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/LICENSE +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/commitlint.config.js +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/dev/assets/5x5.png +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/dev/assets/slidge-color-small.png +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/dev/assets/slidge-color.png +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/dev/assets/slidge-mono-black.png +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/dev/assets/slidge-mono-white.png +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/dev/assets/slidge.svg +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/dev/confs/movim.env +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/dev/confs/nginx.conf +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/dev/confs/slidge-example.ini +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/dev/prettify_tests.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/Makefile +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/attachments.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/component.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/config/index.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/daemon.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/examples/ejabberd.yaml +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/examples/index.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/examples/prosody.cfg.lua +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/index.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/note.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/privilege.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/codeberg.svg +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/conf.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/dev/contributing.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/dev/design.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/dev/howto.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/dev/index.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/dev/tutorial.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/glossary.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/index.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/commands.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/contacts.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/foxyproxy.png +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/gajim.png +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/index.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/low_profile.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/movim1.png +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/movim2.png +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/note.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/register.rst +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/setup.cfg +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/__main__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/adhoc.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/admin.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/base.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/categories.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/chat_command.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/register.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/user.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/contact/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/contact/contact.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/contact/roster.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/config.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/caps.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/disco.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/message/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/message/chat_state.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/message/marker.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/muc/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/muc/admin.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/muc/mam.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/muc/misc.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/muc/owner.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/muc/ping.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/presence.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/registration.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/search.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/session_dispatcher.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/util.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/vcard.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/attachment.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/avatar.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/base.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/db.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/disco.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/lock.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/message.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/message_maker.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/message_text.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/presence.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/pubsub.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/session.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/env.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/old_user_store.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/script.py.mako +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/15b0bd83407a_remove_bogus_unique_constraints_on_room_.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/2b1f45ab7379_store_room_subject_setter_by_nickname.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/3071e0fa69d4_add_contact_client_type.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/45c24cc73c91_add_bob.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/5bd48bfdffa2_lift_room_legacy_id_constraint.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/82a4af84b679_add_muc_history_filled.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/8b993243a536_add_vcard_content_to_contact_table.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/abba1ae0edb3_store_avatar_legacy_id_in_the_contact_.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/b64b1a793483_add_source_and_legacy_id_for_archived_.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/c4a8ec35a0e8_per_room_user_nick.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/avatar.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/meta.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/models.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/store.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/group/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/group/archive.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/group/bookmarks.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/group/participant.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/main.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/migration.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/py.typed +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/delivery_receipt.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/link_preview/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/link_preview/link_preview.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/link_preview/stanza.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/roster.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0077/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0077/register.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0077/stanza.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0100/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0100/gateway.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0100/stanza.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0153/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0153/vcard_avatar.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0292/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0292/vcard4.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0356_old/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0356_old/privilege.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0356_old/stanza.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/archive_msg.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/conf.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/db.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/test.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/types.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/util.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge.egg-info/dependency_links.txt +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge.egg-info/entry_points.txt +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge.egg-info/requires.txt +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/slidge.egg-info/top_level.txt +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/__init__.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/contact.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/gateway.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/group.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/legacy_client.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/session.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/util.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/conftest.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_adhoc/test_access.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_adhoc/test_confirmation.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_adhoc/test_form.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_adhoc/test_reported.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_attachment.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_avatar.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_backfill.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_chat_commands.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_config.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_db/test_store.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_db/test_user.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_mds.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_name_in_constructor.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_resourceprep.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_session.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_session_2.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_set_name_before_fill.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_stanza_link_preview.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_util.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_vcard.py +0 -0
- {slidge-0.2.3.post1 → slidge-0.2.4}/uv.lock +0 -0
@@ -71,7 +71,7 @@ FROM base AS dev
|
|
71
71
|
|
72
72
|
USER root
|
73
73
|
|
74
|
-
COPY --from=
|
74
|
+
COPY --from=codeberg.org/slidge/prosody-slidge-dev:latest \
|
75
75
|
/etc/prosody/certs/localhost.crt \
|
76
76
|
/usr/local/share/ca-certificates/
|
77
77
|
RUN update-ca-certificates
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: slidge
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.4
|
4
4
|
Summary: XMPP bridging framework
|
5
5
|
Author-email: Nicolas Cedilnik <nicoco@nicoco.fr>
|
6
6
|
License: GNU AFFERO GENERAL PUBLIC LICENSE
|
@@ -693,7 +693,7 @@ Requires-Dist: thumbhash>=0.1.2
|
|
693
693
|
|
694
694
|
|
695
695
|
[](https://ci.codeberg.org/repos/14027)
|
696
|
-
[](https://slidge.im/coverage)
|
696
|
+
[](https://slidge.im/coverage/main)
|
697
697
|
|
698
698
|
[](https://pypi.org/project/slidge/)
|
699
699
|
[](https://packages.debian.org/unstable/python3-slidge)
|
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
|
6
6
|
[](https://ci.codeberg.org/repos/14027)
|
7
|
-
[](https://slidge.im/coverage)
|
7
|
+
[](https://slidge.im/coverage/main)
|
8
8
|
|
9
9
|
[](https://pypi.org/project/slidge/)
|
10
10
|
[](https://packages.debian.org/unstable/python3-slidge)
|
@@ -485,6 +485,14 @@
|
|
485
485
|
<xmpp:note>Legacy service to XMPP attachments have SFS metadata when possible. Not supported from XMPP to legacy service</xmpp:note>
|
486
486
|
</xmpp:SupportedXep>
|
487
487
|
</implements>
|
488
|
+
<implements>
|
489
|
+
<xmpp:SupportedXep>
|
490
|
+
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0469.html"/>
|
491
|
+
<xmpp:status>complete</xmpp:status>
|
492
|
+
<xmpp:version>0.1.0</xmpp:version>
|
493
|
+
<xmpp:note>Relies on being a privileged entity (XEP-0356), to edit bookmark entries.</xmpp:note>
|
494
|
+
</xmpp:SupportedXep>
|
495
|
+
</implements>
|
488
496
|
<implements>
|
489
497
|
<xmpp:SupportedXep>
|
490
498
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0486.html"/>
|
@@ -502,5 +510,13 @@
|
|
502
510
|
<xmpp:note>Slidge supports listening to MDS events and triggering "legacy MDS" events, if added to the PEP MDS node, which is done automatically if XEP-0356 IQ privileges are set. Slidge also support updating MDS node in reaction to "legacy MDS" events.</xmpp:note>
|
503
511
|
</xmpp:SupportedXep>
|
504
512
|
</implements>
|
513
|
+
<implements>
|
514
|
+
<xmpp:SupportedXep>
|
515
|
+
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0492.html"/>
|
516
|
+
<xmpp:status>partial</xmpp:status>
|
517
|
+
<xmpp:version>0.1.0</xmpp:version>
|
518
|
+
<xmpp:note>Per client-type setting is not supported.</xmpp:note>
|
519
|
+
</xmpp:SupportedXep>
|
520
|
+
</implements>
|
505
521
|
</Project>
|
506
522
|
</rdf:RDF>
|
@@ -16,7 +16,7 @@ services:
|
|
16
16
|
- prosody
|
17
17
|
|
18
18
|
prosody:
|
19
|
-
image:
|
19
|
+
image: codeberg.org/slidge/slidge-prosody-dev:latest
|
20
20
|
ports:
|
21
21
|
- "127.0.0.1:5281:5281" # XMPP port for clients to connect to
|
22
22
|
- "127.0.0.1:5222:5222" # prosody's http_file_share
|
@@ -5,7 +5,7 @@ Installation
|
|
5
5
|
Dockerhub
|
6
6
|
---------
|
7
7
|
|
8
|
-
Containers for arm64 and amd64 are available on `
|
8
|
+
Containers for arm64 and amd64 are available on `codeberg <https://codeberg.org/slidge/-/packages?q=&type=container>`_.
|
9
9
|
The slidge-whatsapp arm64 container is kindly provided by `raver <https://hub.docker.com/u/ravermeister>`_.
|
10
10
|
See :ref:`Containers` for more details.
|
11
11
|
|
@@ -296,7 +296,10 @@ class MessageContentMixin(DispatcherMixin):
|
|
296
296
|
# no need to carbon for groups, we just don't echo the stanza
|
297
297
|
entity.react(legacy_id, carbon=True) # type: ignore
|
298
298
|
await session.on_react(entity, legacy_id, [], thread=thread)
|
299
|
-
raise XMPPError(
|
299
|
+
raise XMPPError(
|
300
|
+
"policy-violation", # type:ignore
|
301
|
+
text=error_msg,
|
302
|
+
)
|
300
303
|
|
301
304
|
await session.on_react(entity, legacy_id, emojis, thread=thread)
|
302
305
|
if isinstance(entity, LegacyMUC):
|
@@ -913,7 +913,9 @@ SLIXMPP_PLUGINS = [
|
|
913
913
|
"xep_0444", # Message reactions
|
914
914
|
"xep_0447", # Stateless File Sharing
|
915
915
|
"xep_0461", # Message replies
|
916
|
+
"xep_0469", # Bookmark Pinning
|
916
917
|
"xep_0490", # Message Displayed Synchronization
|
918
|
+
"xep_0492", # Chat Notification Settings
|
917
919
|
]
|
918
920
|
|
919
921
|
LOG_STRIP_ELEMENTS = ["data", "binval"]
|
@@ -21,9 +21,9 @@ class ReactionRecipientMixin:
|
|
21
21
|
form["type"] = "result"
|
22
22
|
form.add_field("FORM_TYPE", "hidden", value="urn:xmpp:reactions:0:restrictions")
|
23
23
|
if self.REACTIONS_SINGLE_EMOJI:
|
24
|
-
form.add_field("max_reactions_per_user", value="1")
|
24
|
+
form.add_field("max_reactions_per_user", value="1", type="number")
|
25
25
|
if available:
|
26
|
-
form.add_field("allowlist", value=list(available))
|
26
|
+
form.add_field("allowlist", value=list(available), type="text-multi")
|
27
27
|
return form
|
28
28
|
|
29
29
|
async def available_emojis(
|
@@ -26,6 +26,7 @@ from ..core.mixins.disco import ChatterDiscoMixin
|
|
26
26
|
from ..core.mixins.lock import NamedLockMixin
|
27
27
|
from ..core.mixins.recipient import ReactionRecipientMixin, ThreadRecipientMixin
|
28
28
|
from ..db.models import Room
|
29
|
+
from ..slixfix.xep_0492.stanza import WhenLiteral
|
29
30
|
from ..util import ABCSubclassableOnceAtMost
|
30
31
|
from ..util.types import (
|
31
32
|
HoleBound,
|
@@ -994,7 +995,14 @@ class LegacyMUC(
|
|
994
995
|
p["muc"]["status_codes"] = {110, 333}
|
995
996
|
p.send()
|
996
997
|
|
997
|
-
async def add_to_bookmarks(
|
998
|
+
async def add_to_bookmarks(
|
999
|
+
self,
|
1000
|
+
auto_join=True,
|
1001
|
+
invite=False,
|
1002
|
+
preserve=True,
|
1003
|
+
pin: bool | None = None,
|
1004
|
+
notify: WhenLiteral | None = None,
|
1005
|
+
):
|
998
1006
|
"""
|
999
1007
|
Add the MUC to the user's XMPP bookmarks (:xep:`0402')
|
1000
1008
|
|
@@ -1012,6 +1020,11 @@ class LegacyMUC(
|
|
1012
1020
|
settings.
|
1013
1021
|
:param preserve: preserve auto-join and bookmarks extensions
|
1014
1022
|
set by the user outside slidge
|
1023
|
+
:param pin: Pin the group chat bookmark :xep:`0469`. Requires privileged entity.
|
1024
|
+
If set to ``None`` (default), the bookmark pinning status will be untouched.
|
1025
|
+
:param notify: Chat notification setting: :xep:`0492`. Requires privileged entity.
|
1026
|
+
If set to ``None`` (default), the setting will be untouched. Only the "global"
|
1027
|
+
notification setting is supported (ie, per client type is not possible).
|
1015
1028
|
"""
|
1016
1029
|
item = Item()
|
1017
1030
|
item["id"] = self.jid
|
@@ -1046,6 +1059,13 @@ class LegacyMUC(
|
|
1046
1059
|
item["conference"]["autojoin"] = auto_join
|
1047
1060
|
|
1048
1061
|
item["conference"]["nick"] = self.user_nick
|
1062
|
+
|
1063
|
+
if pin is not None:
|
1064
|
+
item["conference"]["extensions"]["pinned"] = pin
|
1065
|
+
|
1066
|
+
if notify is not None:
|
1067
|
+
item["conference"]["extensions"]["notify"].configure(notify)
|
1068
|
+
|
1049
1069
|
iq = Iq(stype="set", sfrom=self.user_jid, sto=self.user_jid)
|
1050
1070
|
iq["pubsub"]["publish"]["node"] = self.xmpp["xep_0402"].stanza.NS
|
1051
1071
|
iq["pubsub"]["publish"].append(item)
|
@@ -5,17 +5,30 @@
|
|
5
5
|
|
6
6
|
import slixmpp.plugins
|
7
7
|
from slixmpp import Iq, Message
|
8
|
-
from slixmpp.exceptions import XMPPError
|
8
|
+
from slixmpp.exceptions import _DEFAULT_ERROR_TYPES, XMPPError
|
9
|
+
from slixmpp.plugins.xep_0004.stanza.field import FormField
|
9
10
|
from slixmpp.plugins.xep_0050 import XEP_0050, Command
|
10
11
|
from slixmpp.plugins.xep_0231 import XEP_0231
|
11
12
|
from slixmpp.plugins.xep_0425.stanza import Moderate
|
13
|
+
from slixmpp.plugins.xep_0469.stanza import NS as PINNED_NS
|
14
|
+
from slixmpp.plugins.xep_0469.stanza import Pinned
|
12
15
|
from slixmpp.xmlstream import StanzaBase
|
13
16
|
|
14
|
-
from . import
|
17
|
+
from . import (
|
18
|
+
link_preview,
|
19
|
+
xep_0077,
|
20
|
+
xep_0100,
|
21
|
+
xep_0153,
|
22
|
+
xep_0292,
|
23
|
+
xep_0356_old,
|
24
|
+
xep_0492,
|
25
|
+
)
|
15
26
|
|
16
27
|
# TODO: remove this when the fix is included in slixmpp
|
17
28
|
Moderate.interfaces.add("id")
|
18
29
|
|
30
|
+
_DEFAULT_ERROR_TYPES["policy-violation"] = "modify" # type:ignore
|
31
|
+
|
19
32
|
|
20
33
|
async def _handle_bob_iq(self, iq: Iq):
|
21
34
|
cid = iq["bob"]["cid"]
|
@@ -42,6 +55,17 @@ async def _handle_bob_iq(self, iq: Iq):
|
|
42
55
|
iq.send()
|
43
56
|
|
44
57
|
|
58
|
+
def set_pinned(self, val: bool):
|
59
|
+
extensions = self.parent()
|
60
|
+
if val:
|
61
|
+
extensions.enable("pinned")
|
62
|
+
else:
|
63
|
+
extensions._del_sub(f"{{{PINNED_NS}}}pinned")
|
64
|
+
|
65
|
+
|
66
|
+
Pinned.set_pinned = set_pinned
|
67
|
+
|
68
|
+
|
45
69
|
XEP_0231._handle_bob_iq = _handle_bob_iq
|
46
70
|
|
47
71
|
|
@@ -75,13 +99,56 @@ def reply(self, body=None, clear=True):
|
|
75
99
|
return new_message
|
76
100
|
|
77
101
|
|
102
|
+
Message.reply = reply # type: ignore
|
103
|
+
|
104
|
+
|
105
|
+
FormField.set_value_base = FormField.set_value # type:ignore
|
106
|
+
|
107
|
+
|
108
|
+
def set_value(self: FormField, value):
|
109
|
+
if not self._type:
|
110
|
+
if isinstance(value, bool):
|
111
|
+
self._type = "boolean"
|
112
|
+
elif isinstance(value, str):
|
113
|
+
self._type = "text-single"
|
114
|
+
elif isinstance(value, (list, tuple)):
|
115
|
+
self._type = "text-multi"
|
116
|
+
|
117
|
+
FormField.set_value_base(self, value)
|
118
|
+
|
119
|
+
|
120
|
+
def get_value(self, convert=True, convert_list=False):
|
121
|
+
valsXML = self.xml.findall("{%s}value" % self.namespace)
|
122
|
+
if len(valsXML) == 0:
|
123
|
+
return None
|
124
|
+
elif self._type == "boolean":
|
125
|
+
if convert:
|
126
|
+
return valsXML[0].text in self.true_values
|
127
|
+
return valsXML[0].text
|
128
|
+
elif self._type in self.multi_value_types or len(valsXML) > 1:
|
129
|
+
values = []
|
130
|
+
for valXML in valsXML:
|
131
|
+
if valXML.text is None:
|
132
|
+
valXML.text = ""
|
133
|
+
values.append(valXML.text)
|
134
|
+
if self._type == "text-multi" and convert_list:
|
135
|
+
values = "\n".join(values)
|
136
|
+
return values
|
137
|
+
else:
|
138
|
+
if valsXML[0].text is None:
|
139
|
+
return ""
|
140
|
+
return valsXML[0].text
|
141
|
+
|
142
|
+
|
143
|
+
FormField.set_value = set_value # type:ignore
|
144
|
+
FormField.get_value = get_value # type:ignore
|
145
|
+
|
146
|
+
|
78
147
|
slixmpp.plugins.PLUGINS.extend(
|
79
148
|
[
|
80
149
|
"link_preview",
|
81
150
|
"xep_0292_provider",
|
82
151
|
"xep_0356_old",
|
152
|
+
"xep_0492",
|
83
153
|
]
|
84
154
|
)
|
85
|
-
|
86
|
-
|
87
|
-
Message.reply = reply # type: ignore
|
@@ -0,0 +1,16 @@
|
|
1
|
+
from slixmpp.plugins import BasePlugin
|
2
|
+
from . import stanza
|
3
|
+
|
4
|
+
|
5
|
+
class XEP_0492(BasePlugin):
|
6
|
+
"""
|
7
|
+
XEP-0492: Chat notification settings
|
8
|
+
"""
|
9
|
+
|
10
|
+
name = "xep_0492"
|
11
|
+
description = "XEP-0492: Chat notification settings"
|
12
|
+
dependencies = {"xep_0402"}
|
13
|
+
stanza = stanza
|
14
|
+
|
15
|
+
def plugin_init(self):
|
16
|
+
stanza.register_plugin()
|
@@ -0,0 +1,102 @@
|
|
1
|
+
from typing import Literal, Optional, cast
|
2
|
+
|
3
|
+
from slixmpp import register_stanza_plugin
|
4
|
+
from slixmpp.plugins.xep_0402.stanza import Extensions
|
5
|
+
from slixmpp.xmlstream import ElementBase
|
6
|
+
|
7
|
+
from ...util.types import ClientType
|
8
|
+
|
9
|
+
NS = "urn:xmpp:notification-settings:0"
|
10
|
+
|
11
|
+
WhenLiteral = Literal["never", "always", "on-mention"]
|
12
|
+
|
13
|
+
|
14
|
+
class Notify(ElementBase):
|
15
|
+
"""
|
16
|
+
Chat notification settings element
|
17
|
+
|
18
|
+
|
19
|
+
To enable it on a Conference element, use configure() like this:
|
20
|
+
|
21
|
+
.. code-block::python
|
22
|
+
|
23
|
+
# C being a Conference element
|
24
|
+
C['extensions']["notify"].configure("always", client_type="pc")
|
25
|
+
|
26
|
+
Which will add the <notify> element to the <extensions> element.
|
27
|
+
"""
|
28
|
+
|
29
|
+
namespace = NS
|
30
|
+
name = "notify"
|
31
|
+
plugin_attrib = "notify"
|
32
|
+
interfaces = {"notify"}
|
33
|
+
|
34
|
+
def configure(self, when: WhenLiteral, client_type: Optional[ClientType] = None) -> None:
|
35
|
+
"""
|
36
|
+
Configure the chat notification settings for this bookmark.
|
37
|
+
|
38
|
+
This method ensures that there are no conflicting settings, e.g.,
|
39
|
+
both a <never /> and a <always /> element.
|
40
|
+
"""
|
41
|
+
cls = _CLASS_MAP[when]
|
42
|
+
element = cls()
|
43
|
+
if client_type is not None:
|
44
|
+
element["client-type"] = client_type
|
45
|
+
|
46
|
+
match = client_type if client_type is not None else ""
|
47
|
+
for child in self:
|
48
|
+
if isinstance(child, _Base) and child["client-type"] == match:
|
49
|
+
self.xml.remove(child.xml)
|
50
|
+
|
51
|
+
self.append(element)
|
52
|
+
|
53
|
+
def get_config(
|
54
|
+
self, client_type: Optional[ClientType] = None
|
55
|
+
) -> Optional[WhenLiteral]:
|
56
|
+
"""
|
57
|
+
Get the chat notification settings for this bookmark.
|
58
|
+
|
59
|
+
:param client_type: Optionally, get the notification for a specific client type.
|
60
|
+
If unset, returns the global notification setting.
|
61
|
+
|
62
|
+
:return: The chat notification setting as a string, or None if unset.
|
63
|
+
"""
|
64
|
+
match = client_type if client_type is not None else ""
|
65
|
+
for child in self:
|
66
|
+
if isinstance(child, _Base) and child["client-type"] == match:
|
67
|
+
return cast(WhenLiteral, child.name)
|
68
|
+
return None
|
69
|
+
|
70
|
+
|
71
|
+
class _Base(ElementBase):
|
72
|
+
namespace = NS
|
73
|
+
interfaces = {"client-type"}
|
74
|
+
|
75
|
+
|
76
|
+
class Never(_Base):
|
77
|
+
name = "never"
|
78
|
+
|
79
|
+
|
80
|
+
class Always(_Base):
|
81
|
+
name = "always"
|
82
|
+
|
83
|
+
|
84
|
+
class OnMention(_Base):
|
85
|
+
name = "on-mention"
|
86
|
+
|
87
|
+
|
88
|
+
class Advanced(ElementBase):
|
89
|
+
namespace = NS
|
90
|
+
name = plugin_attrib = "advanced"
|
91
|
+
|
92
|
+
|
93
|
+
_CLASS_MAP = {
|
94
|
+
"never": Never,
|
95
|
+
"always": Always,
|
96
|
+
"on-mention": OnMention,
|
97
|
+
}
|
98
|
+
|
99
|
+
|
100
|
+
def register_plugin():
|
101
|
+
register_stanza_plugin(Extensions, Notify)
|
102
|
+
register_stanza_plugin(Notify, Advanced)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: slidge
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.4
|
4
4
|
Summary: XMPP bridging framework
|
5
5
|
Author-email: Nicolas Cedilnik <nicoco@nicoco.fr>
|
6
6
|
License: GNU AFFERO GENERAL PUBLIC LICENSE
|
@@ -693,7 +693,7 @@ Requires-Dist: thumbhash>=0.1.2
|
|
693
693
|
|
694
694
|
|
695
695
|
[](https://ci.codeberg.org/repos/14027)
|
696
|
-
[](https://slidge.im/coverage)
|
696
|
+
[](https://slidge.im/coverage/main)
|
697
697
|
|
698
698
|
[](https://pypi.org/project/slidge/)
|
699
699
|
[](https://packages.debian.org/unstable/python3-slidge)
|
@@ -164,6 +164,9 @@ slidge/slixfix/xep_0292/vcard4.py
|
|
164
164
|
slidge/slixfix/xep_0356_old/__init__.py
|
165
165
|
slidge/slixfix/xep_0356_old/privilege.py
|
166
166
|
slidge/slixfix/xep_0356_old/stanza.py
|
167
|
+
slidge/slixfix/xep_0492/__init__.py
|
168
|
+
slidge/slixfix/xep_0492/notify.py
|
169
|
+
slidge/slixfix/xep_0492/stanza.py
|
167
170
|
slidge/util/__init__.py
|
168
171
|
slidge/util/archive_msg.py
|
169
172
|
slidge/util/conf.py
|
@@ -31,7 +31,7 @@ async def test_single_emoji():
|
|
31
31
|
form = await x.restricted_emoji_extended_feature()
|
32
32
|
values = form.get_values()
|
33
33
|
assert values.get("max_reactions_per_user") is None
|
34
|
-
assert values.get("allowlist") == "♥"
|
34
|
+
assert values.get("allowlist") == ["♥"]
|
35
35
|
|
36
36
|
|
37
37
|
@pytest.mark.asyncio
|