matrix-synapse 1.143.0__cp310-abi3-manylinux_2_28_aarch64.whl
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.
Potentially problematic release.
This version of matrix-synapse might be problematic. Click here for more details.
- matrix_synapse-1.143.0.dist-info/AUTHORS.rst +51 -0
- matrix_synapse-1.143.0.dist-info/LICENSE-AGPL-3.0 +661 -0
- matrix_synapse-1.143.0.dist-info/LICENSE-COMMERCIAL +6 -0
- matrix_synapse-1.143.0.dist-info/METADATA +385 -0
- matrix_synapse-1.143.0.dist-info/RECORD +1058 -0
- matrix_synapse-1.143.0.dist-info/WHEEL +4 -0
- matrix_synapse-1.143.0.dist-info/entry_points.txt +14 -0
- synapse/__init__.py +97 -0
- synapse/_scripts/__init__.py +0 -0
- synapse/_scripts/export_signing_key.py +109 -0
- synapse/_scripts/generate_config.py +83 -0
- synapse/_scripts/generate_log_config.py +56 -0
- synapse/_scripts/generate_signing_key.py +55 -0
- synapse/_scripts/generate_workers_map.py +318 -0
- synapse/_scripts/hash_password.py +95 -0
- synapse/_scripts/move_remote_media_to_new_store.py +128 -0
- synapse/_scripts/register_new_matrix_user.py +402 -0
- synapse/_scripts/review_recent_signups.py +212 -0
- synapse/_scripts/synapse_port_db.py +1604 -0
- synapse/_scripts/synctl.py +365 -0
- synapse/_scripts/update_synapse_database.py +130 -0
- synapse/api/__init__.py +20 -0
- synapse/api/auth/__init__.py +207 -0
- synapse/api/auth/base.py +406 -0
- synapse/api/auth/internal.py +299 -0
- synapse/api/auth/mas.py +436 -0
- synapse/api/auth/msc3861_delegated.py +617 -0
- synapse/api/auth_blocking.py +144 -0
- synapse/api/constants.py +362 -0
- synapse/api/errors.py +907 -0
- synapse/api/filtering.py +537 -0
- synapse/api/presence.py +102 -0
- synapse/api/ratelimiting.py +480 -0
- synapse/api/room_versions.py +535 -0
- synapse/api/urls.py +118 -0
- synapse/app/__init__.py +60 -0
- synapse/app/_base.py +862 -0
- synapse/app/admin_cmd.py +388 -0
- synapse/app/appservice.py +30 -0
- synapse/app/client_reader.py +30 -0
- synapse/app/complement_fork_starter.py +206 -0
- synapse/app/event_creator.py +29 -0
- synapse/app/federation_reader.py +30 -0
- synapse/app/federation_sender.py +30 -0
- synapse/app/frontend_proxy.py +30 -0
- synapse/app/generic_worker.py +474 -0
- synapse/app/homeserver.py +505 -0
- synapse/app/media_repository.py +30 -0
- synapse/app/phone_stats_home.py +296 -0
- synapse/app/pusher.py +30 -0
- synapse/app/synchrotron.py +30 -0
- synapse/app/user_dir.py +31 -0
- synapse/appservice/__init__.py +458 -0
- synapse/appservice/api.py +567 -0
- synapse/appservice/scheduler.py +564 -0
- synapse/config/__init__.py +27 -0
- synapse/config/__main__.py +62 -0
- synapse/config/_base.py +1106 -0
- synapse/config/_base.pyi +215 -0
- synapse/config/_util.py +99 -0
- synapse/config/account_validity.py +116 -0
- synapse/config/api.py +141 -0
- synapse/config/appservice.py +210 -0
- synapse/config/auth.py +80 -0
- synapse/config/auto_accept_invites.py +43 -0
- synapse/config/background_updates.py +44 -0
- synapse/config/cache.py +231 -0
- synapse/config/captcha.py +90 -0
- synapse/config/cas.py +116 -0
- synapse/config/consent.py +73 -0
- synapse/config/database.py +184 -0
- synapse/config/emailconfig.py +367 -0
- synapse/config/experimental.py +595 -0
- synapse/config/federation.py +114 -0
- synapse/config/homeserver.py +141 -0
- synapse/config/jwt.py +55 -0
- synapse/config/key.py +447 -0
- synapse/config/logger.py +390 -0
- synapse/config/mas.py +192 -0
- synapse/config/matrixrtc.py +66 -0
- synapse/config/metrics.py +84 -0
- synapse/config/modules.py +40 -0
- synapse/config/oembed.py +185 -0
- synapse/config/oidc.py +509 -0
- synapse/config/password_auth_providers.py +82 -0
- synapse/config/push.py +64 -0
- synapse/config/ratelimiting.py +254 -0
- synapse/config/redis.py +74 -0
- synapse/config/registration.py +296 -0
- synapse/config/repository.py +311 -0
- synapse/config/retention.py +162 -0
- synapse/config/room.py +88 -0
- synapse/config/room_directory.py +165 -0
- synapse/config/saml2.py +251 -0
- synapse/config/server.py +1170 -0
- synapse/config/server_notices.py +84 -0
- synapse/config/spam_checker.py +66 -0
- synapse/config/sso.py +121 -0
- synapse/config/stats.py +54 -0
- synapse/config/third_party_event_rules.py +40 -0
- synapse/config/tls.py +192 -0
- synapse/config/tracer.py +71 -0
- synapse/config/user_directory.py +47 -0
- synapse/config/user_types.py +42 -0
- synapse/config/voip.py +59 -0
- synapse/config/workers.py +642 -0
- synapse/crypto/__init__.py +20 -0
- synapse/crypto/context_factory.py +278 -0
- synapse/crypto/event_signing.py +194 -0
- synapse/crypto/keyring.py +931 -0
- synapse/event_auth.py +1266 -0
- synapse/events/__init__.py +667 -0
- synapse/events/auto_accept_invites.py +216 -0
- synapse/events/builder.py +387 -0
- synapse/events/presence_router.py +243 -0
- synapse/events/snapshot.py +559 -0
- synapse/events/utils.py +924 -0
- synapse/events/validator.py +305 -0
- synapse/federation/__init__.py +22 -0
- synapse/federation/federation_base.py +382 -0
- synapse/federation/federation_client.py +2132 -0
- synapse/federation/federation_server.py +1540 -0
- synapse/federation/persistence.py +70 -0
- synapse/federation/send_queue.py +531 -0
- synapse/federation/sender/__init__.py +1164 -0
- synapse/federation/sender/per_destination_queue.py +886 -0
- synapse/federation/sender/transaction_manager.py +210 -0
- synapse/federation/transport/__init__.py +28 -0
- synapse/federation/transport/client.py +1199 -0
- synapse/federation/transport/server/__init__.py +334 -0
- synapse/federation/transport/server/_base.py +429 -0
- synapse/federation/transport/server/federation.py +910 -0
- synapse/federation/units.py +133 -0
- synapse/handlers/__init__.py +20 -0
- synapse/handlers/account.py +162 -0
- synapse/handlers/account_data.py +360 -0
- synapse/handlers/account_validity.py +361 -0
- synapse/handlers/admin.py +615 -0
- synapse/handlers/appservice.py +989 -0
- synapse/handlers/auth.py +2481 -0
- synapse/handlers/cas.py +413 -0
- synapse/handlers/deactivate_account.py +363 -0
- synapse/handlers/delayed_events.py +599 -0
- synapse/handlers/device.py +1870 -0
- synapse/handlers/devicemessage.py +399 -0
- synapse/handlers/directory.py +545 -0
- synapse/handlers/e2e_keys.py +1834 -0
- synapse/handlers/e2e_room_keys.py +455 -0
- synapse/handlers/event_auth.py +390 -0
- synapse/handlers/events.py +201 -0
- synapse/handlers/federation.py +2039 -0
- synapse/handlers/federation_event.py +2419 -0
- synapse/handlers/identity.py +812 -0
- synapse/handlers/initial_sync.py +528 -0
- synapse/handlers/jwt.py +120 -0
- synapse/handlers/message.py +2347 -0
- synapse/handlers/oidc.py +1801 -0
- synapse/handlers/pagination.py +768 -0
- synapse/handlers/password_policy.py +102 -0
- synapse/handlers/presence.py +2633 -0
- synapse/handlers/profile.py +655 -0
- synapse/handlers/push_rules.py +164 -0
- synapse/handlers/read_marker.py +79 -0
- synapse/handlers/receipts.py +351 -0
- synapse/handlers/register.py +1059 -0
- synapse/handlers/relations.py +623 -0
- synapse/handlers/reports.py +98 -0
- synapse/handlers/room.py +2448 -0
- synapse/handlers/room_list.py +632 -0
- synapse/handlers/room_member.py +2365 -0
- synapse/handlers/room_member_worker.py +146 -0
- synapse/handlers/room_policy.py +186 -0
- synapse/handlers/room_summary.py +1057 -0
- synapse/handlers/saml.py +524 -0
- synapse/handlers/search.py +723 -0
- synapse/handlers/send_email.py +209 -0
- synapse/handlers/set_password.py +71 -0
- synapse/handlers/sliding_sync/__init__.py +1701 -0
- synapse/handlers/sliding_sync/extensions.py +969 -0
- synapse/handlers/sliding_sync/room_lists.py +2262 -0
- synapse/handlers/sliding_sync/store.py +128 -0
- synapse/handlers/sso.py +1291 -0
- synapse/handlers/state_deltas.py +82 -0
- synapse/handlers/stats.py +321 -0
- synapse/handlers/sync.py +3106 -0
- synapse/handlers/thread_subscriptions.py +190 -0
- synapse/handlers/typing.py +606 -0
- synapse/handlers/ui_auth/__init__.py +48 -0
- synapse/handlers/ui_auth/checkers.py +332 -0
- synapse/handlers/user_directory.py +783 -0
- synapse/handlers/worker_lock.py +371 -0
- synapse/http/__init__.py +105 -0
- synapse/http/additional_resource.py +62 -0
- synapse/http/client.py +1373 -0
- synapse/http/connectproxyclient.py +316 -0
- synapse/http/federation/__init__.py +19 -0
- synapse/http/federation/matrix_federation_agent.py +490 -0
- synapse/http/federation/srv_resolver.py +196 -0
- synapse/http/federation/well_known_resolver.py +367 -0
- synapse/http/matrixfederationclient.py +1873 -0
- synapse/http/proxy.py +290 -0
- synapse/http/proxyagent.py +497 -0
- synapse/http/replicationagent.py +202 -0
- synapse/http/request_metrics.py +309 -0
- synapse/http/server.py +1110 -0
- synapse/http/servlet.py +1018 -0
- synapse/http/site.py +825 -0
- synapse/http/types.py +27 -0
- synapse/logging/__init__.py +31 -0
- synapse/logging/_remote.py +261 -0
- synapse/logging/_terse_json.py +95 -0
- synapse/logging/context.py +1209 -0
- synapse/logging/formatter.py +62 -0
- synapse/logging/handlers.py +99 -0
- synapse/logging/loggers.py +25 -0
- synapse/logging/opentracing.py +1132 -0
- synapse/logging/scopecontextmanager.py +160 -0
- synapse/media/_base.py +830 -0
- synapse/media/filepath.py +417 -0
- synapse/media/media_repository.py +1580 -0
- synapse/media/media_storage.py +702 -0
- synapse/media/oembed.py +277 -0
- synapse/media/preview_html.py +556 -0
- synapse/media/storage_provider.py +195 -0
- synapse/media/thumbnailer.py +833 -0
- synapse/media/url_previewer.py +875 -0
- synapse/metrics/__init__.py +748 -0
- synapse/metrics/_gc.py +219 -0
- synapse/metrics/_reactor_metrics.py +171 -0
- synapse/metrics/_types.py +38 -0
- synapse/metrics/background_process_metrics.py +555 -0
- synapse/metrics/common_usage_metrics.py +94 -0
- synapse/metrics/jemalloc.py +248 -0
- synapse/module_api/__init__.py +2131 -0
- synapse/module_api/callbacks/__init__.py +50 -0
- synapse/module_api/callbacks/account_validity_callbacks.py +106 -0
- synapse/module_api/callbacks/media_repository_callbacks.py +157 -0
- synapse/module_api/callbacks/ratelimit_callbacks.py +78 -0
- synapse/module_api/callbacks/spamchecker_callbacks.py +991 -0
- synapse/module_api/callbacks/third_party_event_rules_callbacks.py +592 -0
- synapse/module_api/errors.py +42 -0
- synapse/notifier.py +970 -0
- synapse/push/__init__.py +212 -0
- synapse/push/bulk_push_rule_evaluator.py +635 -0
- synapse/push/clientformat.py +126 -0
- synapse/push/emailpusher.py +333 -0
- synapse/push/httppusher.py +564 -0
- synapse/push/mailer.py +1010 -0
- synapse/push/presentable_names.py +216 -0
- synapse/push/push_tools.py +114 -0
- synapse/push/push_types.py +141 -0
- synapse/push/pusher.py +87 -0
- synapse/push/pusherpool.py +501 -0
- synapse/push/rulekinds.py +33 -0
- synapse/py.typed +0 -0
- synapse/replication/__init__.py +20 -0
- synapse/replication/http/__init__.py +68 -0
- synapse/replication/http/_base.py +468 -0
- synapse/replication/http/account_data.py +297 -0
- synapse/replication/http/deactivate_account.py +81 -0
- synapse/replication/http/delayed_events.py +62 -0
- synapse/replication/http/devices.py +254 -0
- synapse/replication/http/federation.py +334 -0
- synapse/replication/http/login.py +106 -0
- synapse/replication/http/membership.py +364 -0
- synapse/replication/http/presence.py +133 -0
- synapse/replication/http/push.py +156 -0
- synapse/replication/http/register.py +172 -0
- synapse/replication/http/send_events.py +182 -0
- synapse/replication/http/state.py +82 -0
- synapse/replication/http/streams.py +101 -0
- synapse/replication/tcp/__init__.py +56 -0
- synapse/replication/tcp/client.py +552 -0
- synapse/replication/tcp/commands.py +569 -0
- synapse/replication/tcp/context.py +41 -0
- synapse/replication/tcp/external_cache.py +156 -0
- synapse/replication/tcp/handler.py +922 -0
- synapse/replication/tcp/protocol.py +608 -0
- synapse/replication/tcp/redis.py +509 -0
- synapse/replication/tcp/resource.py +348 -0
- synapse/replication/tcp/streams/__init__.py +96 -0
- synapse/replication/tcp/streams/_base.py +765 -0
- synapse/replication/tcp/streams/events.py +287 -0
- synapse/replication/tcp/streams/federation.py +92 -0
- synapse/replication/tcp/streams/partial_state.py +80 -0
- synapse/res/providers.json +29 -0
- synapse/res/templates/_base.html +29 -0
- synapse/res/templates/account_previously_renewed.html +6 -0
- synapse/res/templates/account_renewed.html +6 -0
- synapse/res/templates/add_threepid.html +8 -0
- synapse/res/templates/add_threepid.txt +6 -0
- synapse/res/templates/add_threepid_failure.html +7 -0
- synapse/res/templates/add_threepid_success.html +6 -0
- synapse/res/templates/already_in_use.html +12 -0
- synapse/res/templates/already_in_use.txt +10 -0
- synapse/res/templates/auth_success.html +21 -0
- synapse/res/templates/invalid_token.html +6 -0
- synapse/res/templates/mail-Element.css +7 -0
- synapse/res/templates/mail-Vector.css +7 -0
- synapse/res/templates/mail-expiry.css +4 -0
- synapse/res/templates/mail.css +156 -0
- synapse/res/templates/notice_expiry.html +46 -0
- synapse/res/templates/notice_expiry.txt +7 -0
- synapse/res/templates/notif.html +51 -0
- synapse/res/templates/notif.txt +22 -0
- synapse/res/templates/notif_mail.html +59 -0
- synapse/res/templates/notif_mail.txt +10 -0
- synapse/res/templates/password_reset.html +10 -0
- synapse/res/templates/password_reset.txt +7 -0
- synapse/res/templates/password_reset_confirmation.html +15 -0
- synapse/res/templates/password_reset_failure.html +7 -0
- synapse/res/templates/password_reset_success.html +6 -0
- synapse/res/templates/recaptcha.html +42 -0
- synapse/res/templates/registration.html +12 -0
- synapse/res/templates/registration.txt +10 -0
- synapse/res/templates/registration_failure.html +6 -0
- synapse/res/templates/registration_success.html +6 -0
- synapse/res/templates/registration_token.html +18 -0
- synapse/res/templates/room.html +33 -0
- synapse/res/templates/room.txt +9 -0
- synapse/res/templates/sso.css +129 -0
- synapse/res/templates/sso_account_deactivated.html +25 -0
- synapse/res/templates/sso_auth_account_details.html +186 -0
- synapse/res/templates/sso_auth_account_details.js +116 -0
- synapse/res/templates/sso_auth_bad_user.html +26 -0
- synapse/res/templates/sso_auth_confirm.html +27 -0
- synapse/res/templates/sso_auth_success.html +26 -0
- synapse/res/templates/sso_error.html +71 -0
- synapse/res/templates/sso_footer.html +19 -0
- synapse/res/templates/sso_login_idp_picker.html +60 -0
- synapse/res/templates/sso_new_user_consent.html +30 -0
- synapse/res/templates/sso_partial_profile.html +19 -0
- synapse/res/templates/sso_redirect_confirm.html +39 -0
- synapse/res/templates/style.css +33 -0
- synapse/res/templates/terms.html +27 -0
- synapse/rest/__init__.py +197 -0
- synapse/rest/admin/__init__.py +390 -0
- synapse/rest/admin/_base.py +72 -0
- synapse/rest/admin/background_updates.py +171 -0
- synapse/rest/admin/devices.py +221 -0
- synapse/rest/admin/event_reports.py +173 -0
- synapse/rest/admin/events.py +69 -0
- synapse/rest/admin/experimental_features.py +137 -0
- synapse/rest/admin/federation.py +243 -0
- synapse/rest/admin/media.py +540 -0
- synapse/rest/admin/registration_tokens.py +358 -0
- synapse/rest/admin/rooms.py +1061 -0
- synapse/rest/admin/scheduled_tasks.py +70 -0
- synapse/rest/admin/server_notice_servlet.py +132 -0
- synapse/rest/admin/statistics.py +132 -0
- synapse/rest/admin/username_available.py +58 -0
- synapse/rest/admin/users.py +1606 -0
- synapse/rest/client/__init__.py +20 -0
- synapse/rest/client/_base.py +113 -0
- synapse/rest/client/account.py +930 -0
- synapse/rest/client/account_data.py +319 -0
- synapse/rest/client/account_validity.py +103 -0
- synapse/rest/client/appservice_ping.py +125 -0
- synapse/rest/client/auth.py +218 -0
- synapse/rest/client/auth_metadata.py +122 -0
- synapse/rest/client/capabilities.py +121 -0
- synapse/rest/client/delayed_events.py +165 -0
- synapse/rest/client/devices.py +587 -0
- synapse/rest/client/directory.py +211 -0
- synapse/rest/client/events.py +116 -0
- synapse/rest/client/filter.py +112 -0
- synapse/rest/client/initial_sync.py +65 -0
- synapse/rest/client/keys.py +678 -0
- synapse/rest/client/knock.py +104 -0
- synapse/rest/client/login.py +750 -0
- synapse/rest/client/login_token_request.py +127 -0
- synapse/rest/client/logout.py +93 -0
- synapse/rest/client/matrixrtc.py +52 -0
- synapse/rest/client/media.py +285 -0
- synapse/rest/client/mutual_rooms.py +93 -0
- synapse/rest/client/notifications.py +137 -0
- synapse/rest/client/openid.py +109 -0
- synapse/rest/client/password_policy.py +69 -0
- synapse/rest/client/presence.py +131 -0
- synapse/rest/client/profile.py +291 -0
- synapse/rest/client/push_rule.py +331 -0
- synapse/rest/client/pusher.py +181 -0
- synapse/rest/client/read_marker.py +104 -0
- synapse/rest/client/receipts.py +165 -0
- synapse/rest/client/register.py +1067 -0
- synapse/rest/client/relations.py +138 -0
- synapse/rest/client/rendezvous.py +76 -0
- synapse/rest/client/reporting.py +207 -0
- synapse/rest/client/room.py +1669 -0
- synapse/rest/client/room_keys.py +426 -0
- synapse/rest/client/room_upgrade_rest_servlet.py +112 -0
- synapse/rest/client/sendtodevice.py +85 -0
- synapse/rest/client/sync.py +1131 -0
- synapse/rest/client/tags.py +129 -0
- synapse/rest/client/thirdparty.py +130 -0
- synapse/rest/client/thread_subscriptions.py +247 -0
- synapse/rest/client/tokenrefresh.py +52 -0
- synapse/rest/client/transactions.py +149 -0
- synapse/rest/client/user_directory.py +90 -0
- synapse/rest/client/versions.py +191 -0
- synapse/rest/client/voip.py +88 -0
- synapse/rest/consent/__init__.py +0 -0
- synapse/rest/consent/consent_resource.py +210 -0
- synapse/rest/health.py +38 -0
- synapse/rest/key/__init__.py +20 -0
- synapse/rest/key/v2/__init__.py +40 -0
- synapse/rest/key/v2/local_key_resource.py +125 -0
- synapse/rest/key/v2/remote_key_resource.py +302 -0
- synapse/rest/media/__init__.py +0 -0
- synapse/rest/media/config_resource.py +53 -0
- synapse/rest/media/create_resource.py +90 -0
- synapse/rest/media/download_resource.py +110 -0
- synapse/rest/media/media_repository_resource.py +113 -0
- synapse/rest/media/preview_url_resource.py +77 -0
- synapse/rest/media/thumbnail_resource.py +142 -0
- synapse/rest/media/upload_resource.py +187 -0
- synapse/rest/media/v1/__init__.py +39 -0
- synapse/rest/media/v1/_base.py +23 -0
- synapse/rest/media/v1/media_storage.py +23 -0
- synapse/rest/media/v1/storage_provider.py +23 -0
- synapse/rest/synapse/__init__.py +20 -0
- synapse/rest/synapse/client/__init__.py +93 -0
- synapse/rest/synapse/client/federation_whitelist.py +66 -0
- synapse/rest/synapse/client/jwks.py +77 -0
- synapse/rest/synapse/client/new_user_consent.py +115 -0
- synapse/rest/synapse/client/oidc/__init__.py +45 -0
- synapse/rest/synapse/client/oidc/backchannel_logout_resource.py +42 -0
- synapse/rest/synapse/client/oidc/callback_resource.py +48 -0
- synapse/rest/synapse/client/password_reset.py +129 -0
- synapse/rest/synapse/client/pick_idp.py +107 -0
- synapse/rest/synapse/client/pick_username.py +153 -0
- synapse/rest/synapse/client/rendezvous.py +58 -0
- synapse/rest/synapse/client/saml2/__init__.py +42 -0
- synapse/rest/synapse/client/saml2/metadata_resource.py +46 -0
- synapse/rest/synapse/client/saml2/response_resource.py +52 -0
- synapse/rest/synapse/client/sso_register.py +56 -0
- synapse/rest/synapse/client/unsubscribe.py +88 -0
- synapse/rest/synapse/mas/__init__.py +71 -0
- synapse/rest/synapse/mas/_base.py +55 -0
- synapse/rest/synapse/mas/devices.py +239 -0
- synapse/rest/synapse/mas/users.py +469 -0
- synapse/rest/well_known.py +148 -0
- synapse/server.py +1257 -0
- synapse/server_notices/__init__.py +0 -0
- synapse/server_notices/consent_server_notices.py +136 -0
- synapse/server_notices/resource_limits_server_notices.py +215 -0
- synapse/server_notices/server_notices_manager.py +388 -0
- synapse/server_notices/server_notices_sender.py +67 -0
- synapse/server_notices/worker_server_notices_sender.py +46 -0
- synapse/spam_checker_api/__init__.py +31 -0
- synapse/state/__init__.py +1022 -0
- synapse/state/v1.py +369 -0
- synapse/state/v2.py +984 -0
- synapse/static/client/login/index.html +47 -0
- synapse/static/client/login/js/jquery-3.4.1.min.js +2 -0
- synapse/static/client/login/js/login.js +291 -0
- synapse/static/client/login/spinner.gif +0 -0
- synapse/static/client/login/style.css +79 -0
- synapse/static/index.html +63 -0
- synapse/storage/__init__.py +43 -0
- synapse/storage/_base.py +245 -0
- synapse/storage/admin_client_config.py +25 -0
- synapse/storage/background_updates.py +1188 -0
- synapse/storage/controllers/__init__.py +57 -0
- synapse/storage/controllers/persist_events.py +1237 -0
- synapse/storage/controllers/purge_events.py +455 -0
- synapse/storage/controllers/state.py +950 -0
- synapse/storage/controllers/stats.py +119 -0
- synapse/storage/database.py +2719 -0
- synapse/storage/databases/__init__.py +175 -0
- synapse/storage/databases/main/__init__.py +420 -0
- synapse/storage/databases/main/account_data.py +1059 -0
- synapse/storage/databases/main/appservice.py +473 -0
- synapse/storage/databases/main/cache.py +911 -0
- synapse/storage/databases/main/censor_events.py +225 -0
- synapse/storage/databases/main/client_ips.py +815 -0
- synapse/storage/databases/main/delayed_events.py +562 -0
- synapse/storage/databases/main/deviceinbox.py +1271 -0
- synapse/storage/databases/main/devices.py +2578 -0
- synapse/storage/databases/main/directory.py +212 -0
- synapse/storage/databases/main/e2e_room_keys.py +689 -0
- synapse/storage/databases/main/end_to_end_keys.py +1894 -0
- synapse/storage/databases/main/event_federation.py +2508 -0
- synapse/storage/databases/main/event_push_actions.py +1933 -0
- synapse/storage/databases/main/events.py +3765 -0
- synapse/storage/databases/main/events_bg_updates.py +2910 -0
- synapse/storage/databases/main/events_forward_extremities.py +126 -0
- synapse/storage/databases/main/events_worker.py +2786 -0
- synapse/storage/databases/main/experimental_features.py +130 -0
- synapse/storage/databases/main/filtering.py +231 -0
- synapse/storage/databases/main/keys.py +291 -0
- synapse/storage/databases/main/lock.py +553 -0
- synapse/storage/databases/main/media_repository.py +1068 -0
- synapse/storage/databases/main/metrics.py +460 -0
- synapse/storage/databases/main/monthly_active_users.py +443 -0
- synapse/storage/databases/main/openid.py +60 -0
- synapse/storage/databases/main/presence.py +509 -0
- synapse/storage/databases/main/profile.py +539 -0
- synapse/storage/databases/main/purge_events.py +521 -0
- synapse/storage/databases/main/push_rule.py +970 -0
- synapse/storage/databases/main/pusher.py +793 -0
- synapse/storage/databases/main/receipts.py +1341 -0
- synapse/storage/databases/main/registration.py +3072 -0
- synapse/storage/databases/main/rejections.py +37 -0
- synapse/storage/databases/main/relations.py +1116 -0
- synapse/storage/databases/main/room.py +2779 -0
- synapse/storage/databases/main/roommember.py +2110 -0
- synapse/storage/databases/main/search.py +939 -0
- synapse/storage/databases/main/session.py +151 -0
- synapse/storage/databases/main/signatures.py +94 -0
- synapse/storage/databases/main/sliding_sync.py +603 -0
- synapse/storage/databases/main/state.py +1002 -0
- synapse/storage/databases/main/state_deltas.py +329 -0
- synapse/storage/databases/main/stats.py +789 -0
- synapse/storage/databases/main/stream.py +2577 -0
- synapse/storage/databases/main/tags.py +360 -0
- synapse/storage/databases/main/task_scheduler.py +225 -0
- synapse/storage/databases/main/thread_subscriptions.py +589 -0
- synapse/storage/databases/main/transactions.py +675 -0
- synapse/storage/databases/main/ui_auth.py +420 -0
- synapse/storage/databases/main/user_directory.py +1330 -0
- synapse/storage/databases/main/user_erasure_store.py +117 -0
- synapse/storage/databases/state/__init__.py +22 -0
- synapse/storage/databases/state/bg_updates.py +497 -0
- synapse/storage/databases/state/deletion.py +557 -0
- synapse/storage/databases/state/store.py +948 -0
- synapse/storage/engines/__init__.py +70 -0
- synapse/storage/engines/_base.py +154 -0
- synapse/storage/engines/postgres.py +261 -0
- synapse/storage/engines/sqlite.py +199 -0
- synapse/storage/invite_rule.py +112 -0
- synapse/storage/keys.py +40 -0
- synapse/storage/prepare_database.py +730 -0
- synapse/storage/push_rule.py +28 -0
- synapse/storage/roommember.py +88 -0
- synapse/storage/schema/README.md +4 -0
- synapse/storage/schema/__init__.py +186 -0
- synapse/storage/schema/common/delta/25/00background_updates.sql +40 -0
- synapse/storage/schema/common/delta/35/00background_updates_add_col.sql +36 -0
- synapse/storage/schema/common/delta/58/00background_update_ordering.sql +38 -0
- synapse/storage/schema/common/full_schemas/72/full.sql.postgres +8 -0
- synapse/storage/schema/common/full_schemas/72/full.sql.sqlite +6 -0
- synapse/storage/schema/common/schema_version.sql +60 -0
- synapse/storage/schema/main/delta/12/v12.sql +82 -0
- synapse/storage/schema/main/delta/13/v13.sql +38 -0
- synapse/storage/schema/main/delta/14/v14.sql +42 -0
- synapse/storage/schema/main/delta/15/appservice_txns.sql +50 -0
- synapse/storage/schema/main/delta/15/presence_indices.sql +2 -0
- synapse/storage/schema/main/delta/15/v15.sql +24 -0
- synapse/storage/schema/main/delta/16/events_order_index.sql +4 -0
- synapse/storage/schema/main/delta/16/remote_media_cache_index.sql +2 -0
- synapse/storage/schema/main/delta/16/remove_duplicates.sql +9 -0
- synapse/storage/schema/main/delta/16/room_alias_index.sql +3 -0
- synapse/storage/schema/main/delta/16/unique_constraints.sql +72 -0
- synapse/storage/schema/main/delta/16/users.sql +56 -0
- synapse/storage/schema/main/delta/17/drop_indexes.sql +37 -0
- synapse/storage/schema/main/delta/17/server_keys.sql +43 -0
- synapse/storage/schema/main/delta/17/user_threepids.sql +9 -0
- synapse/storage/schema/main/delta/18/server_keys_bigger_ints.sql +51 -0
- synapse/storage/schema/main/delta/19/event_index.sql +38 -0
- synapse/storage/schema/main/delta/20/dummy.sql +1 -0
- synapse/storage/schema/main/delta/20/pushers.py +93 -0
- synapse/storage/schema/main/delta/21/end_to_end_keys.sql +53 -0
- synapse/storage/schema/main/delta/21/receipts.sql +57 -0
- synapse/storage/schema/main/delta/22/receipts_index.sql +41 -0
- synapse/storage/schema/main/delta/22/user_threepids_unique.sql +19 -0
- synapse/storage/schema/main/delta/24/stats_reporting.sql +37 -0
- synapse/storage/schema/main/delta/25/fts.py +81 -0
- synapse/storage/schema/main/delta/25/guest_access.sql +44 -0
- synapse/storage/schema/main/delta/25/history_visibility.sql +44 -0
- synapse/storage/schema/main/delta/25/tags.sql +57 -0
- synapse/storage/schema/main/delta/26/account_data.sql +36 -0
- synapse/storage/schema/main/delta/27/account_data.sql +55 -0
- synapse/storage/schema/main/delta/27/forgotten_memberships.sql +45 -0
- synapse/storage/schema/main/delta/27/ts.py +61 -0
- synapse/storage/schema/main/delta/28/event_push_actions.sql +46 -0
- synapse/storage/schema/main/delta/28/events_room_stream.sql +39 -0
- synapse/storage/schema/main/delta/28/public_roms_index.sql +39 -0
- synapse/storage/schema/main/delta/28/receipts_user_id_index.sql +41 -0
- synapse/storage/schema/main/delta/28/upgrade_times.sql +40 -0
- synapse/storage/schema/main/delta/28/users_is_guest.sql +41 -0
- synapse/storage/schema/main/delta/29/push_actions.sql +54 -0
- synapse/storage/schema/main/delta/30/alias_creator.sql +35 -0
- synapse/storage/schema/main/delta/30/as_users.py +82 -0
- synapse/storage/schema/main/delta/30/deleted_pushers.sql +44 -0
- synapse/storage/schema/main/delta/30/presence_stream.sql +49 -0
- synapse/storage/schema/main/delta/30/public_rooms.sql +42 -0
- synapse/storage/schema/main/delta/30/push_rule_stream.sql +57 -0
- synapse/storage/schema/main/delta/30/threepid_guest_access_tokens.sql +43 -0
- synapse/storage/schema/main/delta/31/invites.sql +61 -0
- synapse/storage/schema/main/delta/31/local_media_repository_url_cache.sql +46 -0
- synapse/storage/schema/main/delta/31/pushers_0.py +92 -0
- synapse/storage/schema/main/delta/31/pushers_index.sql +41 -0
- synapse/storage/schema/main/delta/31/search_update.py +65 -0
- synapse/storage/schema/main/delta/32/events.sql +35 -0
- synapse/storage/schema/main/delta/32/openid.sql +9 -0
- synapse/storage/schema/main/delta/32/pusher_throttle.sql +42 -0
- synapse/storage/schema/main/delta/32/remove_indices.sql +52 -0
- synapse/storage/schema/main/delta/32/reports.sql +44 -0
- synapse/storage/schema/main/delta/33/access_tokens_device_index.sql +36 -0
- synapse/storage/schema/main/delta/33/devices.sql +40 -0
- synapse/storage/schema/main/delta/33/devices_for_e2e_keys.sql +38 -0
- synapse/storage/schema/main/delta/33/devices_for_e2e_keys_clear_unknown_device.sql +39 -0
- synapse/storage/schema/main/delta/33/event_fields.py +61 -0
- synapse/storage/schema/main/delta/33/remote_media_ts.py +43 -0
- synapse/storage/schema/main/delta/33/user_ips_index.sql +36 -0
- synapse/storage/schema/main/delta/34/appservice_stream.sql +42 -0
- synapse/storage/schema/main/delta/34/cache_stream.py +50 -0
- synapse/storage/schema/main/delta/34/device_inbox.sql +43 -0
- synapse/storage/schema/main/delta/34/push_display_name_rename.sql +39 -0
- synapse/storage/schema/main/delta/34/received_txn_purge.py +36 -0
- synapse/storage/schema/main/delta/35/contains_url.sql +36 -0
- synapse/storage/schema/main/delta/35/device_outbox.sql +58 -0
- synapse/storage/schema/main/delta/35/device_stream_id.sql +40 -0
- synapse/storage/schema/main/delta/35/event_push_actions_index.sql +36 -0
- synapse/storage/schema/main/delta/35/public_room_list_change_stream.sql +52 -0
- synapse/storage/schema/main/delta/35/stream_order_to_extrem.sql +56 -0
- synapse/storage/schema/main/delta/36/readd_public_rooms.sql +45 -0
- synapse/storage/schema/main/delta/37/remove_auth_idx.py +89 -0
- synapse/storage/schema/main/delta/37/user_threepids.sql +71 -0
- synapse/storage/schema/main/delta/38/postgres_fts_gist.sql +38 -0
- synapse/storage/schema/main/delta/39/appservice_room_list.sql +48 -0
- synapse/storage/schema/main/delta/39/device_federation_stream_idx.sql +35 -0
- synapse/storage/schema/main/delta/39/event_push_index.sql +36 -0
- synapse/storage/schema/main/delta/39/federation_out_position.sql +41 -0
- synapse/storage/schema/main/delta/39/membership_profile.sql +39 -0
- synapse/storage/schema/main/delta/40/current_state_idx.sql +36 -0
- synapse/storage/schema/main/delta/40/device_inbox.sql +40 -0
- synapse/storage/schema/main/delta/40/device_list_streams.sql +79 -0
- synapse/storage/schema/main/delta/40/event_push_summary.sql +57 -0
- synapse/storage/schema/main/delta/40/pushers.sql +58 -0
- synapse/storage/schema/main/delta/41/device_list_stream_idx.sql +36 -0
- synapse/storage/schema/main/delta/41/device_outbound_index.sql +35 -0
- synapse/storage/schema/main/delta/41/event_search_event_id_idx.sql +36 -0
- synapse/storage/schema/main/delta/41/ratelimit.sql +41 -0
- synapse/storage/schema/main/delta/42/current_state_delta.sql +48 -0
- synapse/storage/schema/main/delta/42/device_list_last_id.sql +52 -0
- synapse/storage/schema/main/delta/42/event_auth_state_only.sql +36 -0
- synapse/storage/schema/main/delta/42/user_dir.py +88 -0
- synapse/storage/schema/main/delta/43/blocked_rooms.sql +40 -0
- synapse/storage/schema/main/delta/43/quarantine_media.sql +36 -0
- synapse/storage/schema/main/delta/43/url_cache.sql +35 -0
- synapse/storage/schema/main/delta/43/user_share.sql +52 -0
- synapse/storage/schema/main/delta/44/expire_url_cache.sql +60 -0
- synapse/storage/schema/main/delta/45/group_server.sql +186 -0
- synapse/storage/schema/main/delta/45/profile_cache.sql +47 -0
- synapse/storage/schema/main/delta/46/drop_refresh_tokens.sql +36 -0
- synapse/storage/schema/main/delta/46/drop_unique_deleted_pushers.sql +54 -0
- synapse/storage/schema/main/delta/46/group_server.sql +51 -0
- synapse/storage/schema/main/delta/46/local_media_repository_url_idx.sql +43 -0
- synapse/storage/schema/main/delta/46/user_dir_null_room_ids.sql +54 -0
- synapse/storage/schema/main/delta/46/user_dir_typos.sql +43 -0
- synapse/storage/schema/main/delta/47/last_access_media.sql +35 -0
- synapse/storage/schema/main/delta/47/postgres_fts_gin.sql +36 -0
- synapse/storage/schema/main/delta/47/push_actions_staging.sql +47 -0
- synapse/storage/schema/main/delta/48/add_user_consent.sql +37 -0
- synapse/storage/schema/main/delta/48/add_user_ips_last_seen_index.sql +36 -0
- synapse/storage/schema/main/delta/48/deactivated_users.sql +44 -0
- synapse/storage/schema/main/delta/48/group_unique_indexes.py +67 -0
- synapse/storage/schema/main/delta/48/groups_joinable.sql +41 -0
- synapse/storage/schema/main/delta/49/add_user_consent_server_notice_sent.sql +39 -0
- synapse/storage/schema/main/delta/49/add_user_daily_visits.sql +40 -0
- synapse/storage/schema/main/delta/49/add_user_ips_last_seen_only_index.sql +36 -0
- synapse/storage/schema/main/delta/50/add_creation_ts_users_index.sql +38 -0
- synapse/storage/schema/main/delta/50/erasure_store.sql +40 -0
- synapse/storage/schema/main/delta/50/make_event_content_nullable.py +102 -0
- synapse/storage/schema/main/delta/51/e2e_room_keys.sql +58 -0
- synapse/storage/schema/main/delta/51/monthly_active_users.sql +46 -0
- synapse/storage/schema/main/delta/52/add_event_to_state_group_index.sql +38 -0
- synapse/storage/schema/main/delta/52/device_list_streams_unique_idx.sql +55 -0
- synapse/storage/schema/main/delta/52/e2e_room_keys.sql +72 -0
- synapse/storage/schema/main/delta/53/add_user_type_to_users.sql +38 -0
- synapse/storage/schema/main/delta/53/drop_sent_transactions.sql +35 -0
- synapse/storage/schema/main/delta/53/event_format_version.sql +35 -0
- synapse/storage/schema/main/delta/53/user_dir_populate.sql +49 -0
- synapse/storage/schema/main/delta/53/user_ips_index.sql +49 -0
- synapse/storage/schema/main/delta/53/user_share.sql +63 -0
- synapse/storage/schema/main/delta/53/user_threepid_id.sql +48 -0
- synapse/storage/schema/main/delta/53/users_in_public_rooms.sql +47 -0
- synapse/storage/schema/main/delta/54/account_validity_with_renewal.sql +49 -0
- synapse/storage/schema/main/delta/54/add_validity_to_server_keys.sql +42 -0
- synapse/storage/schema/main/delta/54/delete_forward_extremities.sql +42 -0
- synapse/storage/schema/main/delta/54/drop_legacy_tables.sql +49 -0
- synapse/storage/schema/main/delta/54/drop_presence_list.sql +35 -0
- synapse/storage/schema/main/delta/54/relations.sql +46 -0
- synapse/storage/schema/main/delta/54/stats.sql +99 -0
- synapse/storage/schema/main/delta/54/stats2.sql +47 -0
- synapse/storage/schema/main/delta/55/access_token_expiry.sql +37 -0
- synapse/storage/schema/main/delta/55/track_threepid_validations.sql +50 -0
- synapse/storage/schema/main/delta/55/users_alter_deactivated.sql +38 -0
- synapse/storage/schema/main/delta/56/add_spans_to_device_lists.sql +39 -0
- synapse/storage/schema/main/delta/56/current_state_events_membership.sql +41 -0
- synapse/storage/schema/main/delta/56/current_state_events_membership_mk2.sql +43 -0
- synapse/storage/schema/main/delta/56/delete_keys_from_deleted_backups.sql +44 -0
- synapse/storage/schema/main/delta/56/destinations_failure_ts.sql +44 -0
- synapse/storage/schema/main/delta/56/destinations_retry_interval_type.sql.postgres +18 -0
- synapse/storage/schema/main/delta/56/device_stream_id_insert.sql +39 -0
- synapse/storage/schema/main/delta/56/devices_last_seen.sql +43 -0
- synapse/storage/schema/main/delta/56/drop_unused_event_tables.sql +39 -0
- synapse/storage/schema/main/delta/56/event_expiry.sql +40 -0
- synapse/storage/schema/main/delta/56/event_labels.sql +49 -0
- synapse/storage/schema/main/delta/56/event_labels_background_update.sql +36 -0
- synapse/storage/schema/main/delta/56/fix_room_keys_index.sql +37 -0
- synapse/storage/schema/main/delta/56/hidden_devices.sql +37 -0
- synapse/storage/schema/main/delta/56/hidden_devices_fix.sql.sqlite +42 -0
- synapse/storage/schema/main/delta/56/nuke_empty_communities_from_db.sql +48 -0
- synapse/storage/schema/main/delta/56/public_room_list_idx.sql +35 -0
- synapse/storage/schema/main/delta/56/redaction_censor.sql +35 -0
- synapse/storage/schema/main/delta/56/redaction_censor2.sql +41 -0
- synapse/storage/schema/main/delta/56/redaction_censor3_fix_update.sql.postgres +25 -0
- synapse/storage/schema/main/delta/56/redaction_censor4.sql +35 -0
- synapse/storage/schema/main/delta/56/remove_tombstoned_rooms_from_directory.sql +38 -0
- synapse/storage/schema/main/delta/56/room_key_etag.sql +36 -0
- synapse/storage/schema/main/delta/56/room_membership_idx.sql +37 -0
- synapse/storage/schema/main/delta/56/room_retention.sql +52 -0
- synapse/storage/schema/main/delta/56/signing_keys.sql +75 -0
- synapse/storage/schema/main/delta/56/signing_keys_nonunique_signatures.sql +41 -0
- synapse/storage/schema/main/delta/56/stats_separated.sql +175 -0
- synapse/storage/schema/main/delta/56/unique_user_filter_index.py +46 -0
- synapse/storage/schema/main/delta/56/user_external_ids.sql +43 -0
- synapse/storage/schema/main/delta/56/users_in_public_rooms_idx.sql +36 -0
- synapse/storage/schema/main/delta/57/delete_old_current_state_events.sql +41 -0
- synapse/storage/schema/main/delta/57/device_list_remote_cache_stale.sql +44 -0
- synapse/storage/schema/main/delta/57/local_current_membership.py +111 -0
- synapse/storage/schema/main/delta/57/remove_sent_outbound_pokes.sql +40 -0
- synapse/storage/schema/main/delta/57/rooms_version_column.sql +43 -0
- synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.postgres +35 -0
- synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.sqlite +22 -0
- synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.postgres +39 -0
- synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.sqlite +23 -0
- synapse/storage/schema/main/delta/58/02remove_dup_outbound_pokes.sql +41 -0
- synapse/storage/schema/main/delta/58/03persist_ui_auth.sql +55 -0
- synapse/storage/schema/main/delta/58/05cache_instance.sql.postgres +30 -0
- synapse/storage/schema/main/delta/58/06dlols_unique_idx.py +83 -0
- synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.postgres +33 -0
- synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.sqlite +44 -0
- synapse/storage/schema/main/delta/58/07persist_ui_auth_ips.sql +44 -0
- synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.postgres +18 -0
- synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.sqlite +18 -0
- synapse/storage/schema/main/delta/58/09shadow_ban.sql +37 -0
- synapse/storage/schema/main/delta/58/10_pushrules_enabled_delete_obsolete.sql +47 -0
- synapse/storage/schema/main/delta/58/10drop_local_rejections_stream.sql +41 -0
- synapse/storage/schema/main/delta/58/10federation_pos_instance_name.sql +41 -0
- synapse/storage/schema/main/delta/58/11dehydration.sql +39 -0
- synapse/storage/schema/main/delta/58/11fallback.sql +43 -0
- synapse/storage/schema/main/delta/58/11user_id_seq.py +38 -0
- synapse/storage/schema/main/delta/58/12room_stats.sql +51 -0
- synapse/storage/schema/main/delta/58/13remove_presence_allow_inbound.sql +36 -0
- synapse/storage/schema/main/delta/58/14events_instance_name.sql +35 -0
- synapse/storage/schema/main/delta/58/14events_instance_name.sql.postgres +28 -0
- synapse/storage/schema/main/delta/58/15_catchup_destination_rooms.sql +61 -0
- synapse/storage/schema/main/delta/58/15unread_count.sql +45 -0
- synapse/storage/schema/main/delta/58/16populate_stats_process_rooms_fix.sql +41 -0
- synapse/storage/schema/main/delta/58/17_catchup_last_successful.sql +40 -0
- synapse/storage/schema/main/delta/58/18stream_positions.sql +41 -0
- synapse/storage/schema/main/delta/58/19instance_map.sql.postgres +25 -0
- synapse/storage/schema/main/delta/58/19txn_id.sql +59 -0
- synapse/storage/schema/main/delta/58/20instance_name_event_tables.sql +36 -0
- synapse/storage/schema/main/delta/58/20user_daily_visits.sql +37 -0
- synapse/storage/schema/main/delta/58/21as_device_stream.sql +36 -0
- synapse/storage/schema/main/delta/58/21drop_device_max_stream_id.sql +1 -0
- synapse/storage/schema/main/delta/58/22puppet_token.sql +36 -0
- synapse/storage/schema/main/delta/58/22users_have_local_media.sql +2 -0
- synapse/storage/schema/main/delta/58/23e2e_cross_signing_keys_idx.sql +36 -0
- synapse/storage/schema/main/delta/58/24drop_event_json_index.sql +38 -0
- synapse/storage/schema/main/delta/58/25user_external_ids_user_id_idx.sql +36 -0
- synapse/storage/schema/main/delta/58/26access_token_last_validated.sql +37 -0
- synapse/storage/schema/main/delta/58/27local_invites.sql +37 -0
- synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.postgres +16 -0
- synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.sqlite +62 -0
- synapse/storage/schema/main/delta/59/01ignored_user.py +85 -0
- synapse/storage/schema/main/delta/59/02shard_send_to_device.sql +37 -0
- synapse/storage/schema/main/delta/59/03shard_send_to_device_sequence.sql.postgres +25 -0
- synapse/storage/schema/main/delta/59/04_event_auth_chains.sql +71 -0
- synapse/storage/schema/main/delta/59/04_event_auth_chains.sql.postgres +16 -0
- synapse/storage/schema/main/delta/59/04drop_account_data.sql +36 -0
- synapse/storage/schema/main/delta/59/05cache_invalidation.sql +36 -0
- synapse/storage/schema/main/delta/59/06chain_cover_index.sql +36 -0
- synapse/storage/schema/main/delta/59/06shard_account_data.sql +39 -0
- synapse/storage/schema/main/delta/59/06shard_account_data.sql.postgres +32 -0
- synapse/storage/schema/main/delta/59/07shard_account_data_fix.sql +37 -0
- synapse/storage/schema/main/delta/59/08delete_pushers_for_deactivated_accounts.sql +39 -0
- synapse/storage/schema/main/delta/59/08delete_stale_pushers.sql +39 -0
- synapse/storage/schema/main/delta/59/09rejected_events_metadata.sql +45 -0
- synapse/storage/schema/main/delta/59/10delete_purged_chain_cover.sql +36 -0
- synapse/storage/schema/main/delta/59/11add_knock_members_to_stats.sql +39 -0
- synapse/storage/schema/main/delta/59/11drop_thumbnail_constraint.sql.postgres +22 -0
- synapse/storage/schema/main/delta/59/12account_validity_token_used_ts_ms.sql +37 -0
- synapse/storage/schema/main/delta/59/12presence_stream_instance.sql +37 -0
- synapse/storage/schema/main/delta/59/12presence_stream_instance_seq.sql.postgres +20 -0
- synapse/storage/schema/main/delta/59/13users_to_send_full_presence_to.sql +53 -0
- synapse/storage/schema/main/delta/59/14refresh_tokens.sql +53 -0
- synapse/storage/schema/main/delta/59/15locks.sql +56 -0
- synapse/storage/schema/main/delta/59/16federation_inbound_staging.sql +51 -0
- synapse/storage/schema/main/delta/60/01recreate_stream_ordering.sql.postgres +45 -0
- synapse/storage/schema/main/delta/60/02change_stream_ordering_columns.sql.postgres +30 -0
- synapse/storage/schema/main/delta/61/01change_appservices_txns.sql.postgres +23 -0
- synapse/storage/schema/main/delta/61/01insertion_event_lookups.sql +68 -0
- synapse/storage/schema/main/delta/61/02drop_redundant_room_depth_index.sql +37 -0
- synapse/storage/schema/main/delta/61/03recreate_min_depth.py +74 -0
- synapse/storage/schema/main/delta/62/01insertion_event_extremities.sql +43 -0
- synapse/storage/schema/main/delta/63/01create_registration_tokens.sql +42 -0
- synapse/storage/schema/main/delta/63/02delete_unlinked_email_pushers.sql +39 -0
- synapse/storage/schema/main/delta/63/02populate-rooms-creator.sql +36 -0
- synapse/storage/schema/main/delta/63/03session_store.sql +42 -0
- synapse/storage/schema/main/delta/63/04add_presence_stream_not_offline_index.sql +37 -0
- synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.postgres +23 -0
- synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.sqlite +37 -0
- synapse/storage/schema/main/delta/65/01msc2716_insertion_event_edges.sql +38 -0
- synapse/storage/schema/main/delta/65/03remove_hidden_devices_from_device_inbox.sql +41 -0
- synapse/storage/schema/main/delta/65/04_local_group_updates.sql +37 -0
- synapse/storage/schema/main/delta/65/05_remove_room_stats_historical_and_user_stats_historical.sql +38 -0
- synapse/storage/schema/main/delta/65/06remove_deleted_devices_from_device_inbox.sql +53 -0
- synapse/storage/schema/main/delta/65/07_arbitrary_relations.sql +37 -0
- synapse/storage/schema/main/delta/65/08_device_inbox_background_updates.sql +37 -0
- synapse/storage/schema/main/delta/65/10_expirable_refresh_tokens.sql +47 -0
- synapse/storage/schema/main/delta/65/11_devices_auth_provider_session.sql +46 -0
- synapse/storage/schema/main/delta/67/01drop_public_room_list_stream.sql +37 -0
- synapse/storage/schema/main/delta/68/01event_columns.sql +45 -0
- synapse/storage/schema/main/delta/68/02_msc2409_add_device_id_appservice_stream_type.sql +40 -0
- synapse/storage/schema/main/delta/68/03_delete_account_data_for_deactivated_accounts.sql +39 -0
- synapse/storage/schema/main/delta/68/04_refresh_tokens_index_next_token_id.sql +47 -0
- synapse/storage/schema/main/delta/68/04partial_state_rooms.sql +60 -0
- synapse/storage/schema/main/delta/68/05_delete_non_strings_from_event_search.sql.sqlite +22 -0
- synapse/storage/schema/main/delta/68/05partial_state_rooms_triggers.py +80 -0
- synapse/storage/schema/main/delta/68/06_msc3202_add_device_list_appservice_stream_type.sql +42 -0
- synapse/storage/schema/main/delta/69/01as_txn_seq.py +54 -0
- synapse/storage/schema/main/delta/69/01device_list_oubound_by_room.sql +57 -0
- synapse/storage/schema/main/delta/69/02cache_invalidation_index.sql +37 -0
- synapse/storage/schema/main/delta/70/01clean_table_purged_rooms.sql +39 -0
- synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.postgres +43 -0
- synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.sqlite +47 -0
- synapse/storage/schema/main/delta/71/01remove_noop_background_updates.sql +80 -0
- synapse/storage/schema/main/delta/71/02event_push_summary_unique.sql +37 -0
- synapse/storage/schema/main/delta/72/01add_room_type_to_state_stats.sql +38 -0
- synapse/storage/schema/main/delta/72/01event_push_summary_receipt.sql +54 -0
- synapse/storage/schema/main/delta/72/02event_push_actions_index.sql +38 -0
- synapse/storage/schema/main/delta/72/03bg_populate_events_columns.py +57 -0
- synapse/storage/schema/main/delta/72/03drop_event_reference_hashes.sql +36 -0
- synapse/storage/schema/main/delta/72/03remove_groups.sql +50 -0
- synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.postgres +17 -0
- synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.sqlite +40 -0
- synapse/storage/schema/main/delta/72/05receipts_event_stream_ordering.sql +38 -0
- synapse/storage/schema/main/delta/72/05remove_unstable_private_read_receipts.sql +38 -0
- synapse/storage/schema/main/delta/72/06add_consent_ts_to_users.sql +35 -0
- synapse/storage/schema/main/delta/72/06thread_notifications.sql +49 -0
- synapse/storage/schema/main/delta/72/07force_update_current_state_events_membership.py +67 -0
- synapse/storage/schema/main/delta/72/07thread_receipts.sql.postgres +30 -0
- synapse/storage/schema/main/delta/72/07thread_receipts.sql.sqlite +70 -0
- synapse/storage/schema/main/delta/72/08begin_cache_invalidation_seq_at_2.sql.postgres +23 -0
- synapse/storage/schema/main/delta/72/08thread_receipts.sql +39 -0
- synapse/storage/schema/main/delta/72/09partial_indices.sql.sqlite +56 -0
- synapse/storage/schema/main/delta/73/01event_failed_pull_attempts.sql +48 -0
- synapse/storage/schema/main/delta/73/02add_pusher_enabled.sql +35 -0
- synapse/storage/schema/main/delta/73/02room_id_indexes_for_purging.sql +41 -0
- synapse/storage/schema/main/delta/73/03pusher_device_id.sql +39 -0
- synapse/storage/schema/main/delta/73/03users_approved_column.sql +39 -0
- synapse/storage/schema/main/delta/73/04partial_join_details.sql +42 -0
- synapse/storage/schema/main/delta/73/04pending_device_list_updates.sql +47 -0
- synapse/storage/schema/main/delta/73/05old_push_actions.sql.postgres +22 -0
- synapse/storage/schema/main/delta/73/05old_push_actions.sql.sqlite +24 -0
- synapse/storage/schema/main/delta/73/06thread_notifications_thread_id_idx.sql +42 -0
- synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.postgres +23 -0
- synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.sqlite +76 -0
- synapse/storage/schema/main/delta/73/09partial_joined_via_destination.sql +37 -0
- synapse/storage/schema/main/delta/73/09threads_table.sql +49 -0
- synapse/storage/schema/main/delta/73/10_update_sqlite_fts4_tokenizer.py +71 -0
- synapse/storage/schema/main/delta/73/10login_tokens.sql +54 -0
- synapse/storage/schema/main/delta/73/11event_search_room_id_n_distinct.sql.postgres +33 -0
- synapse/storage/schema/main/delta/73/12refactor_device_list_outbound_pokes.sql +72 -0
- synapse/storage/schema/main/delta/73/13add_device_lists_index.sql +39 -0
- synapse/storage/schema/main/delta/73/20_un_partial_stated_room_stream.sql +51 -0
- synapse/storage/schema/main/delta/73/21_un_partial_stated_room_stream_seq.sql.postgres +20 -0
- synapse/storage/schema/main/delta/73/22_rebuild_user_dir_stats.sql +48 -0
- synapse/storage/schema/main/delta/73/22_un_partial_stated_event_stream.sql +53 -0
- synapse/storage/schema/main/delta/73/23_fix_thread_index.sql +52 -0
- synapse/storage/schema/main/delta/73/23_un_partial_stated_room_stream_seq.sql.postgres +20 -0
- synapse/storage/schema/main/delta/73/24_events_jump_to_date_index.sql +36 -0
- synapse/storage/schema/main/delta/73/25drop_presence.sql +36 -0
- synapse/storage/schema/main/delta/74/01_user_directory_stale_remote_users.sql +58 -0
- synapse/storage/schema/main/delta/74/02_set_device_id_for_pushers_bg_update.sql +38 -0
- synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.postgres +29 -0
- synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.sqlite +23 -0
- synapse/storage/schema/main/delta/74/03_room_membership_index.sql +38 -0
- synapse/storage/schema/main/delta/74/04_delete_e2e_backup_keys_for_deactivated_users.sql +36 -0
- synapse/storage/schema/main/delta/74/04_membership_tables_event_stream_ordering_triggers.py +87 -0
- synapse/storage/schema/main/delta/74/05_events_txn_id_device_id.sql +72 -0
- synapse/storage/schema/main/delta/74/90COMMENTS_destinations.sql.postgres +52 -0
- synapse/storage/schema/main/delta/76/01_add_profiles_full_user_id_column.sql +39 -0
- synapse/storage/schema/main/delta/76/02_add_user_filters_full_user_id_column.sql +39 -0
- synapse/storage/schema/main/delta/76/03_per_user_experimental_features.sql +46 -0
- synapse/storage/schema/main/delta/76/04_add_room_forgetter.sql +43 -0
- synapse/storage/schema/main/delta/77/01_add_profiles_not_valid_check.sql.postgres +16 -0
- synapse/storage/schema/main/delta/77/02_add_user_filters_not_valid_check.sql.postgres +16 -0
- synapse/storage/schema/main/delta/77/03bg_populate_full_user_id_profiles.sql +35 -0
- synapse/storage/schema/main/delta/77/04bg_populate_full_user_id_user_filters.sql +35 -0
- synapse/storage/schema/main/delta/77/05thread_notifications_backfill.sql +67 -0
- synapse/storage/schema/main/delta/77/06thread_notifications_not_null.sql.sqlite +102 -0
- synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions.sql.postgres +27 -0
- synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions_staging.sql.postgres +27 -0
- synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_summary.sql.postgres +29 -0
- synapse/storage/schema/main/delta/77/14bg_indices_event_stream_ordering.sql +39 -0
- synapse/storage/schema/main/delta/78/01_validate_and_update_profiles.py +99 -0
- synapse/storage/schema/main/delta/78/02_validate_and_update_user_filters.py +100 -0
- synapse/storage/schema/main/delta/78/03_remove_unused_indexes_user_filters.py +72 -0
- synapse/storage/schema/main/delta/78/03event_extremities_constraints.py +65 -0
- synapse/storage/schema/main/delta/78/04_add_full_user_id_index_user_filters.py +32 -0
- synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.postgres +102 -0
- synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.sqlite +72 -0
- synapse/storage/schema/main/delta/79/04_mitigate_stream_ordering_update_race.py +70 -0
- synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.postgres +69 -0
- synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.sqlite +65 -0
- synapse/storage/schema/main/delta/80/01_users_alter_locked.sql +35 -0
- synapse/storage/schema/main/delta/80/02_read_write_locks_unlogged.sql.postgres +30 -0
- synapse/storage/schema/main/delta/80/02_scheduled_tasks.sql +47 -0
- synapse/storage/schema/main/delta/80/03_read_write_locks_triggers.sql.postgres +37 -0
- synapse/storage/schema/main/delta/80/04_read_write_locks_deadlock.sql.postgres +71 -0
- synapse/storage/schema/main/delta/82/02_scheduled_tasks_index.sql +35 -0
- synapse/storage/schema/main/delta/82/04_add_indices_for_purging_rooms.sql +39 -0
- synapse/storage/schema/main/delta/82/05gaps.sql +44 -0
- synapse/storage/schema/main/delta/83/01_drop_old_tables.sql +43 -0
- synapse/storage/schema/main/delta/83/03_instance_name_receipts.sql.sqlite +17 -0
- synapse/storage/schema/main/delta/83/05_cross_signing_key_update_grant.sql +34 -0
- synapse/storage/schema/main/delta/83/06_event_push_summary_room.sql +36 -0
- synapse/storage/schema/main/delta/84/01_auth_links_stats.sql.postgres +20 -0
- synapse/storage/schema/main/delta/84/02_auth_links_index.sql +16 -0
- synapse/storage/schema/main/delta/84/03_auth_links_analyze.sql.postgres +16 -0
- synapse/storage/schema/main/delta/84/04_access_token_index.sql +15 -0
- synapse/storage/schema/main/delta/85/01_add_suspended.sql +14 -0
- synapse/storage/schema/main/delta/85/02_add_instance_names.sql +27 -0
- synapse/storage/schema/main/delta/85/03_new_sequences.sql.postgres +54 -0
- synapse/storage/schema/main/delta/85/04_cleanup_device_federation_outbox.sql +15 -0
- synapse/storage/schema/main/delta/85/05_add_instance_names_converted_pos.sql +16 -0
- synapse/storage/schema/main/delta/85/06_add_room_reports.sql +20 -0
- synapse/storage/schema/main/delta/86/01_authenticate_media.sql +15 -0
- synapse/storage/schema/main/delta/86/02_receipts_event_id_index.sql +15 -0
- synapse/storage/schema/main/delta/87/01_sliding_sync_memberships.sql +169 -0
- synapse/storage/schema/main/delta/87/02_per_connection_state.sql +81 -0
- synapse/storage/schema/main/delta/87/03_current_state_index.sql +19 -0
- synapse/storage/schema/main/delta/88/01_add_delayed_events.sql +43 -0
- synapse/storage/schema/main/delta/88/01_custom_profile_fields.sql +15 -0
- synapse/storage/schema/main/delta/88/02_fix_sliding_sync_membership_snapshots_forgotten_column.sql +21 -0
- synapse/storage/schema/main/delta/88/03_add_otk_ts_added_index.sql +18 -0
- synapse/storage/schema/main/delta/88/04_current_state_delta_index.sql +18 -0
- synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.postgres +19 -0
- synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.sqlite +19 -0
- synapse/storage/schema/main/delta/88/05_sliding_sync_room_config_index.sql +20 -0
- synapse/storage/schema/main/delta/88/06_events_received_ts_index.sql +17 -0
- synapse/storage/schema/main/delta/89/01_sliding_sync_membership_snapshot_index.sql +15 -0
- synapse/storage/schema/main/delta/90/01_add_column_participant_room_memberships_table.sql +16 -0
- synapse/storage/schema/main/delta/91/01_media_hash.sql +28 -0
- synapse/storage/schema/main/delta/92/01_remove_trigger.sql.postgres +16 -0
- synapse/storage/schema/main/delta/92/01_remove_trigger.sql.sqlite +16 -0
- synapse/storage/schema/main/delta/92/02_remove_populate_participant_bg_update.sql +17 -0
- synapse/storage/schema/main/delta/92/04_ss_membership_snapshot_idx.sql +16 -0
- synapse/storage/schema/main/delta/92/04_thread_subscriptions.sql +59 -0
- synapse/storage/schema/main/delta/92/04_thread_subscriptions_seq.sql.postgres +19 -0
- synapse/storage/schema/main/delta/92/05_fixup_max_depth_cap.sql +17 -0
- synapse/storage/schema/main/delta/92/05_thread_subscriptions_comments.sql.postgres +18 -0
- synapse/storage/schema/main/delta/92/06_device_federation_inbox_index.sql +16 -0
- synapse/storage/schema/main/delta/92/06_threads_last_sent_stream_ordering_comments.sql.postgres +24 -0
- synapse/storage/schema/main/delta/92/07_add_user_reports.sql +22 -0
- synapse/storage/schema/main/delta/92/07_event_txn_id_device_id_txn_id2.sql +15 -0
- synapse/storage/schema/main/delta/92/08_room_ban_redactions.sql +21 -0
- synapse/storage/schema/main/delta/92/08_thread_subscriptions_seq_fixup.sql.postgres +19 -0
- synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql +20 -0
- synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql.postgres +18 -0
- synapse/storage/schema/main/delta/93/01_add_delayed_events.sql +15 -0
- synapse/storage/schema/main/full_schemas/72/full.sql.postgres +1344 -0
- synapse/storage/schema/main/full_schemas/72/full.sql.sqlite +646 -0
- synapse/storage/schema/state/delta/23/drop_state_index.sql +35 -0
- synapse/storage/schema/state/delta/32/remove_state_indices.sql +38 -0
- synapse/storage/schema/state/delta/35/add_state_index.sql +36 -0
- synapse/storage/schema/state/delta/35/state.sql +41 -0
- synapse/storage/schema/state/delta/35/state_dedupe.sql +36 -0
- synapse/storage/schema/state/delta/47/state_group_seq.py +38 -0
- synapse/storage/schema/state/delta/56/state_group_room_idx.sql +36 -0
- synapse/storage/schema/state/delta/61/02state_groups_state_n_distinct.sql.postgres +34 -0
- synapse/storage/schema/state/delta/70/08_state_group_edges_unique.sql +36 -0
- synapse/storage/schema/state/delta/89/01_state_groups_deletion.sql +39 -0
- synapse/storage/schema/state/delta/90/02_delete_unreferenced_state_groups.sql +16 -0
- synapse/storage/schema/state/delta/90/03_remove_old_deletion_bg_update.sql +15 -0
- synapse/storage/schema/state/full_schemas/72/full.sql.postgres +30 -0
- synapse/storage/schema/state/full_schemas/72/full.sql.sqlite +20 -0
- synapse/storage/types.py +183 -0
- synapse/storage/util/__init__.py +20 -0
- synapse/storage/util/id_generators.py +928 -0
- synapse/storage/util/partial_state_events_tracker.py +194 -0
- synapse/storage/util/sequence.py +315 -0
- synapse/streams/__init__.py +43 -0
- synapse/streams/config.py +91 -0
- synapse/streams/events.py +203 -0
- synapse/synapse_rust/__init__.pyi +3 -0
- synapse/synapse_rust/acl.pyi +20 -0
- synapse/synapse_rust/events.pyi +136 -0
- synapse/synapse_rust/http_client.pyi +32 -0
- synapse/synapse_rust/push.pyi +86 -0
- synapse/synapse_rust/rendezvous.pyi +30 -0
- synapse/synapse_rust/segmenter.pyi +1 -0
- synapse/synapse_rust.abi3.so +0 -0
- synapse/types/__init__.py +1600 -0
- synapse/types/handlers/__init__.py +93 -0
- synapse/types/handlers/policy_server.py +16 -0
- synapse/types/handlers/sliding_sync.py +908 -0
- synapse/types/rest/__init__.py +25 -0
- synapse/types/rest/client/__init__.py +413 -0
- synapse/types/state.py +634 -0
- synapse/types/storage/__init__.py +66 -0
- synapse/util/__init__.py +169 -0
- synapse/util/async_helpers.py +1045 -0
- synapse/util/background_queue.py +142 -0
- synapse/util/batching_queue.py +202 -0
- synapse/util/caches/__init__.py +300 -0
- synapse/util/caches/cached_call.py +143 -0
- synapse/util/caches/deferred_cache.py +530 -0
- synapse/util/caches/descriptors.py +692 -0
- synapse/util/caches/dictionary_cache.py +346 -0
- synapse/util/caches/expiringcache.py +249 -0
- synapse/util/caches/lrucache.py +975 -0
- synapse/util/caches/response_cache.py +322 -0
- synapse/util/caches/stream_change_cache.py +370 -0
- synapse/util/caches/treecache.py +189 -0
- synapse/util/caches/ttlcache.py +197 -0
- synapse/util/cancellation.py +63 -0
- synapse/util/check_dependencies.py +335 -0
- synapse/util/clock.py +567 -0
- synapse/util/constants.py +22 -0
- synapse/util/daemonize.py +165 -0
- synapse/util/distributor.py +157 -0
- synapse/util/events.py +134 -0
- synapse/util/file_consumer.py +164 -0
- synapse/util/frozenutils.py +57 -0
- synapse/util/gai_resolver.py +178 -0
- synapse/util/hash.py +38 -0
- synapse/util/httpresourcetree.py +108 -0
- synapse/util/iterutils.py +189 -0
- synapse/util/json.py +56 -0
- synapse/util/linked_list.py +156 -0
- synapse/util/logcontext.py +46 -0
- synapse/util/logformatter.py +28 -0
- synapse/util/macaroons.py +325 -0
- synapse/util/manhole.py +191 -0
- synapse/util/metrics.py +339 -0
- synapse/util/module_loader.py +116 -0
- synapse/util/msisdn.py +51 -0
- synapse/util/patch_inline_callbacks.py +250 -0
- synapse/util/pydantic_models.py +63 -0
- synapse/util/ratelimitutils.py +419 -0
- synapse/util/retryutils.py +339 -0
- synapse/util/rlimit.py +42 -0
- synapse/util/rust.py +133 -0
- synapse/util/sentinel.py +21 -0
- synapse/util/stringutils.py +293 -0
- synapse/util/task_scheduler.py +493 -0
- synapse/util/templates.py +126 -0
- synapse/util/threepids.py +123 -0
- synapse/util/wheel_timer.py +112 -0
- synapse/visibility.py +835 -0
synapse/app/admin_cmd.py
ADDED
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
#
|
|
2
|
+
# This file is licensed under the Affero General Public License (AGPL) version 3.
|
|
3
|
+
#
|
|
4
|
+
# Copyright 2019 Matrix.org Foundation C.I.C.
|
|
5
|
+
# Copyright (C) 2023 New Vector, Ltd
|
|
6
|
+
#
|
|
7
|
+
# This program is free software: you can redistribute it and/or modify
|
|
8
|
+
# it under the terms of the GNU Affero General Public License as
|
|
9
|
+
# published by the Free Software Foundation, either version 3 of the
|
|
10
|
+
# License, or (at your option) any later version.
|
|
11
|
+
#
|
|
12
|
+
# See the GNU Affero General Public License for more details:
|
|
13
|
+
# <https://www.gnu.org/licenses/agpl-3.0.html>.
|
|
14
|
+
#
|
|
15
|
+
# Originally licensed under the Apache License, Version 2.0:
|
|
16
|
+
# <http://www.apache.org/licenses/LICENSE-2.0>.
|
|
17
|
+
#
|
|
18
|
+
# [This file includes modifications made by New Vector Limited]
|
|
19
|
+
#
|
|
20
|
+
#
|
|
21
|
+
import argparse
|
|
22
|
+
import json
|
|
23
|
+
import logging
|
|
24
|
+
import os
|
|
25
|
+
import sys
|
|
26
|
+
import tempfile
|
|
27
|
+
from typing import Mapping, Sequence
|
|
28
|
+
|
|
29
|
+
from twisted.internet import defer, task
|
|
30
|
+
|
|
31
|
+
import synapse
|
|
32
|
+
from synapse.app import _base
|
|
33
|
+
from synapse.config._base import ConfigError
|
|
34
|
+
from synapse.config.homeserver import HomeServerConfig
|
|
35
|
+
from synapse.config.logger import setup_logging
|
|
36
|
+
from synapse.events import EventBase
|
|
37
|
+
from synapse.handlers.admin import ExfiltrationWriter
|
|
38
|
+
from synapse.server import HomeServer
|
|
39
|
+
from synapse.storage.database import DatabasePool, LoggingDatabaseConnection
|
|
40
|
+
from synapse.storage.databases.main.account_data import AccountDataWorkerStore
|
|
41
|
+
from synapse.storage.databases.main.appservice import (
|
|
42
|
+
ApplicationServiceTransactionWorkerStore,
|
|
43
|
+
ApplicationServiceWorkerStore,
|
|
44
|
+
)
|
|
45
|
+
from synapse.storage.databases.main.client_ips import ClientIpWorkerStore
|
|
46
|
+
from synapse.storage.databases.main.deviceinbox import DeviceInboxWorkerStore
|
|
47
|
+
from synapse.storage.databases.main.devices import DeviceWorkerStore
|
|
48
|
+
from synapse.storage.databases.main.event_federation import EventFederationWorkerStore
|
|
49
|
+
from synapse.storage.databases.main.event_push_actions import (
|
|
50
|
+
EventPushActionsWorkerStore,
|
|
51
|
+
)
|
|
52
|
+
from synapse.storage.databases.main.events_worker import EventsWorkerStore
|
|
53
|
+
from synapse.storage.databases.main.filtering import FilteringWorkerStore
|
|
54
|
+
from synapse.storage.databases.main.media_repository import MediaRepositoryStore
|
|
55
|
+
from synapse.storage.databases.main.profile import ProfileWorkerStore
|
|
56
|
+
from synapse.storage.databases.main.push_rule import PushRulesWorkerStore
|
|
57
|
+
from synapse.storage.databases.main.receipts import ReceiptsWorkerStore
|
|
58
|
+
from synapse.storage.databases.main.registration import RegistrationWorkerStore
|
|
59
|
+
from synapse.storage.databases.main.relations import RelationsWorkerStore
|
|
60
|
+
from synapse.storage.databases.main.room import RoomWorkerStore
|
|
61
|
+
from synapse.storage.databases.main.roommember import RoomMemberWorkerStore
|
|
62
|
+
from synapse.storage.databases.main.signatures import SignatureWorkerStore
|
|
63
|
+
from synapse.storage.databases.main.state import StateGroupWorkerStore
|
|
64
|
+
from synapse.storage.databases.main.stream import StreamWorkerStore
|
|
65
|
+
from synapse.storage.databases.main.tags import TagsWorkerStore
|
|
66
|
+
from synapse.storage.databases.main.user_erasure_store import UserErasureWorkerStore
|
|
67
|
+
from synapse.types import ISynapseReactor, JsonMapping, StateMap
|
|
68
|
+
from synapse.util.logcontext import LoggingContext
|
|
69
|
+
|
|
70
|
+
logger = logging.getLogger("synapse.app.admin_cmd")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class AdminCmdStore(
|
|
74
|
+
FilteringWorkerStore,
|
|
75
|
+
ClientIpWorkerStore,
|
|
76
|
+
DeviceWorkerStore,
|
|
77
|
+
TagsWorkerStore,
|
|
78
|
+
DeviceInboxWorkerStore,
|
|
79
|
+
AccountDataWorkerStore,
|
|
80
|
+
PushRulesWorkerStore,
|
|
81
|
+
ApplicationServiceTransactionWorkerStore,
|
|
82
|
+
ApplicationServiceWorkerStore,
|
|
83
|
+
RoomMemberWorkerStore,
|
|
84
|
+
RelationsWorkerStore,
|
|
85
|
+
EventFederationWorkerStore,
|
|
86
|
+
EventPushActionsWorkerStore,
|
|
87
|
+
StateGroupWorkerStore,
|
|
88
|
+
SignatureWorkerStore,
|
|
89
|
+
UserErasureWorkerStore,
|
|
90
|
+
ReceiptsWorkerStore,
|
|
91
|
+
StreamWorkerStore,
|
|
92
|
+
EventsWorkerStore,
|
|
93
|
+
RegistrationWorkerStore,
|
|
94
|
+
RoomWorkerStore,
|
|
95
|
+
ProfileWorkerStore,
|
|
96
|
+
MediaRepositoryStore,
|
|
97
|
+
):
|
|
98
|
+
def __init__(
|
|
99
|
+
self,
|
|
100
|
+
database: DatabasePool,
|
|
101
|
+
db_conn: LoggingDatabaseConnection,
|
|
102
|
+
hs: "HomeServer",
|
|
103
|
+
):
|
|
104
|
+
super().__init__(database, db_conn, hs)
|
|
105
|
+
|
|
106
|
+
# Annoyingly `filter_events_for_client` assumes that this exists. We
|
|
107
|
+
# should refactor it to take a `Clock` directly.
|
|
108
|
+
self.clock = hs.get_clock()
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class AdminCmdServer(HomeServer):
|
|
112
|
+
DATASTORE_CLASS = AdminCmdStore
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
async def export_data_command(hs: HomeServer, args: argparse.Namespace) -> None:
|
|
116
|
+
"""Export data for a user."""
|
|
117
|
+
|
|
118
|
+
user_id = args.user_id
|
|
119
|
+
directory = args.output_directory
|
|
120
|
+
|
|
121
|
+
res = await hs.get_admin_handler().export_user_data(
|
|
122
|
+
user_id, FileExfiltrationWriter(user_id, directory=directory)
|
|
123
|
+
)
|
|
124
|
+
print(res)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class FileExfiltrationWriter(ExfiltrationWriter):
|
|
128
|
+
"""An ExfiltrationWriter that writes the users data to a directory.
|
|
129
|
+
Returns the directory location on completion.
|
|
130
|
+
|
|
131
|
+
Note: This writes to disk on the main reactor thread.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
user_id: The user whose data is being exfiltrated.
|
|
135
|
+
directory: The directory to write the data to, if None then will write
|
|
136
|
+
to a temporary directory.
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
def __init__(self, user_id: str, directory: str | None = None):
|
|
140
|
+
self.user_id = user_id
|
|
141
|
+
|
|
142
|
+
if directory:
|
|
143
|
+
self.base_directory = directory
|
|
144
|
+
else:
|
|
145
|
+
self.base_directory = tempfile.mkdtemp(
|
|
146
|
+
prefix="synapse-exfiltrate__%s__" % (user_id,)
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
os.makedirs(self.base_directory, exist_ok=True)
|
|
150
|
+
if list(os.listdir(self.base_directory)):
|
|
151
|
+
raise Exception("Directory must be empty")
|
|
152
|
+
|
|
153
|
+
def write_events(self, room_id: str, events: list[EventBase]) -> None:
|
|
154
|
+
room_directory = os.path.join(self.base_directory, "rooms", room_id)
|
|
155
|
+
os.makedirs(room_directory, exist_ok=True)
|
|
156
|
+
events_file = os.path.join(room_directory, "events")
|
|
157
|
+
|
|
158
|
+
with open(events_file, "a") as f:
|
|
159
|
+
for event in events:
|
|
160
|
+
json.dump(event.get_pdu_json(), fp=f)
|
|
161
|
+
|
|
162
|
+
def write_state(
|
|
163
|
+
self, room_id: str, event_id: str, state: StateMap[EventBase]
|
|
164
|
+
) -> None:
|
|
165
|
+
room_directory = os.path.join(self.base_directory, "rooms", room_id)
|
|
166
|
+
state_directory = os.path.join(room_directory, "state")
|
|
167
|
+
os.makedirs(state_directory, exist_ok=True)
|
|
168
|
+
|
|
169
|
+
event_file = os.path.join(state_directory, event_id)
|
|
170
|
+
|
|
171
|
+
with open(event_file, "a") as f:
|
|
172
|
+
for event in state.values():
|
|
173
|
+
json.dump(event.get_pdu_json(), fp=f)
|
|
174
|
+
|
|
175
|
+
def write_invite(
|
|
176
|
+
self, room_id: str, event: EventBase, state: StateMap[EventBase]
|
|
177
|
+
) -> None:
|
|
178
|
+
self.write_events(room_id, [event])
|
|
179
|
+
|
|
180
|
+
# We write the invite state somewhere else as they aren't full events
|
|
181
|
+
# and are only a subset of the state at the event.
|
|
182
|
+
room_directory = os.path.join(self.base_directory, "rooms", room_id)
|
|
183
|
+
os.makedirs(room_directory, exist_ok=True)
|
|
184
|
+
|
|
185
|
+
invite_state = os.path.join(room_directory, "invite_state")
|
|
186
|
+
|
|
187
|
+
with open(invite_state, "a") as f:
|
|
188
|
+
for event in state.values():
|
|
189
|
+
json.dump(event, fp=f)
|
|
190
|
+
|
|
191
|
+
def write_knock(
|
|
192
|
+
self, room_id: str, event: EventBase, state: StateMap[EventBase]
|
|
193
|
+
) -> None:
|
|
194
|
+
self.write_events(room_id, [event])
|
|
195
|
+
|
|
196
|
+
# We write the knock state somewhere else as they aren't full events
|
|
197
|
+
# and are only a subset of the state at the event.
|
|
198
|
+
room_directory = os.path.join(self.base_directory, "rooms", room_id)
|
|
199
|
+
os.makedirs(room_directory, exist_ok=True)
|
|
200
|
+
|
|
201
|
+
knock_state = os.path.join(room_directory, "knock_state")
|
|
202
|
+
|
|
203
|
+
with open(knock_state, "a") as f:
|
|
204
|
+
for event in state.values():
|
|
205
|
+
json.dump(event, fp=f)
|
|
206
|
+
|
|
207
|
+
def write_profile(self, profile: JsonMapping) -> None:
|
|
208
|
+
user_directory = os.path.join(self.base_directory, "user_data")
|
|
209
|
+
os.makedirs(user_directory, exist_ok=True)
|
|
210
|
+
profile_file = os.path.join(user_directory, "profile")
|
|
211
|
+
|
|
212
|
+
with open(profile_file, "a") as f:
|
|
213
|
+
json.dump(profile, fp=f)
|
|
214
|
+
|
|
215
|
+
def write_devices(self, devices: Sequence[JsonMapping]) -> None:
|
|
216
|
+
user_directory = os.path.join(self.base_directory, "user_data")
|
|
217
|
+
os.makedirs(user_directory, exist_ok=True)
|
|
218
|
+
device_file = os.path.join(user_directory, "devices")
|
|
219
|
+
|
|
220
|
+
for device in devices:
|
|
221
|
+
with open(device_file, "a") as f:
|
|
222
|
+
json.dump(device, fp=f)
|
|
223
|
+
|
|
224
|
+
def write_connections(self, connections: Sequence[JsonMapping]) -> None:
|
|
225
|
+
user_directory = os.path.join(self.base_directory, "user_data")
|
|
226
|
+
os.makedirs(user_directory, exist_ok=True)
|
|
227
|
+
connection_file = os.path.join(user_directory, "connections")
|
|
228
|
+
|
|
229
|
+
for connection in connections:
|
|
230
|
+
with open(connection_file, "a") as f:
|
|
231
|
+
json.dump(connection, fp=f)
|
|
232
|
+
|
|
233
|
+
def write_account_data(
|
|
234
|
+
self, file_name: str, account_data: Mapping[str, JsonMapping]
|
|
235
|
+
) -> None:
|
|
236
|
+
account_data_directory = os.path.join(
|
|
237
|
+
self.base_directory, "user_data", "account_data"
|
|
238
|
+
)
|
|
239
|
+
os.makedirs(account_data_directory, exist_ok=True)
|
|
240
|
+
|
|
241
|
+
account_data_file = os.path.join(account_data_directory, file_name)
|
|
242
|
+
|
|
243
|
+
with open(account_data_file, "a") as f:
|
|
244
|
+
json.dump(account_data, fp=f)
|
|
245
|
+
|
|
246
|
+
def write_media_id(self, media_id: str, media_metadata: JsonMapping) -> None:
|
|
247
|
+
file_directory = os.path.join(self.base_directory, "media_ids")
|
|
248
|
+
os.makedirs(file_directory, exist_ok=True)
|
|
249
|
+
media_id_file = os.path.join(file_directory, media_id)
|
|
250
|
+
|
|
251
|
+
with open(media_id_file, "w") as f:
|
|
252
|
+
json.dump(media_metadata, fp=f)
|
|
253
|
+
|
|
254
|
+
def finished(self) -> str:
|
|
255
|
+
return self.base_directory
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def load_config(argv_options: list[str]) -> tuple[HomeServerConfig, argparse.Namespace]:
|
|
259
|
+
parser = argparse.ArgumentParser(description="Synapse Admin Command")
|
|
260
|
+
HomeServerConfig.add_arguments_to_parser(parser)
|
|
261
|
+
|
|
262
|
+
subparser = parser.add_subparsers(
|
|
263
|
+
title="Admin Commands",
|
|
264
|
+
required=True,
|
|
265
|
+
dest="command",
|
|
266
|
+
metavar="<admin_command>",
|
|
267
|
+
help="The admin command to perform.",
|
|
268
|
+
)
|
|
269
|
+
export_data_parser = subparser.add_parser(
|
|
270
|
+
"export-data", help="Export all data for a user"
|
|
271
|
+
)
|
|
272
|
+
export_data_parser.add_argument("user_id", help="User to extra data from")
|
|
273
|
+
export_data_parser.add_argument(
|
|
274
|
+
"--output-directory",
|
|
275
|
+
action="store",
|
|
276
|
+
metavar="DIRECTORY",
|
|
277
|
+
required=False,
|
|
278
|
+
help="The directory to store the exported data in. Must be empty. Defaults"
|
|
279
|
+
" to creating a temp directory.",
|
|
280
|
+
)
|
|
281
|
+
export_data_parser.set_defaults(func=export_data_command)
|
|
282
|
+
|
|
283
|
+
try:
|
|
284
|
+
config, args = HomeServerConfig.load_config_with_parser(parser, argv_options)
|
|
285
|
+
except ConfigError as e:
|
|
286
|
+
sys.stderr.write("\n" + str(e) + "\n")
|
|
287
|
+
sys.exit(1)
|
|
288
|
+
|
|
289
|
+
return config, args
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def create_homeserver(
|
|
293
|
+
config: HomeServerConfig,
|
|
294
|
+
reactor: ISynapseReactor | None = None,
|
|
295
|
+
) -> AdminCmdServer:
|
|
296
|
+
"""
|
|
297
|
+
Create a homeserver instance for the Synapse admin command process.
|
|
298
|
+
|
|
299
|
+
Args:
|
|
300
|
+
config: The configuration for the homeserver.
|
|
301
|
+
reactor: Optionally provide a reactor to use. Can be useful in different
|
|
302
|
+
scenarios that you want control over the reactor, such as tests.
|
|
303
|
+
|
|
304
|
+
Returns:
|
|
305
|
+
A homeserver instance.
|
|
306
|
+
"""
|
|
307
|
+
if config.worker.worker_app is not None:
|
|
308
|
+
assert config.worker.worker_app == "synapse.app.admin_cmd"
|
|
309
|
+
|
|
310
|
+
# Update the config with some basic overrides so that don't have to specify
|
|
311
|
+
# a full worker config.
|
|
312
|
+
config.worker.worker_app = "synapse.app.admin_cmd"
|
|
313
|
+
|
|
314
|
+
if not config.worker.worker_daemonize and not config.worker.worker_log_config:
|
|
315
|
+
# Since we're meant to be run as a "command" let's not redirect stdio
|
|
316
|
+
# unless we've actually set log config.
|
|
317
|
+
config.logging.no_redirect_stdio = True
|
|
318
|
+
|
|
319
|
+
# Explicitly disable background processes
|
|
320
|
+
config.worker.should_update_user_directory = False
|
|
321
|
+
config.worker.run_background_tasks = False
|
|
322
|
+
config.worker.start_pushers = False
|
|
323
|
+
config.worker.pusher_shard_config.instances = []
|
|
324
|
+
config.worker.send_federation = False
|
|
325
|
+
config.worker.federation_shard_config.instances = []
|
|
326
|
+
|
|
327
|
+
synapse.events.USE_FROZEN_DICTS = config.server.use_frozen_dicts
|
|
328
|
+
|
|
329
|
+
admin_command_server = AdminCmdServer(
|
|
330
|
+
config.server.server_name,
|
|
331
|
+
config=config,
|
|
332
|
+
reactor=reactor,
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
return admin_command_server
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def setup(admin_command_server: AdminCmdServer) -> None:
|
|
339
|
+
"""
|
|
340
|
+
Setup a `AdminCmdServer` instance.
|
|
341
|
+
|
|
342
|
+
Args:
|
|
343
|
+
admin_command_server: The homeserver to setup.
|
|
344
|
+
"""
|
|
345
|
+
setup_logging(
|
|
346
|
+
admin_command_server, admin_command_server.config, use_worker_options=True
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
admin_command_server.setup()
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
async def start(admin_command_server: AdminCmdServer, args: argparse.Namespace) -> None:
|
|
353
|
+
"""
|
|
354
|
+
Should be called once the reactor is running.
|
|
355
|
+
|
|
356
|
+
Args:
|
|
357
|
+
admin_command_server: The homeserver to setup.
|
|
358
|
+
args: Command line arguments.
|
|
359
|
+
"""
|
|
360
|
+
# This needs a logcontext unlike other entrypoints because we're not using
|
|
361
|
+
# `register_start(...)` to run this function.
|
|
362
|
+
with LoggingContext(name="start", server_name=admin_command_server.hostname):
|
|
363
|
+
# We make sure that `_base.start` gets run before we actually run the command.
|
|
364
|
+
await _base.start(admin_command_server)
|
|
365
|
+
# Run the command
|
|
366
|
+
await args.func(admin_command_server, args)
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def main() -> None:
|
|
370
|
+
homeserver_config, args = load_config(sys.argv[1:])
|
|
371
|
+
with LoggingContext(name="main", server_name=homeserver_config.server.server_name):
|
|
372
|
+
# Initialize and setup the homeserver
|
|
373
|
+
admin_command_server = create_homeserver(homeserver_config)
|
|
374
|
+
setup(admin_command_server)
|
|
375
|
+
|
|
376
|
+
_base.start_worker_reactor(
|
|
377
|
+
"synapse-admin-cmd",
|
|
378
|
+
admin_command_server.config,
|
|
379
|
+
# We use task.react as the basic run command as it correctly handles tearing
|
|
380
|
+
# down the reactor when the deferreds resolve and setting the return value.
|
|
381
|
+
run_command=lambda: task.react(
|
|
382
|
+
lambda _reactor: defer.ensureDeferred(start(admin_command_server, args))
|
|
383
|
+
),
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
if __name__ == "__main__":
|
|
388
|
+
main()
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#
|
|
2
|
+
# This file is licensed under the Affero General Public License (AGPL) version 3.
|
|
3
|
+
#
|
|
4
|
+
# Copyright 2016 OpenMarket Ltd
|
|
5
|
+
# Copyright (C) 2023 New Vector, Ltd
|
|
6
|
+
#
|
|
7
|
+
# This program is free software: you can redistribute it and/or modify
|
|
8
|
+
# it under the terms of the GNU Affero General Public License as
|
|
9
|
+
# published by the Free Software Foundation, either version 3 of the
|
|
10
|
+
# License, or (at your option) any later version.
|
|
11
|
+
#
|
|
12
|
+
# See the GNU Affero General Public License for more details:
|
|
13
|
+
# <https://www.gnu.org/licenses/agpl-3.0.html>.
|
|
14
|
+
#
|
|
15
|
+
# Originally licensed under the Apache License, Version 2.0:
|
|
16
|
+
# <http://www.apache.org/licenses/LICENSE-2.0>.
|
|
17
|
+
#
|
|
18
|
+
# [This file includes modifications made by New Vector Limited]
|
|
19
|
+
#
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
from synapse.app.generic_worker import main as worker_main
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def main() -> None:
|
|
26
|
+
worker_main()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
if __name__ == "__main__":
|
|
30
|
+
main()
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#
|
|
2
|
+
# This file is licensed under the Affero General Public License (AGPL) version 3.
|
|
3
|
+
#
|
|
4
|
+
# Copyright 2016 OpenMarket Ltd
|
|
5
|
+
# Copyright (C) 2023 New Vector, Ltd
|
|
6
|
+
#
|
|
7
|
+
# This program is free software: you can redistribute it and/or modify
|
|
8
|
+
# it under the terms of the GNU Affero General Public License as
|
|
9
|
+
# published by the Free Software Foundation, either version 3 of the
|
|
10
|
+
# License, or (at your option) any later version.
|
|
11
|
+
#
|
|
12
|
+
# See the GNU Affero General Public License for more details:
|
|
13
|
+
# <https://www.gnu.org/licenses/agpl-3.0.html>.
|
|
14
|
+
#
|
|
15
|
+
# Originally licensed under the Apache License, Version 2.0:
|
|
16
|
+
# <http://www.apache.org/licenses/LICENSE-2.0>.
|
|
17
|
+
#
|
|
18
|
+
# [This file includes modifications made by New Vector Limited]
|
|
19
|
+
#
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
from synapse.app.generic_worker import main as worker_main
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def main() -> None:
|
|
26
|
+
worker_main()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
if __name__ == "__main__":
|
|
30
|
+
main()
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#
|
|
2
|
+
# This file is licensed under the Affero General Public License (AGPL) version 3.
|
|
3
|
+
#
|
|
4
|
+
# Copyright 2022 The Matrix.org Foundation C.I.C.
|
|
5
|
+
# Copyright (C) 2023 New Vector, Ltd
|
|
6
|
+
#
|
|
7
|
+
# This program is free software: you can redistribute it and/or modify
|
|
8
|
+
# it under the terms of the GNU Affero General Public License as
|
|
9
|
+
# published by the Free Software Foundation, either version 3 of the
|
|
10
|
+
# License, or (at your option) any later version.
|
|
11
|
+
#
|
|
12
|
+
# See the GNU Affero General Public License for more details:
|
|
13
|
+
# <https://www.gnu.org/licenses/agpl-3.0.html>.
|
|
14
|
+
#
|
|
15
|
+
# Originally licensed under the Apache License, Version 2.0:
|
|
16
|
+
# <http://www.apache.org/licenses/LICENSE-2.0>.
|
|
17
|
+
#
|
|
18
|
+
# [This file includes modifications made by New Vector Limited]
|
|
19
|
+
#
|
|
20
|
+
#
|
|
21
|
+
import argparse
|
|
22
|
+
import importlib
|
|
23
|
+
import itertools
|
|
24
|
+
import multiprocessing
|
|
25
|
+
import os
|
|
26
|
+
import signal
|
|
27
|
+
import sys
|
|
28
|
+
from types import FrameType
|
|
29
|
+
from typing import Any, Callable
|
|
30
|
+
|
|
31
|
+
from twisted.internet.main import installReactor
|
|
32
|
+
|
|
33
|
+
# a list of the original signal handlers, before we installed our custom ones.
|
|
34
|
+
# We restore these in our child processes.
|
|
35
|
+
_original_signal_handlers: dict[int, Any] = {}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ProxiedReactor:
|
|
39
|
+
"""
|
|
40
|
+
Twisted tracks the 'installed' reactor as a global variable.
|
|
41
|
+
(Actually, it does some module trickery, but the effect is similar.)
|
|
42
|
+
|
|
43
|
+
The default EpollReactor is buggy if it's created before a process is
|
|
44
|
+
forked, then used in the child.
|
|
45
|
+
See https://twistedmatrix.com/trac/ticket/4759#comment:17.
|
|
46
|
+
|
|
47
|
+
However, importing certain Twisted modules will automatically create and
|
|
48
|
+
install a reactor if one hasn't already been installed.
|
|
49
|
+
It's not normally possible to re-install a reactor.
|
|
50
|
+
|
|
51
|
+
Given the goal of launching workers with fork() to only import the code once,
|
|
52
|
+
this presents a conflict.
|
|
53
|
+
Our work around is to 'install' this ProxiedReactor which prevents Twisted
|
|
54
|
+
from creating and installing one, but which lets us replace the actual reactor
|
|
55
|
+
in use later on.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
def __init__(self) -> None:
|
|
59
|
+
self.___reactor_target: Any = None
|
|
60
|
+
|
|
61
|
+
def _install_real_reactor(self, new_reactor: Any) -> None:
|
|
62
|
+
"""
|
|
63
|
+
Install a real reactor for this ProxiedReactor to forward lookups onto.
|
|
64
|
+
|
|
65
|
+
This method is specific to our ProxiedReactor and should not clash with
|
|
66
|
+
any names used on an actual Twisted reactor.
|
|
67
|
+
"""
|
|
68
|
+
self.___reactor_target = new_reactor
|
|
69
|
+
|
|
70
|
+
def __getattr__(self, attr_name: str) -> Any:
|
|
71
|
+
return getattr(self.___reactor_target, attr_name)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _worker_entrypoint(
|
|
75
|
+
func: Callable[[], None], proxy_reactor: ProxiedReactor, args: list[str]
|
|
76
|
+
) -> None:
|
|
77
|
+
"""
|
|
78
|
+
Entrypoint for a forked worker process.
|
|
79
|
+
|
|
80
|
+
We just need to set up the command-line arguments, create our real reactor
|
|
81
|
+
and then kick off the worker's main() function.
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
from synapse.util.stringutils import strtobool
|
|
85
|
+
|
|
86
|
+
sys.argv = args
|
|
87
|
+
|
|
88
|
+
# reset the custom signal handlers that we installed, so that the children start
|
|
89
|
+
# from a clean slate.
|
|
90
|
+
for sig, handler in _original_signal_handlers.items():
|
|
91
|
+
signal.signal(sig, handler)
|
|
92
|
+
|
|
93
|
+
# Install the asyncio reactor if the
|
|
94
|
+
# SYNAPSE_COMPLEMENT_FORKING_LAUNCHER_ASYNC_IO_REACTOR is set to 1. The
|
|
95
|
+
# SYNAPSE_ASYNC_IO_REACTOR variable would be used, but then causes
|
|
96
|
+
# synapse/__init__.py to also try to install an asyncio reactor.
|
|
97
|
+
if strtobool(
|
|
98
|
+
os.environ.get("SYNAPSE_COMPLEMENT_FORKING_LAUNCHER_ASYNC_IO_REACTOR", "0")
|
|
99
|
+
):
|
|
100
|
+
import asyncio
|
|
101
|
+
|
|
102
|
+
from twisted.internet.asyncioreactor import AsyncioSelectorReactor
|
|
103
|
+
|
|
104
|
+
reactor = AsyncioSelectorReactor(asyncio.get_event_loop())
|
|
105
|
+
proxy_reactor._install_real_reactor(reactor)
|
|
106
|
+
else:
|
|
107
|
+
from twisted.internet.epollreactor import EPollReactor
|
|
108
|
+
|
|
109
|
+
proxy_reactor._install_real_reactor(EPollReactor())
|
|
110
|
+
|
|
111
|
+
func()
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def main() -> None:
|
|
115
|
+
"""
|
|
116
|
+
Entrypoint for the forking launcher.
|
|
117
|
+
"""
|
|
118
|
+
parser = argparse.ArgumentParser()
|
|
119
|
+
parser.add_argument("db_config", help="Path to database config file")
|
|
120
|
+
parser.add_argument(
|
|
121
|
+
"args",
|
|
122
|
+
nargs="...",
|
|
123
|
+
help="Argument groups separated by `--`. "
|
|
124
|
+
"The first argument of each group is a Synapse app name. "
|
|
125
|
+
"Subsequent arguments are passed through.",
|
|
126
|
+
)
|
|
127
|
+
ns = parser.parse_args()
|
|
128
|
+
|
|
129
|
+
# Split up the subsequent arguments into each workers' arguments;
|
|
130
|
+
# `--` is our delimiter of choice.
|
|
131
|
+
args_by_worker: list[list[str]] = [
|
|
132
|
+
list(args)
|
|
133
|
+
for cond, args in itertools.groupby(ns.args, lambda ele: ele != "--")
|
|
134
|
+
if cond and args
|
|
135
|
+
]
|
|
136
|
+
|
|
137
|
+
# Prevent Twisted from installing a shared reactor that all the workers will
|
|
138
|
+
# inherit when we fork(), by installing our own beforehand.
|
|
139
|
+
proxy_reactor = ProxiedReactor()
|
|
140
|
+
installReactor(proxy_reactor)
|
|
141
|
+
|
|
142
|
+
# Import the entrypoints for all the workers.
|
|
143
|
+
worker_functions = []
|
|
144
|
+
for worker_args in args_by_worker:
|
|
145
|
+
worker_module = importlib.import_module(worker_args[0])
|
|
146
|
+
worker_functions.append(worker_module.main)
|
|
147
|
+
|
|
148
|
+
# We need to prepare the database first as otherwise all the workers will
|
|
149
|
+
# try to create a schema version table and some will crash out.
|
|
150
|
+
from synapse._scripts import update_synapse_database
|
|
151
|
+
|
|
152
|
+
update_proc = multiprocessing.Process(
|
|
153
|
+
target=_worker_entrypoint,
|
|
154
|
+
args=(
|
|
155
|
+
update_synapse_database.main,
|
|
156
|
+
proxy_reactor,
|
|
157
|
+
[
|
|
158
|
+
"update_synapse_database",
|
|
159
|
+
"--database-config",
|
|
160
|
+
ns.db_config,
|
|
161
|
+
"--run-background-updates",
|
|
162
|
+
],
|
|
163
|
+
),
|
|
164
|
+
)
|
|
165
|
+
print("===== PREPARING DATABASE =====", file=sys.stderr)
|
|
166
|
+
update_proc.start()
|
|
167
|
+
update_proc.join()
|
|
168
|
+
print("===== PREPARED DATABASE =====", file=sys.stderr)
|
|
169
|
+
|
|
170
|
+
processes: list[multiprocessing.Process] = []
|
|
171
|
+
|
|
172
|
+
# Install signal handlers to propagate signals to all our children, so that they
|
|
173
|
+
# shut down cleanly. This also inhibits our own exit, but that's good: we want to
|
|
174
|
+
# wait until the children have exited.
|
|
175
|
+
def handle_signal(signum: int, frame: FrameType | None) -> None:
|
|
176
|
+
print(
|
|
177
|
+
f"complement_fork_starter: Caught signal {signum}. Stopping children.",
|
|
178
|
+
file=sys.stderr,
|
|
179
|
+
)
|
|
180
|
+
for p in processes:
|
|
181
|
+
if p.pid:
|
|
182
|
+
os.kill(p.pid, signum)
|
|
183
|
+
|
|
184
|
+
for sig in (signal.SIGINT, signal.SIGTERM):
|
|
185
|
+
_original_signal_handlers[sig] = signal.signal(sig, handle_signal)
|
|
186
|
+
|
|
187
|
+
# At this point, we've imported all the main entrypoints for all the workers.
|
|
188
|
+
# Now we basically just fork() out to create the workers we need.
|
|
189
|
+
# Because we're using fork(), all the workers get a clone of this launcher's
|
|
190
|
+
# memory space and don't need to repeat the work of loading the code!
|
|
191
|
+
# Instead of using fork() directly, we use the multiprocessing library,
|
|
192
|
+
# which uses fork() on Unix platforms.
|
|
193
|
+
for func, worker_args in zip(worker_functions, args_by_worker):
|
|
194
|
+
process = multiprocessing.Process(
|
|
195
|
+
target=_worker_entrypoint, args=(func, proxy_reactor, worker_args)
|
|
196
|
+
)
|
|
197
|
+
process.start()
|
|
198
|
+
processes.append(process)
|
|
199
|
+
|
|
200
|
+
# Be a good parent and wait for our children to die before exiting.
|
|
201
|
+
for process in processes:
|
|
202
|
+
process.join()
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
if __name__ == "__main__":
|
|
206
|
+
main()
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#
|
|
2
|
+
# This file is licensed under the Affero General Public License (AGPL) version 3.
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2023 New Vector, Ltd
|
|
5
|
+
#
|
|
6
|
+
# This program is free software: you can redistribute it and/or modify
|
|
7
|
+
# it under the terms of the GNU Affero General Public License as
|
|
8
|
+
# published by the Free Software Foundation, either version 3 of the
|
|
9
|
+
# License, or (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# See the GNU Affero General Public License for more details:
|
|
12
|
+
# <https://www.gnu.org/licenses/agpl-3.0.html>.
|
|
13
|
+
#
|
|
14
|
+
# Originally licensed under the Apache License, Version 2.0:
|
|
15
|
+
# <http://www.apache.org/licenses/LICENSE-2.0>.
|
|
16
|
+
#
|
|
17
|
+
# [This file includes modifications made by New Vector Limited]
|
|
18
|
+
#
|
|
19
|
+
#
|
|
20
|
+
|
|
21
|
+
from synapse.app.generic_worker import main as worker_main
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def main() -> None:
|
|
25
|
+
worker_main()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
if __name__ == "__main__":
|
|
29
|
+
main()
|