matrix-synapse 1.145.0rc2__cp310-abi3-manylinux_2_28_x86_64.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.

Files changed (1636) hide show
  1. AUTHORS.rst +51 -0
  2. CHANGES.md +1732 -0
  3. CONTRIBUTING.md +3 -0
  4. Cargo.lock +1923 -0
  5. Cargo.toml +6 -0
  6. INSTALL.md +7 -0
  7. LICENSE-AGPL-3.0 +661 -0
  8. LICENSE-COMMERCIAL +6 -0
  9. UPGRADE.rst +7 -0
  10. book.toml +47 -0
  11. changelog.d/.gitignore +1 -0
  12. demo/.gitignore +4 -0
  13. demo/clean.sh +22 -0
  14. demo/start.sh +173 -0
  15. demo/stop.sh +14 -0
  16. docs/.sample_config_header.yaml +12 -0
  17. docs/CAPTCHA_SETUP.md +37 -0
  18. docs/README.md +86 -0
  19. docs/SUMMARY.md +126 -0
  20. docs/admin_api/README.rst +13 -0
  21. docs/admin_api/account_validity.md +47 -0
  22. docs/admin_api/client_server_api_extensions.md +67 -0
  23. docs/admin_api/event_reports.md +185 -0
  24. docs/admin_api/experimental_features.md +52 -0
  25. docs/admin_api/fetch_event.md +53 -0
  26. docs/admin_api/media_admin_api.md +372 -0
  27. docs/admin_api/purge_history_api.md +77 -0
  28. docs/admin_api/register_api.md +92 -0
  29. docs/admin_api/room_membership.md +35 -0
  30. docs/admin_api/rooms.md +1190 -0
  31. docs/admin_api/scheduled_tasks.md +54 -0
  32. docs/admin_api/server_notices.md +48 -0
  33. docs/admin_api/statistics.md +132 -0
  34. docs/admin_api/user_admin_api.md +1602 -0
  35. docs/admin_api/version_api.md +23 -0
  36. docs/ancient_architecture_notes.md +81 -0
  37. docs/application_services.md +36 -0
  38. docs/architecture.md +65 -0
  39. docs/auth_chain_diff.dot +32 -0
  40. docs/auth_chain_diff.dot.png +0 -0
  41. docs/auth_chain_difference_algorithm.md +141 -0
  42. docs/changelogs/CHANGES-2019.md +1039 -0
  43. docs/changelogs/CHANGES-2020.md +2145 -0
  44. docs/changelogs/CHANGES-2021.md +2573 -0
  45. docs/changelogs/CHANGES-2022.md +2766 -0
  46. docs/changelogs/CHANGES-2023.md +2202 -0
  47. docs/changelogs/CHANGES-2024.md +1586 -0
  48. docs/changelogs/CHANGES-pre-1.0.md +3641 -0
  49. docs/changelogs/README.md +1 -0
  50. docs/code_style.md +119 -0
  51. docs/consent_tracking.md +197 -0
  52. docs/delegate.md +111 -0
  53. docs/deprecation_policy.md +89 -0
  54. docs/development/cas.md +64 -0
  55. docs/development/contributing_guide.md +554 -0
  56. docs/development/database_schema.md +404 -0
  57. docs/development/demo.md +42 -0
  58. docs/development/dependencies.md +326 -0
  59. docs/development/experimental_features.md +37 -0
  60. docs/development/git.md +148 -0
  61. docs/development/img/git/branches.jpg +0 -0
  62. docs/development/img/git/clean.png +0 -0
  63. docs/development/img/git/squash.png +0 -0
  64. docs/development/internal_documentation/README.md +12 -0
  65. docs/development/internal_documentation/release_notes_review_checklist.md +12 -0
  66. docs/development/releases.md +37 -0
  67. docs/development/reviews.md +41 -0
  68. docs/development/room-dag-concepts.md +115 -0
  69. docs/development/saml.md +40 -0
  70. docs/development/synapse_architecture/cancellation.md +392 -0
  71. docs/development/synapse_architecture/faster_joins.md +375 -0
  72. docs/development/synapse_architecture/streams.md +198 -0
  73. docs/element_logo_white_bg.svg +94 -0
  74. docs/favicon.png +0 -0
  75. docs/favicon.svg +58 -0
  76. docs/federate.md +67 -0
  77. docs/jwt.md +105 -0
  78. docs/log_contexts.md +566 -0
  79. docs/manhole.md +101 -0
  80. docs/media_repository.md +78 -0
  81. docs/message_retention_policies.md +207 -0
  82. docs/metrics-howto.md +315 -0
  83. docs/modules/account_data_callbacks.md +106 -0
  84. docs/modules/account_validity_callbacks.md +57 -0
  85. docs/modules/add_extra_fields_to_client_events_unsigned.md +32 -0
  86. docs/modules/background_update_controller_callbacks.md +71 -0
  87. docs/modules/index.md +53 -0
  88. docs/modules/media_repository_callbacks.md +131 -0
  89. docs/modules/password_auth_provider_callbacks.md +270 -0
  90. docs/modules/porting_legacy_module.md +20 -0
  91. docs/modules/presence_router_callbacks.md +112 -0
  92. docs/modules/ratelimit_callbacks.md +43 -0
  93. docs/modules/spam_checker_callbacks.md +517 -0
  94. docs/modules/third_party_rules_callbacks.md +350 -0
  95. docs/modules/writing_a_module.md +141 -0
  96. docs/openid.md +783 -0
  97. docs/opentracing.md +99 -0
  98. docs/other/running_synapse_on_single_board_computers.md +75 -0
  99. docs/password_auth_providers.md +129 -0
  100. docs/postgres.md +269 -0
  101. docs/presence_router_module.md +247 -0
  102. docs/privacy_policy_templates/en/1.0.html +26 -0
  103. docs/privacy_policy_templates/en/success.html +11 -0
  104. docs/replication.md +36 -0
  105. docs/reverse_proxy.md +327 -0
  106. docs/room_and_user_statistics.md +22 -0
  107. docs/sample_config.yaml +47 -0
  108. docs/sample_log_config.yaml +75 -0
  109. docs/server_notices.md +66 -0
  110. docs/setup/forward_proxy.md +89 -0
  111. docs/setup/installation.md +656 -0
  112. docs/setup/security.md +41 -0
  113. docs/setup/turn/coturn.md +197 -0
  114. docs/setup/turn/eturnal.md +170 -0
  115. docs/spam_checker.md +122 -0
  116. docs/sso_mapping_providers.md +208 -0
  117. docs/structured_logging.md +80 -0
  118. docs/synctl_workers.md +36 -0
  119. docs/systemd-with-workers/README.md +101 -0
  120. docs/systemd-with-workers/system/matrix-synapse-worker@.service +26 -0
  121. docs/systemd-with-workers/system/matrix-synapse.service +23 -0
  122. docs/systemd-with-workers/system/matrix-synapse.target +6 -0
  123. docs/systemd-with-workers/workers/background_worker.yaml +4 -0
  124. docs/systemd-with-workers/workers/event_persister.yaml +20 -0
  125. docs/systemd-with-workers/workers/federation_sender.yaml +4 -0
  126. docs/systemd-with-workers/workers/generic_worker.yaml +11 -0
  127. docs/systemd-with-workers/workers/media_worker.yaml +11 -0
  128. docs/systemd-with-workers/workers/pusher_worker.yaml +4 -0
  129. docs/tcp_replication.md +258 -0
  130. docs/templates.md +254 -0
  131. docs/turn-howto.md +168 -0
  132. docs/upgrade.md +2876 -0
  133. docs/usage/administration/README.md +7 -0
  134. docs/usage/administration/admin_api/README.md +47 -0
  135. docs/usage/administration/admin_api/background_updates.md +109 -0
  136. docs/usage/administration/admin_api/federation.md +212 -0
  137. docs/usage/administration/admin_api/registration_tokens.md +298 -0
  138. docs/usage/administration/admin_faq.md +294 -0
  139. docs/usage/administration/backups.md +125 -0
  140. docs/usage/administration/database_maintenance_tools.md +18 -0
  141. docs/usage/administration/monitoring/reporting_homeserver_usage_statistics.md +77 -0
  142. docs/usage/administration/monthly_active_users.md +84 -0
  143. docs/usage/administration/request_log.md +44 -0
  144. docs/usage/administration/state_groups.md +25 -0
  145. docs/usage/administration/understanding_synapse_through_grafana_graphs.md +83 -0
  146. docs/usage/administration/useful_sql_for_admins.md +216 -0
  147. docs/usage/configuration/README.md +4 -0
  148. docs/usage/configuration/config_documentation.md +4768 -0
  149. docs/usage/configuration/homeserver_sample_config.md +17 -0
  150. docs/usage/configuration/logging_sample_config.md +19 -0
  151. docs/usage/configuration/user_authentication/README.md +15 -0
  152. docs/usage/configuration/user_authentication/refresh_tokens.md +139 -0
  153. docs/usage/configuration/user_authentication/single_sign_on/README.md +5 -0
  154. docs/usage/configuration/user_authentication/single_sign_on/cas.md +8 -0
  155. docs/usage/configuration/user_authentication/single_sign_on/saml.md +8 -0
  156. docs/user_directory.md +130 -0
  157. docs/website_files/README.md +35 -0
  158. docs/website_files/indent-section-headers.css +7 -0
  159. docs/website_files/remove-nav-buttons.css +8 -0
  160. docs/website_files/table-of-contents.css +47 -0
  161. docs/website_files/table-of-contents.js +148 -0
  162. docs/website_files/theme/index.hbs +324 -0
  163. docs/website_files/version-picker.css +78 -0
  164. docs/website_files/version-picker.js +147 -0
  165. docs/website_files/version.js +1 -0
  166. docs/welcome_and_overview.md +67 -0
  167. docs/workers.md +897 -0
  168. matrix_synapse-1.145.0rc2.dist-info/METADATA +260 -0
  169. matrix_synapse-1.145.0rc2.dist-info/RECORD +1636 -0
  170. matrix_synapse-1.145.0rc2.dist-info/WHEEL +5 -0
  171. matrix_synapse-1.145.0rc2.dist-info/entry_points.txt +13 -0
  172. matrix_synapse-1.145.0rc2.dist-info/licenses/AUTHORS.rst +51 -0
  173. matrix_synapse-1.145.0rc2.dist-info/licenses/LICENSE-AGPL-3.0 +661 -0
  174. matrix_synapse-1.145.0rc2.dist-info/licenses/LICENSE-COMMERCIAL +6 -0
  175. mypy.ini +115 -0
  176. rust/Cargo.toml +63 -0
  177. rust/build.rs +45 -0
  178. scripts-dev/build_debian_packages.py +228 -0
  179. scripts-dev/check-newsfragment.sh +62 -0
  180. scripts-dev/check_line_terminators.sh +29 -0
  181. scripts-dev/check_locked_deps_have_sdists.py +64 -0
  182. scripts-dev/check_schema_delta.py +240 -0
  183. scripts-dev/complement.sh +332 -0
  184. scripts-dev/config-lint.sh +15 -0
  185. scripts-dev/database-save.sh +15 -0
  186. scripts-dev/docker_update_debian_changelog.sh +70 -0
  187. scripts-dev/dump_macaroon.py +25 -0
  188. scripts-dev/federation_client.py +428 -0
  189. scripts-dev/gen_config_documentation.py +510 -0
  190. scripts-dev/generate_sample_config.sh +28 -0
  191. scripts-dev/lint.sh +141 -0
  192. scripts-dev/make_full_schema.sh +310 -0
  193. scripts-dev/mypy_synapse_plugin.py +918 -0
  194. scripts-dev/next_github_number.sh +9 -0
  195. scripts-dev/release.py +986 -0
  196. scripts-dev/schema_versions.py +182 -0
  197. scripts-dev/sign_json.py +172 -0
  198. synapse/__init__.py +97 -0
  199. synapse/_scripts/__init__.py +0 -0
  200. synapse/_scripts/export_signing_key.py +109 -0
  201. synapse/_scripts/generate_config.py +83 -0
  202. synapse/_scripts/generate_log_config.py +56 -0
  203. synapse/_scripts/generate_signing_key.py +55 -0
  204. synapse/_scripts/generate_workers_map.py +318 -0
  205. synapse/_scripts/hash_password.py +95 -0
  206. synapse/_scripts/move_remote_media_to_new_store.py +128 -0
  207. synapse/_scripts/register_new_matrix_user.py +402 -0
  208. synapse/_scripts/review_recent_signups.py +212 -0
  209. synapse/_scripts/synapse_port_db.py +1604 -0
  210. synapse/_scripts/synctl.py +365 -0
  211. synapse/_scripts/update_synapse_database.py +130 -0
  212. synapse/api/__init__.py +20 -0
  213. synapse/api/auth/__init__.py +207 -0
  214. synapse/api/auth/base.py +406 -0
  215. synapse/api/auth/internal.py +299 -0
  216. synapse/api/auth/mas.py +436 -0
  217. synapse/api/auth/msc3861_delegated.py +617 -0
  218. synapse/api/auth_blocking.py +144 -0
  219. synapse/api/constants.py +379 -0
  220. synapse/api/errors.py +913 -0
  221. synapse/api/filtering.py +537 -0
  222. synapse/api/presence.py +102 -0
  223. synapse/api/ratelimiting.py +481 -0
  224. synapse/api/room_versions.py +535 -0
  225. synapse/api/urls.py +118 -0
  226. synapse/app/__init__.py +62 -0
  227. synapse/app/_base.py +906 -0
  228. synapse/app/admin_cmd.py +388 -0
  229. synapse/app/appservice.py +30 -0
  230. synapse/app/client_reader.py +30 -0
  231. synapse/app/complement_fork_starter.py +206 -0
  232. synapse/app/event_creator.py +29 -0
  233. synapse/app/federation_reader.py +30 -0
  234. synapse/app/federation_sender.py +30 -0
  235. synapse/app/frontend_proxy.py +30 -0
  236. synapse/app/generic_worker.py +475 -0
  237. synapse/app/homeserver.py +505 -0
  238. synapse/app/media_repository.py +30 -0
  239. synapse/app/phone_stats_home.py +292 -0
  240. synapse/app/pusher.py +30 -0
  241. synapse/app/synchrotron.py +30 -0
  242. synapse/app/user_dir.py +31 -0
  243. synapse/appservice/__init__.py +458 -0
  244. synapse/appservice/api.py +567 -0
  245. synapse/appservice/scheduler.py +565 -0
  246. synapse/config/__init__.py +27 -0
  247. synapse/config/__main__.py +62 -0
  248. synapse/config/_base.py +1154 -0
  249. synapse/config/_base.pyi +216 -0
  250. synapse/config/_util.py +99 -0
  251. synapse/config/account_validity.py +116 -0
  252. synapse/config/api.py +141 -0
  253. synapse/config/appservice.py +210 -0
  254. synapse/config/auth.py +80 -0
  255. synapse/config/auto_accept_invites.py +43 -0
  256. synapse/config/background_updates.py +44 -0
  257. synapse/config/cache.py +231 -0
  258. synapse/config/captcha.py +90 -0
  259. synapse/config/cas.py +116 -0
  260. synapse/config/consent.py +73 -0
  261. synapse/config/database.py +184 -0
  262. synapse/config/emailconfig.py +367 -0
  263. synapse/config/experimental.py +601 -0
  264. synapse/config/federation.py +114 -0
  265. synapse/config/homeserver.py +141 -0
  266. synapse/config/jwt.py +55 -0
  267. synapse/config/key.py +447 -0
  268. synapse/config/logger.py +390 -0
  269. synapse/config/mas.py +192 -0
  270. synapse/config/matrixrtc.py +66 -0
  271. synapse/config/metrics.py +93 -0
  272. synapse/config/modules.py +40 -0
  273. synapse/config/oembed.py +185 -0
  274. synapse/config/oidc.py +509 -0
  275. synapse/config/password_auth_providers.py +82 -0
  276. synapse/config/push.py +64 -0
  277. synapse/config/ratelimiting.py +260 -0
  278. synapse/config/redis.py +74 -0
  279. synapse/config/registration.py +296 -0
  280. synapse/config/repository.py +311 -0
  281. synapse/config/retention.py +162 -0
  282. synapse/config/room.py +88 -0
  283. synapse/config/room_directory.py +165 -0
  284. synapse/config/saml2.py +251 -0
  285. synapse/config/server.py +1139 -0
  286. synapse/config/server_notices.py +84 -0
  287. synapse/config/spam_checker.py +66 -0
  288. synapse/config/sso.py +121 -0
  289. synapse/config/stats.py +54 -0
  290. synapse/config/third_party_event_rules.py +40 -0
  291. synapse/config/tls.py +192 -0
  292. synapse/config/tracer.py +71 -0
  293. synapse/config/user_directory.py +47 -0
  294. synapse/config/user_types.py +42 -0
  295. synapse/config/voip.py +59 -0
  296. synapse/config/workers.py +642 -0
  297. synapse/crypto/__init__.py +20 -0
  298. synapse/crypto/context_factory.py +278 -0
  299. synapse/crypto/event_signing.py +194 -0
  300. synapse/crypto/keyring.py +980 -0
  301. synapse/event_auth.py +1266 -0
  302. synapse/events/__init__.py +667 -0
  303. synapse/events/auto_accept_invites.py +216 -0
  304. synapse/events/builder.py +387 -0
  305. synapse/events/presence_router.py +243 -0
  306. synapse/events/snapshot.py +559 -0
  307. synapse/events/utils.py +924 -0
  308. synapse/events/validator.py +305 -0
  309. synapse/federation/__init__.py +22 -0
  310. synapse/federation/federation_base.py +382 -0
  311. synapse/federation/federation_client.py +2133 -0
  312. synapse/federation/federation_server.py +1543 -0
  313. synapse/federation/persistence.py +70 -0
  314. synapse/federation/send_queue.py +532 -0
  315. synapse/federation/sender/__init__.py +1165 -0
  316. synapse/federation/sender/per_destination_queue.py +886 -0
  317. synapse/federation/sender/transaction_manager.py +210 -0
  318. synapse/federation/transport/__init__.py +28 -0
  319. synapse/federation/transport/client.py +1199 -0
  320. synapse/federation/transport/server/__init__.py +334 -0
  321. synapse/federation/transport/server/_base.py +429 -0
  322. synapse/federation/transport/server/federation.py +910 -0
  323. synapse/federation/units.py +133 -0
  324. synapse/handlers/__init__.py +20 -0
  325. synapse/handlers/account.py +162 -0
  326. synapse/handlers/account_data.py +360 -0
  327. synapse/handlers/account_validity.py +362 -0
  328. synapse/handlers/admin.py +615 -0
  329. synapse/handlers/appservice.py +989 -0
  330. synapse/handlers/auth.py +2482 -0
  331. synapse/handlers/cas.py +413 -0
  332. synapse/handlers/deactivate_account.py +363 -0
  333. synapse/handlers/delayed_events.py +607 -0
  334. synapse/handlers/device.py +1869 -0
  335. synapse/handlers/devicemessage.py +399 -0
  336. synapse/handlers/directory.py +545 -0
  337. synapse/handlers/e2e_keys.py +1835 -0
  338. synapse/handlers/e2e_room_keys.py +455 -0
  339. synapse/handlers/event_auth.py +390 -0
  340. synapse/handlers/events.py +203 -0
  341. synapse/handlers/federation.py +2042 -0
  342. synapse/handlers/federation_event.py +2420 -0
  343. synapse/handlers/identity.py +812 -0
  344. synapse/handlers/initial_sync.py +528 -0
  345. synapse/handlers/jwt.py +120 -0
  346. synapse/handlers/message.py +2357 -0
  347. synapse/handlers/oidc.py +1801 -0
  348. synapse/handlers/pagination.py +811 -0
  349. synapse/handlers/password_policy.py +102 -0
  350. synapse/handlers/presence.py +2634 -0
  351. synapse/handlers/profile.py +656 -0
  352. synapse/handlers/push_rules.py +164 -0
  353. synapse/handlers/read_marker.py +79 -0
  354. synapse/handlers/receipts.py +351 -0
  355. synapse/handlers/register.py +1059 -0
  356. synapse/handlers/relations.py +623 -0
  357. synapse/handlers/reports.py +98 -0
  358. synapse/handlers/room.py +2449 -0
  359. synapse/handlers/room_list.py +632 -0
  360. synapse/handlers/room_member.py +2366 -0
  361. synapse/handlers/room_member_worker.py +146 -0
  362. synapse/handlers/room_policy.py +186 -0
  363. synapse/handlers/room_summary.py +1057 -0
  364. synapse/handlers/saml.py +524 -0
  365. synapse/handlers/search.py +723 -0
  366. synapse/handlers/send_email.py +209 -0
  367. synapse/handlers/set_password.py +71 -0
  368. synapse/handlers/sliding_sync/__init__.py +1961 -0
  369. synapse/handlers/sliding_sync/extensions.py +969 -0
  370. synapse/handlers/sliding_sync/room_lists.py +2317 -0
  371. synapse/handlers/sliding_sync/store.py +126 -0
  372. synapse/handlers/sso.py +1291 -0
  373. synapse/handlers/state_deltas.py +82 -0
  374. synapse/handlers/stats.py +322 -0
  375. synapse/handlers/sync.py +3096 -0
  376. synapse/handlers/thread_subscriptions.py +190 -0
  377. synapse/handlers/typing.py +612 -0
  378. synapse/handlers/ui_auth/__init__.py +48 -0
  379. synapse/handlers/ui_auth/checkers.py +332 -0
  380. synapse/handlers/user_directory.py +786 -0
  381. synapse/handlers/worker_lock.py +371 -0
  382. synapse/http/__init__.py +105 -0
  383. synapse/http/additional_resource.py +62 -0
  384. synapse/http/client.py +1377 -0
  385. synapse/http/connectproxyclient.py +316 -0
  386. synapse/http/federation/__init__.py +19 -0
  387. synapse/http/federation/matrix_federation_agent.py +490 -0
  388. synapse/http/federation/srv_resolver.py +196 -0
  389. synapse/http/federation/well_known_resolver.py +368 -0
  390. synapse/http/matrixfederationclient.py +1874 -0
  391. synapse/http/proxy.py +290 -0
  392. synapse/http/proxyagent.py +497 -0
  393. synapse/http/replicationagent.py +203 -0
  394. synapse/http/request_metrics.py +309 -0
  395. synapse/http/server.py +1111 -0
  396. synapse/http/servlet.py +1018 -0
  397. synapse/http/site.py +952 -0
  398. synapse/http/types.py +27 -0
  399. synapse/logging/__init__.py +31 -0
  400. synapse/logging/_remote.py +261 -0
  401. synapse/logging/_terse_json.py +95 -0
  402. synapse/logging/context.py +1209 -0
  403. synapse/logging/formatter.py +62 -0
  404. synapse/logging/handlers.py +99 -0
  405. synapse/logging/loggers.py +25 -0
  406. synapse/logging/opentracing.py +1132 -0
  407. synapse/logging/scopecontextmanager.py +160 -0
  408. synapse/media/_base.py +831 -0
  409. synapse/media/filepath.py +417 -0
  410. synapse/media/media_repository.py +1595 -0
  411. synapse/media/media_storage.py +703 -0
  412. synapse/media/oembed.py +277 -0
  413. synapse/media/preview_html.py +556 -0
  414. synapse/media/storage_provider.py +195 -0
  415. synapse/media/thumbnailer.py +833 -0
  416. synapse/media/url_previewer.py +884 -0
  417. synapse/metrics/__init__.py +748 -0
  418. synapse/metrics/_gc.py +219 -0
  419. synapse/metrics/_reactor_metrics.py +171 -0
  420. synapse/metrics/_types.py +38 -0
  421. synapse/metrics/background_process_metrics.py +555 -0
  422. synapse/metrics/common_usage_metrics.py +95 -0
  423. synapse/metrics/jemalloc.py +248 -0
  424. synapse/module_api/__init__.py +2131 -0
  425. synapse/module_api/callbacks/__init__.py +50 -0
  426. synapse/module_api/callbacks/account_validity_callbacks.py +106 -0
  427. synapse/module_api/callbacks/media_repository_callbacks.py +157 -0
  428. synapse/module_api/callbacks/ratelimit_callbacks.py +78 -0
  429. synapse/module_api/callbacks/spamchecker_callbacks.py +991 -0
  430. synapse/module_api/callbacks/third_party_event_rules_callbacks.py +592 -0
  431. synapse/module_api/errors.py +42 -0
  432. synapse/notifier.py +969 -0
  433. synapse/push/__init__.py +212 -0
  434. synapse/push/bulk_push_rule_evaluator.py +635 -0
  435. synapse/push/clientformat.py +126 -0
  436. synapse/push/emailpusher.py +334 -0
  437. synapse/push/httppusher.py +565 -0
  438. synapse/push/mailer.py +1009 -0
  439. synapse/push/presentable_names.py +216 -0
  440. synapse/push/push_tools.py +114 -0
  441. synapse/push/push_types.py +141 -0
  442. synapse/push/pusher.py +87 -0
  443. synapse/push/pusherpool.py +501 -0
  444. synapse/push/rulekinds.py +33 -0
  445. synapse/py.typed +0 -0
  446. synapse/replication/__init__.py +20 -0
  447. synapse/replication/http/__init__.py +68 -0
  448. synapse/replication/http/_base.py +469 -0
  449. synapse/replication/http/account_data.py +297 -0
  450. synapse/replication/http/deactivate_account.py +81 -0
  451. synapse/replication/http/delayed_events.py +62 -0
  452. synapse/replication/http/devices.py +254 -0
  453. synapse/replication/http/federation.py +334 -0
  454. synapse/replication/http/login.py +106 -0
  455. synapse/replication/http/membership.py +364 -0
  456. synapse/replication/http/presence.py +133 -0
  457. synapse/replication/http/push.py +156 -0
  458. synapse/replication/http/register.py +172 -0
  459. synapse/replication/http/send_events.py +182 -0
  460. synapse/replication/http/state.py +82 -0
  461. synapse/replication/http/streams.py +101 -0
  462. synapse/replication/tcp/__init__.py +56 -0
  463. synapse/replication/tcp/client.py +553 -0
  464. synapse/replication/tcp/commands.py +569 -0
  465. synapse/replication/tcp/context.py +41 -0
  466. synapse/replication/tcp/external_cache.py +156 -0
  467. synapse/replication/tcp/handler.py +922 -0
  468. synapse/replication/tcp/protocol.py +611 -0
  469. synapse/replication/tcp/redis.py +510 -0
  470. synapse/replication/tcp/resource.py +349 -0
  471. synapse/replication/tcp/streams/__init__.py +96 -0
  472. synapse/replication/tcp/streams/_base.py +765 -0
  473. synapse/replication/tcp/streams/events.py +287 -0
  474. synapse/replication/tcp/streams/federation.py +92 -0
  475. synapse/replication/tcp/streams/partial_state.py +80 -0
  476. synapse/res/providers.json +29 -0
  477. synapse/res/templates/_base.html +29 -0
  478. synapse/res/templates/account_previously_renewed.html +6 -0
  479. synapse/res/templates/account_renewed.html +6 -0
  480. synapse/res/templates/add_threepid.html +8 -0
  481. synapse/res/templates/add_threepid.txt +6 -0
  482. synapse/res/templates/add_threepid_failure.html +7 -0
  483. synapse/res/templates/add_threepid_success.html +6 -0
  484. synapse/res/templates/already_in_use.html +12 -0
  485. synapse/res/templates/already_in_use.txt +10 -0
  486. synapse/res/templates/auth_success.html +21 -0
  487. synapse/res/templates/invalid_token.html +6 -0
  488. synapse/res/templates/mail-Element.css +7 -0
  489. synapse/res/templates/mail-Vector.css +7 -0
  490. synapse/res/templates/mail-expiry.css +4 -0
  491. synapse/res/templates/mail.css +156 -0
  492. synapse/res/templates/notice_expiry.html +46 -0
  493. synapse/res/templates/notice_expiry.txt +7 -0
  494. synapse/res/templates/notif.html +51 -0
  495. synapse/res/templates/notif.txt +22 -0
  496. synapse/res/templates/notif_mail.html +59 -0
  497. synapse/res/templates/notif_mail.txt +10 -0
  498. synapse/res/templates/password_reset.html +10 -0
  499. synapse/res/templates/password_reset.txt +7 -0
  500. synapse/res/templates/password_reset_confirmation.html +15 -0
  501. synapse/res/templates/password_reset_failure.html +7 -0
  502. synapse/res/templates/password_reset_success.html +6 -0
  503. synapse/res/templates/recaptcha.html +42 -0
  504. synapse/res/templates/registration.html +12 -0
  505. synapse/res/templates/registration.txt +10 -0
  506. synapse/res/templates/registration_failure.html +6 -0
  507. synapse/res/templates/registration_success.html +6 -0
  508. synapse/res/templates/registration_token.html +18 -0
  509. synapse/res/templates/room.html +33 -0
  510. synapse/res/templates/room.txt +9 -0
  511. synapse/res/templates/sso.css +129 -0
  512. synapse/res/templates/sso_account_deactivated.html +25 -0
  513. synapse/res/templates/sso_auth_account_details.html +186 -0
  514. synapse/res/templates/sso_auth_account_details.js +116 -0
  515. synapse/res/templates/sso_auth_bad_user.html +26 -0
  516. synapse/res/templates/sso_auth_confirm.html +27 -0
  517. synapse/res/templates/sso_auth_success.html +26 -0
  518. synapse/res/templates/sso_error.html +71 -0
  519. synapse/res/templates/sso_footer.html +19 -0
  520. synapse/res/templates/sso_login_idp_picker.html +60 -0
  521. synapse/res/templates/sso_new_user_consent.html +30 -0
  522. synapse/res/templates/sso_partial_profile.html +19 -0
  523. synapse/res/templates/sso_redirect_confirm.html +39 -0
  524. synapse/res/templates/style.css +33 -0
  525. synapse/res/templates/terms.html +27 -0
  526. synapse/rest/__init__.py +197 -0
  527. synapse/rest/admin/__init__.py +395 -0
  528. synapse/rest/admin/_base.py +72 -0
  529. synapse/rest/admin/background_updates.py +171 -0
  530. synapse/rest/admin/devices.py +221 -0
  531. synapse/rest/admin/event_reports.py +173 -0
  532. synapse/rest/admin/events.py +69 -0
  533. synapse/rest/admin/experimental_features.py +137 -0
  534. synapse/rest/admin/federation.py +243 -0
  535. synapse/rest/admin/media.py +540 -0
  536. synapse/rest/admin/registration_tokens.py +358 -0
  537. synapse/rest/admin/rooms.py +1092 -0
  538. synapse/rest/admin/scheduled_tasks.py +70 -0
  539. synapse/rest/admin/server_notice_servlet.py +132 -0
  540. synapse/rest/admin/statistics.py +132 -0
  541. synapse/rest/admin/username_available.py +58 -0
  542. synapse/rest/admin/users.py +1634 -0
  543. synapse/rest/client/__init__.py +20 -0
  544. synapse/rest/client/_base.py +113 -0
  545. synapse/rest/client/account.py +937 -0
  546. synapse/rest/client/account_data.py +319 -0
  547. synapse/rest/client/account_validity.py +103 -0
  548. synapse/rest/client/appservice_ping.py +125 -0
  549. synapse/rest/client/auth.py +218 -0
  550. synapse/rest/client/auth_metadata.py +122 -0
  551. synapse/rest/client/capabilities.py +121 -0
  552. synapse/rest/client/delayed_events.py +165 -0
  553. synapse/rest/client/devices.py +587 -0
  554. synapse/rest/client/directory.py +211 -0
  555. synapse/rest/client/events.py +116 -0
  556. synapse/rest/client/filter.py +112 -0
  557. synapse/rest/client/initial_sync.py +65 -0
  558. synapse/rest/client/keys.py +678 -0
  559. synapse/rest/client/knock.py +104 -0
  560. synapse/rest/client/login.py +750 -0
  561. synapse/rest/client/login_token_request.py +127 -0
  562. synapse/rest/client/logout.py +93 -0
  563. synapse/rest/client/matrixrtc.py +52 -0
  564. synapse/rest/client/media.py +307 -0
  565. synapse/rest/client/mutual_rooms.py +145 -0
  566. synapse/rest/client/notifications.py +137 -0
  567. synapse/rest/client/openid.py +109 -0
  568. synapse/rest/client/password_policy.py +69 -0
  569. synapse/rest/client/presence.py +131 -0
  570. synapse/rest/client/profile.py +291 -0
  571. synapse/rest/client/push_rule.py +331 -0
  572. synapse/rest/client/pusher.py +181 -0
  573. synapse/rest/client/read_marker.py +104 -0
  574. synapse/rest/client/receipts.py +165 -0
  575. synapse/rest/client/register.py +1072 -0
  576. synapse/rest/client/relations.py +138 -0
  577. synapse/rest/client/rendezvous.py +76 -0
  578. synapse/rest/client/reporting.py +207 -0
  579. synapse/rest/client/room.py +1763 -0
  580. synapse/rest/client/room_keys.py +426 -0
  581. synapse/rest/client/room_upgrade_rest_servlet.py +112 -0
  582. synapse/rest/client/sendtodevice.py +85 -0
  583. synapse/rest/client/sync.py +1131 -0
  584. synapse/rest/client/tags.py +129 -0
  585. synapse/rest/client/thirdparty.py +130 -0
  586. synapse/rest/client/thread_subscriptions.py +247 -0
  587. synapse/rest/client/tokenrefresh.py +52 -0
  588. synapse/rest/client/transactions.py +150 -0
  589. synapse/rest/client/user_directory.py +99 -0
  590. synapse/rest/client/versions.py +193 -0
  591. synapse/rest/client/voip.py +88 -0
  592. synapse/rest/consent/__init__.py +0 -0
  593. synapse/rest/consent/consent_resource.py +210 -0
  594. synapse/rest/health.py +38 -0
  595. synapse/rest/key/__init__.py +20 -0
  596. synapse/rest/key/v2/__init__.py +40 -0
  597. synapse/rest/key/v2/local_key_resource.py +125 -0
  598. synapse/rest/key/v2/remote_key_resource.py +302 -0
  599. synapse/rest/media/__init__.py +0 -0
  600. synapse/rest/media/config_resource.py +53 -0
  601. synapse/rest/media/create_resource.py +90 -0
  602. synapse/rest/media/download_resource.py +110 -0
  603. synapse/rest/media/media_repository_resource.py +113 -0
  604. synapse/rest/media/preview_url_resource.py +77 -0
  605. synapse/rest/media/thumbnail_resource.py +142 -0
  606. synapse/rest/media/upload_resource.py +187 -0
  607. synapse/rest/media/v1/__init__.py +39 -0
  608. synapse/rest/media/v1/_base.py +23 -0
  609. synapse/rest/media/v1/media_storage.py +23 -0
  610. synapse/rest/media/v1/storage_provider.py +23 -0
  611. synapse/rest/synapse/__init__.py +20 -0
  612. synapse/rest/synapse/client/__init__.py +93 -0
  613. synapse/rest/synapse/client/federation_whitelist.py +66 -0
  614. synapse/rest/synapse/client/jwks.py +77 -0
  615. synapse/rest/synapse/client/new_user_consent.py +115 -0
  616. synapse/rest/synapse/client/oidc/__init__.py +45 -0
  617. synapse/rest/synapse/client/oidc/backchannel_logout_resource.py +42 -0
  618. synapse/rest/synapse/client/oidc/callback_resource.py +48 -0
  619. synapse/rest/synapse/client/password_reset.py +129 -0
  620. synapse/rest/synapse/client/pick_idp.py +107 -0
  621. synapse/rest/synapse/client/pick_username.py +153 -0
  622. synapse/rest/synapse/client/rendezvous.py +58 -0
  623. synapse/rest/synapse/client/saml2/__init__.py +42 -0
  624. synapse/rest/synapse/client/saml2/metadata_resource.py +46 -0
  625. synapse/rest/synapse/client/saml2/response_resource.py +52 -0
  626. synapse/rest/synapse/client/sso_register.py +56 -0
  627. synapse/rest/synapse/client/unsubscribe.py +88 -0
  628. synapse/rest/synapse/mas/__init__.py +71 -0
  629. synapse/rest/synapse/mas/_base.py +55 -0
  630. synapse/rest/synapse/mas/devices.py +239 -0
  631. synapse/rest/synapse/mas/users.py +469 -0
  632. synapse/rest/well_known.py +148 -0
  633. synapse/server.py +1279 -0
  634. synapse/server_notices/__init__.py +0 -0
  635. synapse/server_notices/consent_server_notices.py +136 -0
  636. synapse/server_notices/resource_limits_server_notices.py +215 -0
  637. synapse/server_notices/server_notices_manager.py +388 -0
  638. synapse/server_notices/server_notices_sender.py +67 -0
  639. synapse/server_notices/worker_server_notices_sender.py +46 -0
  640. synapse/spam_checker_api/__init__.py +31 -0
  641. synapse/state/__init__.py +1023 -0
  642. synapse/state/v1.py +369 -0
  643. synapse/state/v2.py +985 -0
  644. synapse/static/client/login/index.html +47 -0
  645. synapse/static/client/login/js/jquery-3.4.1.min.js +2 -0
  646. synapse/static/client/login/js/login.js +291 -0
  647. synapse/static/client/login/spinner.gif +0 -0
  648. synapse/static/client/login/style.css +79 -0
  649. synapse/static/index.html +63 -0
  650. synapse/storage/__init__.py +43 -0
  651. synapse/storage/_base.py +245 -0
  652. synapse/storage/admin_client_config.py +25 -0
  653. synapse/storage/background_updates.py +1189 -0
  654. synapse/storage/controllers/__init__.py +57 -0
  655. synapse/storage/controllers/persist_events.py +1237 -0
  656. synapse/storage/controllers/purge_events.py +456 -0
  657. synapse/storage/controllers/state.py +950 -0
  658. synapse/storage/controllers/stats.py +119 -0
  659. synapse/storage/database.py +2720 -0
  660. synapse/storage/databases/__init__.py +175 -0
  661. synapse/storage/databases/main/__init__.py +420 -0
  662. synapse/storage/databases/main/account_data.py +1073 -0
  663. synapse/storage/databases/main/appservice.py +473 -0
  664. synapse/storage/databases/main/cache.py +912 -0
  665. synapse/storage/databases/main/censor_events.py +226 -0
  666. synapse/storage/databases/main/client_ips.py +816 -0
  667. synapse/storage/databases/main/delayed_events.py +577 -0
  668. synapse/storage/databases/main/deviceinbox.py +1272 -0
  669. synapse/storage/databases/main/devices.py +2579 -0
  670. synapse/storage/databases/main/directory.py +212 -0
  671. synapse/storage/databases/main/e2e_room_keys.py +689 -0
  672. synapse/storage/databases/main/end_to_end_keys.py +1894 -0
  673. synapse/storage/databases/main/event_federation.py +2511 -0
  674. synapse/storage/databases/main/event_push_actions.py +1936 -0
  675. synapse/storage/databases/main/events.py +3765 -0
  676. synapse/storage/databases/main/events_bg_updates.py +2910 -0
  677. synapse/storage/databases/main/events_forward_extremities.py +126 -0
  678. synapse/storage/databases/main/events_worker.py +2787 -0
  679. synapse/storage/databases/main/experimental_features.py +130 -0
  680. synapse/storage/databases/main/filtering.py +231 -0
  681. synapse/storage/databases/main/keys.py +291 -0
  682. synapse/storage/databases/main/lock.py +554 -0
  683. synapse/storage/databases/main/media_repository.py +1068 -0
  684. synapse/storage/databases/main/metrics.py +461 -0
  685. synapse/storage/databases/main/monthly_active_users.py +443 -0
  686. synapse/storage/databases/main/openid.py +60 -0
  687. synapse/storage/databases/main/presence.py +509 -0
  688. synapse/storage/databases/main/profile.py +539 -0
  689. synapse/storage/databases/main/purge_events.py +521 -0
  690. synapse/storage/databases/main/push_rule.py +970 -0
  691. synapse/storage/databases/main/pusher.py +793 -0
  692. synapse/storage/databases/main/receipts.py +1341 -0
  693. synapse/storage/databases/main/registration.py +3071 -0
  694. synapse/storage/databases/main/rejections.py +37 -0
  695. synapse/storage/databases/main/relations.py +1116 -0
  696. synapse/storage/databases/main/room.py +2779 -0
  697. synapse/storage/databases/main/roommember.py +2132 -0
  698. synapse/storage/databases/main/search.py +939 -0
  699. synapse/storage/databases/main/session.py +152 -0
  700. synapse/storage/databases/main/signatures.py +94 -0
  701. synapse/storage/databases/main/sliding_sync.py +842 -0
  702. synapse/storage/databases/main/state.py +1002 -0
  703. synapse/storage/databases/main/state_deltas.py +360 -0
  704. synapse/storage/databases/main/stats.py +789 -0
  705. synapse/storage/databases/main/stream.py +2589 -0
  706. synapse/storage/databases/main/tags.py +360 -0
  707. synapse/storage/databases/main/task_scheduler.py +225 -0
  708. synapse/storage/databases/main/thread_subscriptions.py +589 -0
  709. synapse/storage/databases/main/transactions.py +676 -0
  710. synapse/storage/databases/main/ui_auth.py +420 -0
  711. synapse/storage/databases/main/user_directory.py +1330 -0
  712. synapse/storage/databases/main/user_erasure_store.py +117 -0
  713. synapse/storage/databases/state/__init__.py +22 -0
  714. synapse/storage/databases/state/bg_updates.py +497 -0
  715. synapse/storage/databases/state/deletion.py +557 -0
  716. synapse/storage/databases/state/store.py +948 -0
  717. synapse/storage/engines/__init__.py +70 -0
  718. synapse/storage/engines/_base.py +154 -0
  719. synapse/storage/engines/postgres.py +261 -0
  720. synapse/storage/engines/sqlite.py +199 -0
  721. synapse/storage/invite_rule.py +152 -0
  722. synapse/storage/keys.py +40 -0
  723. synapse/storage/prepare_database.py +730 -0
  724. synapse/storage/push_rule.py +28 -0
  725. synapse/storage/roommember.py +88 -0
  726. synapse/storage/schema/README.md +4 -0
  727. synapse/storage/schema/__init__.py +186 -0
  728. synapse/storage/schema/common/delta/25/00background_updates.sql +40 -0
  729. synapse/storage/schema/common/delta/35/00background_updates_add_col.sql +36 -0
  730. synapse/storage/schema/common/delta/58/00background_update_ordering.sql +38 -0
  731. synapse/storage/schema/common/full_schemas/72/full.sql.postgres +8 -0
  732. synapse/storage/schema/common/full_schemas/72/full.sql.sqlite +6 -0
  733. synapse/storage/schema/common/schema_version.sql +60 -0
  734. synapse/storage/schema/main/delta/12/v12.sql +82 -0
  735. synapse/storage/schema/main/delta/13/v13.sql +38 -0
  736. synapse/storage/schema/main/delta/14/v14.sql +42 -0
  737. synapse/storage/schema/main/delta/15/appservice_txns.sql +50 -0
  738. synapse/storage/schema/main/delta/15/presence_indices.sql +2 -0
  739. synapse/storage/schema/main/delta/15/v15.sql +24 -0
  740. synapse/storage/schema/main/delta/16/events_order_index.sql +4 -0
  741. synapse/storage/schema/main/delta/16/remote_media_cache_index.sql +2 -0
  742. synapse/storage/schema/main/delta/16/remove_duplicates.sql +9 -0
  743. synapse/storage/schema/main/delta/16/room_alias_index.sql +3 -0
  744. synapse/storage/schema/main/delta/16/unique_constraints.sql +72 -0
  745. synapse/storage/schema/main/delta/16/users.sql +56 -0
  746. synapse/storage/schema/main/delta/17/drop_indexes.sql +37 -0
  747. synapse/storage/schema/main/delta/17/server_keys.sql +43 -0
  748. synapse/storage/schema/main/delta/17/user_threepids.sql +9 -0
  749. synapse/storage/schema/main/delta/18/server_keys_bigger_ints.sql +51 -0
  750. synapse/storage/schema/main/delta/19/event_index.sql +38 -0
  751. synapse/storage/schema/main/delta/20/dummy.sql +1 -0
  752. synapse/storage/schema/main/delta/20/pushers.py +93 -0
  753. synapse/storage/schema/main/delta/21/end_to_end_keys.sql +53 -0
  754. synapse/storage/schema/main/delta/21/receipts.sql +57 -0
  755. synapse/storage/schema/main/delta/22/receipts_index.sql +41 -0
  756. synapse/storage/schema/main/delta/22/user_threepids_unique.sql +19 -0
  757. synapse/storage/schema/main/delta/24/stats_reporting.sql +37 -0
  758. synapse/storage/schema/main/delta/25/fts.py +81 -0
  759. synapse/storage/schema/main/delta/25/guest_access.sql +44 -0
  760. synapse/storage/schema/main/delta/25/history_visibility.sql +44 -0
  761. synapse/storage/schema/main/delta/25/tags.sql +57 -0
  762. synapse/storage/schema/main/delta/26/account_data.sql +36 -0
  763. synapse/storage/schema/main/delta/27/account_data.sql +55 -0
  764. synapse/storage/schema/main/delta/27/forgotten_memberships.sql +45 -0
  765. synapse/storage/schema/main/delta/27/ts.py +61 -0
  766. synapse/storage/schema/main/delta/28/event_push_actions.sql +46 -0
  767. synapse/storage/schema/main/delta/28/events_room_stream.sql +39 -0
  768. synapse/storage/schema/main/delta/28/public_roms_index.sql +39 -0
  769. synapse/storage/schema/main/delta/28/receipts_user_id_index.sql +41 -0
  770. synapse/storage/schema/main/delta/28/upgrade_times.sql +40 -0
  771. synapse/storage/schema/main/delta/28/users_is_guest.sql +41 -0
  772. synapse/storage/schema/main/delta/29/push_actions.sql +54 -0
  773. synapse/storage/schema/main/delta/30/alias_creator.sql +35 -0
  774. synapse/storage/schema/main/delta/30/as_users.py +82 -0
  775. synapse/storage/schema/main/delta/30/deleted_pushers.sql +44 -0
  776. synapse/storage/schema/main/delta/30/presence_stream.sql +49 -0
  777. synapse/storage/schema/main/delta/30/public_rooms.sql +42 -0
  778. synapse/storage/schema/main/delta/30/push_rule_stream.sql +57 -0
  779. synapse/storage/schema/main/delta/30/threepid_guest_access_tokens.sql +43 -0
  780. synapse/storage/schema/main/delta/31/invites.sql +61 -0
  781. synapse/storage/schema/main/delta/31/local_media_repository_url_cache.sql +46 -0
  782. synapse/storage/schema/main/delta/31/pushers_0.py +92 -0
  783. synapse/storage/schema/main/delta/31/pushers_index.sql +41 -0
  784. synapse/storage/schema/main/delta/31/search_update.py +65 -0
  785. synapse/storage/schema/main/delta/32/events.sql +35 -0
  786. synapse/storage/schema/main/delta/32/openid.sql +9 -0
  787. synapse/storage/schema/main/delta/32/pusher_throttle.sql +42 -0
  788. synapse/storage/schema/main/delta/32/remove_indices.sql +52 -0
  789. synapse/storage/schema/main/delta/32/reports.sql +44 -0
  790. synapse/storage/schema/main/delta/33/access_tokens_device_index.sql +36 -0
  791. synapse/storage/schema/main/delta/33/devices.sql +40 -0
  792. synapse/storage/schema/main/delta/33/devices_for_e2e_keys.sql +38 -0
  793. synapse/storage/schema/main/delta/33/devices_for_e2e_keys_clear_unknown_device.sql +39 -0
  794. synapse/storage/schema/main/delta/33/event_fields.py +61 -0
  795. synapse/storage/schema/main/delta/33/remote_media_ts.py +43 -0
  796. synapse/storage/schema/main/delta/33/user_ips_index.sql +36 -0
  797. synapse/storage/schema/main/delta/34/appservice_stream.sql +42 -0
  798. synapse/storage/schema/main/delta/34/cache_stream.py +50 -0
  799. synapse/storage/schema/main/delta/34/device_inbox.sql +43 -0
  800. synapse/storage/schema/main/delta/34/push_display_name_rename.sql +39 -0
  801. synapse/storage/schema/main/delta/34/received_txn_purge.py +36 -0
  802. synapse/storage/schema/main/delta/35/contains_url.sql +36 -0
  803. synapse/storage/schema/main/delta/35/device_outbox.sql +58 -0
  804. synapse/storage/schema/main/delta/35/device_stream_id.sql +40 -0
  805. synapse/storage/schema/main/delta/35/event_push_actions_index.sql +36 -0
  806. synapse/storage/schema/main/delta/35/public_room_list_change_stream.sql +52 -0
  807. synapse/storage/schema/main/delta/35/stream_order_to_extrem.sql +56 -0
  808. synapse/storage/schema/main/delta/36/readd_public_rooms.sql +45 -0
  809. synapse/storage/schema/main/delta/37/remove_auth_idx.py +89 -0
  810. synapse/storage/schema/main/delta/37/user_threepids.sql +71 -0
  811. synapse/storage/schema/main/delta/38/postgres_fts_gist.sql +38 -0
  812. synapse/storage/schema/main/delta/39/appservice_room_list.sql +48 -0
  813. synapse/storage/schema/main/delta/39/device_federation_stream_idx.sql +35 -0
  814. synapse/storage/schema/main/delta/39/event_push_index.sql +36 -0
  815. synapse/storage/schema/main/delta/39/federation_out_position.sql +41 -0
  816. synapse/storage/schema/main/delta/39/membership_profile.sql +39 -0
  817. synapse/storage/schema/main/delta/40/current_state_idx.sql +36 -0
  818. synapse/storage/schema/main/delta/40/device_inbox.sql +40 -0
  819. synapse/storage/schema/main/delta/40/device_list_streams.sql +79 -0
  820. synapse/storage/schema/main/delta/40/event_push_summary.sql +57 -0
  821. synapse/storage/schema/main/delta/40/pushers.sql +58 -0
  822. synapse/storage/schema/main/delta/41/device_list_stream_idx.sql +36 -0
  823. synapse/storage/schema/main/delta/41/device_outbound_index.sql +35 -0
  824. synapse/storage/schema/main/delta/41/event_search_event_id_idx.sql +36 -0
  825. synapse/storage/schema/main/delta/41/ratelimit.sql +41 -0
  826. synapse/storage/schema/main/delta/42/current_state_delta.sql +48 -0
  827. synapse/storage/schema/main/delta/42/device_list_last_id.sql +52 -0
  828. synapse/storage/schema/main/delta/42/event_auth_state_only.sql +36 -0
  829. synapse/storage/schema/main/delta/42/user_dir.py +88 -0
  830. synapse/storage/schema/main/delta/43/blocked_rooms.sql +40 -0
  831. synapse/storage/schema/main/delta/43/quarantine_media.sql +36 -0
  832. synapse/storage/schema/main/delta/43/url_cache.sql +35 -0
  833. synapse/storage/schema/main/delta/43/user_share.sql +52 -0
  834. synapse/storage/schema/main/delta/44/expire_url_cache.sql +60 -0
  835. synapse/storage/schema/main/delta/45/group_server.sql +186 -0
  836. synapse/storage/schema/main/delta/45/profile_cache.sql +47 -0
  837. synapse/storage/schema/main/delta/46/drop_refresh_tokens.sql +36 -0
  838. synapse/storage/schema/main/delta/46/drop_unique_deleted_pushers.sql +54 -0
  839. synapse/storage/schema/main/delta/46/group_server.sql +51 -0
  840. synapse/storage/schema/main/delta/46/local_media_repository_url_idx.sql +43 -0
  841. synapse/storage/schema/main/delta/46/user_dir_null_room_ids.sql +54 -0
  842. synapse/storage/schema/main/delta/46/user_dir_typos.sql +43 -0
  843. synapse/storage/schema/main/delta/47/last_access_media.sql +35 -0
  844. synapse/storage/schema/main/delta/47/postgres_fts_gin.sql +36 -0
  845. synapse/storage/schema/main/delta/47/push_actions_staging.sql +47 -0
  846. synapse/storage/schema/main/delta/48/add_user_consent.sql +37 -0
  847. synapse/storage/schema/main/delta/48/add_user_ips_last_seen_index.sql +36 -0
  848. synapse/storage/schema/main/delta/48/deactivated_users.sql +44 -0
  849. synapse/storage/schema/main/delta/48/group_unique_indexes.py +67 -0
  850. synapse/storage/schema/main/delta/48/groups_joinable.sql +41 -0
  851. synapse/storage/schema/main/delta/49/add_user_consent_server_notice_sent.sql +39 -0
  852. synapse/storage/schema/main/delta/49/add_user_daily_visits.sql +40 -0
  853. synapse/storage/schema/main/delta/49/add_user_ips_last_seen_only_index.sql +36 -0
  854. synapse/storage/schema/main/delta/50/add_creation_ts_users_index.sql +38 -0
  855. synapse/storage/schema/main/delta/50/erasure_store.sql +40 -0
  856. synapse/storage/schema/main/delta/50/make_event_content_nullable.py +102 -0
  857. synapse/storage/schema/main/delta/51/e2e_room_keys.sql +58 -0
  858. synapse/storage/schema/main/delta/51/monthly_active_users.sql +46 -0
  859. synapse/storage/schema/main/delta/52/add_event_to_state_group_index.sql +38 -0
  860. synapse/storage/schema/main/delta/52/device_list_streams_unique_idx.sql +55 -0
  861. synapse/storage/schema/main/delta/52/e2e_room_keys.sql +72 -0
  862. synapse/storage/schema/main/delta/53/add_user_type_to_users.sql +38 -0
  863. synapse/storage/schema/main/delta/53/drop_sent_transactions.sql +35 -0
  864. synapse/storage/schema/main/delta/53/event_format_version.sql +35 -0
  865. synapse/storage/schema/main/delta/53/user_dir_populate.sql +49 -0
  866. synapse/storage/schema/main/delta/53/user_ips_index.sql +49 -0
  867. synapse/storage/schema/main/delta/53/user_share.sql +63 -0
  868. synapse/storage/schema/main/delta/53/user_threepid_id.sql +48 -0
  869. synapse/storage/schema/main/delta/53/users_in_public_rooms.sql +47 -0
  870. synapse/storage/schema/main/delta/54/account_validity_with_renewal.sql +49 -0
  871. synapse/storage/schema/main/delta/54/add_validity_to_server_keys.sql +42 -0
  872. synapse/storage/schema/main/delta/54/delete_forward_extremities.sql +42 -0
  873. synapse/storage/schema/main/delta/54/drop_legacy_tables.sql +49 -0
  874. synapse/storage/schema/main/delta/54/drop_presence_list.sql +35 -0
  875. synapse/storage/schema/main/delta/54/relations.sql +46 -0
  876. synapse/storage/schema/main/delta/54/stats.sql +99 -0
  877. synapse/storage/schema/main/delta/54/stats2.sql +47 -0
  878. synapse/storage/schema/main/delta/55/access_token_expiry.sql +37 -0
  879. synapse/storage/schema/main/delta/55/track_threepid_validations.sql +50 -0
  880. synapse/storage/schema/main/delta/55/users_alter_deactivated.sql +38 -0
  881. synapse/storage/schema/main/delta/56/add_spans_to_device_lists.sql +39 -0
  882. synapse/storage/schema/main/delta/56/current_state_events_membership.sql +41 -0
  883. synapse/storage/schema/main/delta/56/current_state_events_membership_mk2.sql +43 -0
  884. synapse/storage/schema/main/delta/56/delete_keys_from_deleted_backups.sql +44 -0
  885. synapse/storage/schema/main/delta/56/destinations_failure_ts.sql +44 -0
  886. synapse/storage/schema/main/delta/56/destinations_retry_interval_type.sql.postgres +18 -0
  887. synapse/storage/schema/main/delta/56/device_stream_id_insert.sql +39 -0
  888. synapse/storage/schema/main/delta/56/devices_last_seen.sql +43 -0
  889. synapse/storage/schema/main/delta/56/drop_unused_event_tables.sql +39 -0
  890. synapse/storage/schema/main/delta/56/event_expiry.sql +40 -0
  891. synapse/storage/schema/main/delta/56/event_labels.sql +49 -0
  892. synapse/storage/schema/main/delta/56/event_labels_background_update.sql +36 -0
  893. synapse/storage/schema/main/delta/56/fix_room_keys_index.sql +37 -0
  894. synapse/storage/schema/main/delta/56/hidden_devices.sql +37 -0
  895. synapse/storage/schema/main/delta/56/hidden_devices_fix.sql.sqlite +42 -0
  896. synapse/storage/schema/main/delta/56/nuke_empty_communities_from_db.sql +48 -0
  897. synapse/storage/schema/main/delta/56/public_room_list_idx.sql +35 -0
  898. synapse/storage/schema/main/delta/56/redaction_censor.sql +35 -0
  899. synapse/storage/schema/main/delta/56/redaction_censor2.sql +41 -0
  900. synapse/storage/schema/main/delta/56/redaction_censor3_fix_update.sql.postgres +25 -0
  901. synapse/storage/schema/main/delta/56/redaction_censor4.sql +35 -0
  902. synapse/storage/schema/main/delta/56/remove_tombstoned_rooms_from_directory.sql +38 -0
  903. synapse/storage/schema/main/delta/56/room_key_etag.sql +36 -0
  904. synapse/storage/schema/main/delta/56/room_membership_idx.sql +37 -0
  905. synapse/storage/schema/main/delta/56/room_retention.sql +52 -0
  906. synapse/storage/schema/main/delta/56/signing_keys.sql +75 -0
  907. synapse/storage/schema/main/delta/56/signing_keys_nonunique_signatures.sql +41 -0
  908. synapse/storage/schema/main/delta/56/stats_separated.sql +175 -0
  909. synapse/storage/schema/main/delta/56/unique_user_filter_index.py +46 -0
  910. synapse/storage/schema/main/delta/56/user_external_ids.sql +43 -0
  911. synapse/storage/schema/main/delta/56/users_in_public_rooms_idx.sql +36 -0
  912. synapse/storage/schema/main/delta/57/delete_old_current_state_events.sql +41 -0
  913. synapse/storage/schema/main/delta/57/device_list_remote_cache_stale.sql +44 -0
  914. synapse/storage/schema/main/delta/57/local_current_membership.py +111 -0
  915. synapse/storage/schema/main/delta/57/remove_sent_outbound_pokes.sql +40 -0
  916. synapse/storage/schema/main/delta/57/rooms_version_column.sql +43 -0
  917. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.postgres +35 -0
  918. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.sqlite +22 -0
  919. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.postgres +39 -0
  920. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.sqlite +23 -0
  921. synapse/storage/schema/main/delta/58/02remove_dup_outbound_pokes.sql +41 -0
  922. synapse/storage/schema/main/delta/58/03persist_ui_auth.sql +55 -0
  923. synapse/storage/schema/main/delta/58/05cache_instance.sql.postgres +30 -0
  924. synapse/storage/schema/main/delta/58/06dlols_unique_idx.py +83 -0
  925. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.postgres +33 -0
  926. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.sqlite +44 -0
  927. synapse/storage/schema/main/delta/58/07persist_ui_auth_ips.sql +44 -0
  928. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.postgres +18 -0
  929. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.sqlite +18 -0
  930. synapse/storage/schema/main/delta/58/09shadow_ban.sql +37 -0
  931. synapse/storage/schema/main/delta/58/10_pushrules_enabled_delete_obsolete.sql +47 -0
  932. synapse/storage/schema/main/delta/58/10drop_local_rejections_stream.sql +41 -0
  933. synapse/storage/schema/main/delta/58/10federation_pos_instance_name.sql +41 -0
  934. synapse/storage/schema/main/delta/58/11dehydration.sql +39 -0
  935. synapse/storage/schema/main/delta/58/11fallback.sql +43 -0
  936. synapse/storage/schema/main/delta/58/11user_id_seq.py +38 -0
  937. synapse/storage/schema/main/delta/58/12room_stats.sql +51 -0
  938. synapse/storage/schema/main/delta/58/13remove_presence_allow_inbound.sql +36 -0
  939. synapse/storage/schema/main/delta/58/14events_instance_name.sql +35 -0
  940. synapse/storage/schema/main/delta/58/14events_instance_name.sql.postgres +28 -0
  941. synapse/storage/schema/main/delta/58/15_catchup_destination_rooms.sql +61 -0
  942. synapse/storage/schema/main/delta/58/15unread_count.sql +45 -0
  943. synapse/storage/schema/main/delta/58/16populate_stats_process_rooms_fix.sql +41 -0
  944. synapse/storage/schema/main/delta/58/17_catchup_last_successful.sql +40 -0
  945. synapse/storage/schema/main/delta/58/18stream_positions.sql +41 -0
  946. synapse/storage/schema/main/delta/58/19instance_map.sql.postgres +25 -0
  947. synapse/storage/schema/main/delta/58/19txn_id.sql +59 -0
  948. synapse/storage/schema/main/delta/58/20instance_name_event_tables.sql +36 -0
  949. synapse/storage/schema/main/delta/58/20user_daily_visits.sql +37 -0
  950. synapse/storage/schema/main/delta/58/21as_device_stream.sql +36 -0
  951. synapse/storage/schema/main/delta/58/21drop_device_max_stream_id.sql +1 -0
  952. synapse/storage/schema/main/delta/58/22puppet_token.sql +36 -0
  953. synapse/storage/schema/main/delta/58/22users_have_local_media.sql +2 -0
  954. synapse/storage/schema/main/delta/58/23e2e_cross_signing_keys_idx.sql +36 -0
  955. synapse/storage/schema/main/delta/58/24drop_event_json_index.sql +38 -0
  956. synapse/storage/schema/main/delta/58/25user_external_ids_user_id_idx.sql +36 -0
  957. synapse/storage/schema/main/delta/58/26access_token_last_validated.sql +37 -0
  958. synapse/storage/schema/main/delta/58/27local_invites.sql +37 -0
  959. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.postgres +16 -0
  960. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.sqlite +62 -0
  961. synapse/storage/schema/main/delta/59/01ignored_user.py +85 -0
  962. synapse/storage/schema/main/delta/59/02shard_send_to_device.sql +37 -0
  963. synapse/storage/schema/main/delta/59/03shard_send_to_device_sequence.sql.postgres +25 -0
  964. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql +71 -0
  965. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql.postgres +16 -0
  966. synapse/storage/schema/main/delta/59/04drop_account_data.sql +36 -0
  967. synapse/storage/schema/main/delta/59/05cache_invalidation.sql +36 -0
  968. synapse/storage/schema/main/delta/59/06chain_cover_index.sql +36 -0
  969. synapse/storage/schema/main/delta/59/06shard_account_data.sql +39 -0
  970. synapse/storage/schema/main/delta/59/06shard_account_data.sql.postgres +32 -0
  971. synapse/storage/schema/main/delta/59/07shard_account_data_fix.sql +37 -0
  972. synapse/storage/schema/main/delta/59/08delete_pushers_for_deactivated_accounts.sql +39 -0
  973. synapse/storage/schema/main/delta/59/08delete_stale_pushers.sql +39 -0
  974. synapse/storage/schema/main/delta/59/09rejected_events_metadata.sql +45 -0
  975. synapse/storage/schema/main/delta/59/10delete_purged_chain_cover.sql +36 -0
  976. synapse/storage/schema/main/delta/59/11add_knock_members_to_stats.sql +39 -0
  977. synapse/storage/schema/main/delta/59/11drop_thumbnail_constraint.sql.postgres +22 -0
  978. synapse/storage/schema/main/delta/59/12account_validity_token_used_ts_ms.sql +37 -0
  979. synapse/storage/schema/main/delta/59/12presence_stream_instance.sql +37 -0
  980. synapse/storage/schema/main/delta/59/12presence_stream_instance_seq.sql.postgres +20 -0
  981. synapse/storage/schema/main/delta/59/13users_to_send_full_presence_to.sql +53 -0
  982. synapse/storage/schema/main/delta/59/14refresh_tokens.sql +53 -0
  983. synapse/storage/schema/main/delta/59/15locks.sql +56 -0
  984. synapse/storage/schema/main/delta/59/16federation_inbound_staging.sql +51 -0
  985. synapse/storage/schema/main/delta/60/01recreate_stream_ordering.sql.postgres +45 -0
  986. synapse/storage/schema/main/delta/60/02change_stream_ordering_columns.sql.postgres +30 -0
  987. synapse/storage/schema/main/delta/61/01change_appservices_txns.sql.postgres +23 -0
  988. synapse/storage/schema/main/delta/61/01insertion_event_lookups.sql +68 -0
  989. synapse/storage/schema/main/delta/61/02drop_redundant_room_depth_index.sql +37 -0
  990. synapse/storage/schema/main/delta/61/03recreate_min_depth.py +74 -0
  991. synapse/storage/schema/main/delta/62/01insertion_event_extremities.sql +43 -0
  992. synapse/storage/schema/main/delta/63/01create_registration_tokens.sql +42 -0
  993. synapse/storage/schema/main/delta/63/02delete_unlinked_email_pushers.sql +39 -0
  994. synapse/storage/schema/main/delta/63/02populate-rooms-creator.sql +36 -0
  995. synapse/storage/schema/main/delta/63/03session_store.sql +42 -0
  996. synapse/storage/schema/main/delta/63/04add_presence_stream_not_offline_index.sql +37 -0
  997. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.postgres +23 -0
  998. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.sqlite +37 -0
  999. synapse/storage/schema/main/delta/65/01msc2716_insertion_event_edges.sql +38 -0
  1000. synapse/storage/schema/main/delta/65/03remove_hidden_devices_from_device_inbox.sql +41 -0
  1001. synapse/storage/schema/main/delta/65/04_local_group_updates.sql +37 -0
  1002. synapse/storage/schema/main/delta/65/05_remove_room_stats_historical_and_user_stats_historical.sql +38 -0
  1003. synapse/storage/schema/main/delta/65/06remove_deleted_devices_from_device_inbox.sql +53 -0
  1004. synapse/storage/schema/main/delta/65/07_arbitrary_relations.sql +37 -0
  1005. synapse/storage/schema/main/delta/65/08_device_inbox_background_updates.sql +37 -0
  1006. synapse/storage/schema/main/delta/65/10_expirable_refresh_tokens.sql +47 -0
  1007. synapse/storage/schema/main/delta/65/11_devices_auth_provider_session.sql +46 -0
  1008. synapse/storage/schema/main/delta/67/01drop_public_room_list_stream.sql +37 -0
  1009. synapse/storage/schema/main/delta/68/01event_columns.sql +45 -0
  1010. synapse/storage/schema/main/delta/68/02_msc2409_add_device_id_appservice_stream_type.sql +40 -0
  1011. synapse/storage/schema/main/delta/68/03_delete_account_data_for_deactivated_accounts.sql +39 -0
  1012. synapse/storage/schema/main/delta/68/04_refresh_tokens_index_next_token_id.sql +47 -0
  1013. synapse/storage/schema/main/delta/68/04partial_state_rooms.sql +60 -0
  1014. synapse/storage/schema/main/delta/68/05_delete_non_strings_from_event_search.sql.sqlite +22 -0
  1015. synapse/storage/schema/main/delta/68/05partial_state_rooms_triggers.py +80 -0
  1016. synapse/storage/schema/main/delta/68/06_msc3202_add_device_list_appservice_stream_type.sql +42 -0
  1017. synapse/storage/schema/main/delta/69/01as_txn_seq.py +54 -0
  1018. synapse/storage/schema/main/delta/69/01device_list_oubound_by_room.sql +57 -0
  1019. synapse/storage/schema/main/delta/69/02cache_invalidation_index.sql +37 -0
  1020. synapse/storage/schema/main/delta/70/01clean_table_purged_rooms.sql +39 -0
  1021. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.postgres +43 -0
  1022. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.sqlite +47 -0
  1023. synapse/storage/schema/main/delta/71/01remove_noop_background_updates.sql +80 -0
  1024. synapse/storage/schema/main/delta/71/02event_push_summary_unique.sql +37 -0
  1025. synapse/storage/schema/main/delta/72/01add_room_type_to_state_stats.sql +38 -0
  1026. synapse/storage/schema/main/delta/72/01event_push_summary_receipt.sql +54 -0
  1027. synapse/storage/schema/main/delta/72/02event_push_actions_index.sql +38 -0
  1028. synapse/storage/schema/main/delta/72/03bg_populate_events_columns.py +57 -0
  1029. synapse/storage/schema/main/delta/72/03drop_event_reference_hashes.sql +36 -0
  1030. synapse/storage/schema/main/delta/72/03remove_groups.sql +50 -0
  1031. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.postgres +17 -0
  1032. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.sqlite +40 -0
  1033. synapse/storage/schema/main/delta/72/05receipts_event_stream_ordering.sql +38 -0
  1034. synapse/storage/schema/main/delta/72/05remove_unstable_private_read_receipts.sql +38 -0
  1035. synapse/storage/schema/main/delta/72/06add_consent_ts_to_users.sql +35 -0
  1036. synapse/storage/schema/main/delta/72/06thread_notifications.sql +49 -0
  1037. synapse/storage/schema/main/delta/72/07force_update_current_state_events_membership.py +67 -0
  1038. synapse/storage/schema/main/delta/72/07thread_receipts.sql.postgres +30 -0
  1039. synapse/storage/schema/main/delta/72/07thread_receipts.sql.sqlite +70 -0
  1040. synapse/storage/schema/main/delta/72/08begin_cache_invalidation_seq_at_2.sql.postgres +23 -0
  1041. synapse/storage/schema/main/delta/72/08thread_receipts.sql +39 -0
  1042. synapse/storage/schema/main/delta/72/09partial_indices.sql.sqlite +56 -0
  1043. synapse/storage/schema/main/delta/73/01event_failed_pull_attempts.sql +48 -0
  1044. synapse/storage/schema/main/delta/73/02add_pusher_enabled.sql +35 -0
  1045. synapse/storage/schema/main/delta/73/02room_id_indexes_for_purging.sql +41 -0
  1046. synapse/storage/schema/main/delta/73/03pusher_device_id.sql +39 -0
  1047. synapse/storage/schema/main/delta/73/03users_approved_column.sql +39 -0
  1048. synapse/storage/schema/main/delta/73/04partial_join_details.sql +42 -0
  1049. synapse/storage/schema/main/delta/73/04pending_device_list_updates.sql +47 -0
  1050. synapse/storage/schema/main/delta/73/05old_push_actions.sql.postgres +22 -0
  1051. synapse/storage/schema/main/delta/73/05old_push_actions.sql.sqlite +24 -0
  1052. synapse/storage/schema/main/delta/73/06thread_notifications_thread_id_idx.sql +42 -0
  1053. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.postgres +23 -0
  1054. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.sqlite +76 -0
  1055. synapse/storage/schema/main/delta/73/09partial_joined_via_destination.sql +37 -0
  1056. synapse/storage/schema/main/delta/73/09threads_table.sql +49 -0
  1057. synapse/storage/schema/main/delta/73/10_update_sqlite_fts4_tokenizer.py +71 -0
  1058. synapse/storage/schema/main/delta/73/10login_tokens.sql +54 -0
  1059. synapse/storage/schema/main/delta/73/11event_search_room_id_n_distinct.sql.postgres +33 -0
  1060. synapse/storage/schema/main/delta/73/12refactor_device_list_outbound_pokes.sql +72 -0
  1061. synapse/storage/schema/main/delta/73/13add_device_lists_index.sql +39 -0
  1062. synapse/storage/schema/main/delta/73/20_un_partial_stated_room_stream.sql +51 -0
  1063. synapse/storage/schema/main/delta/73/21_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  1064. synapse/storage/schema/main/delta/73/22_rebuild_user_dir_stats.sql +48 -0
  1065. synapse/storage/schema/main/delta/73/22_un_partial_stated_event_stream.sql +53 -0
  1066. synapse/storage/schema/main/delta/73/23_fix_thread_index.sql +52 -0
  1067. synapse/storage/schema/main/delta/73/23_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  1068. synapse/storage/schema/main/delta/73/24_events_jump_to_date_index.sql +36 -0
  1069. synapse/storage/schema/main/delta/73/25drop_presence.sql +36 -0
  1070. synapse/storage/schema/main/delta/74/01_user_directory_stale_remote_users.sql +58 -0
  1071. synapse/storage/schema/main/delta/74/02_set_device_id_for_pushers_bg_update.sql +38 -0
  1072. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.postgres +29 -0
  1073. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.sqlite +23 -0
  1074. synapse/storage/schema/main/delta/74/03_room_membership_index.sql +38 -0
  1075. synapse/storage/schema/main/delta/74/04_delete_e2e_backup_keys_for_deactivated_users.sql +36 -0
  1076. synapse/storage/schema/main/delta/74/04_membership_tables_event_stream_ordering_triggers.py +87 -0
  1077. synapse/storage/schema/main/delta/74/05_events_txn_id_device_id.sql +72 -0
  1078. synapse/storage/schema/main/delta/74/90COMMENTS_destinations.sql.postgres +52 -0
  1079. synapse/storage/schema/main/delta/76/01_add_profiles_full_user_id_column.sql +39 -0
  1080. synapse/storage/schema/main/delta/76/02_add_user_filters_full_user_id_column.sql +39 -0
  1081. synapse/storage/schema/main/delta/76/03_per_user_experimental_features.sql +46 -0
  1082. synapse/storage/schema/main/delta/76/04_add_room_forgetter.sql +43 -0
  1083. synapse/storage/schema/main/delta/77/01_add_profiles_not_valid_check.sql.postgres +16 -0
  1084. synapse/storage/schema/main/delta/77/02_add_user_filters_not_valid_check.sql.postgres +16 -0
  1085. synapse/storage/schema/main/delta/77/03bg_populate_full_user_id_profiles.sql +35 -0
  1086. synapse/storage/schema/main/delta/77/04bg_populate_full_user_id_user_filters.sql +35 -0
  1087. synapse/storage/schema/main/delta/77/05thread_notifications_backfill.sql +67 -0
  1088. synapse/storage/schema/main/delta/77/06thread_notifications_not_null.sql.sqlite +102 -0
  1089. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions.sql.postgres +27 -0
  1090. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions_staging.sql.postgres +27 -0
  1091. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_summary.sql.postgres +29 -0
  1092. synapse/storage/schema/main/delta/77/14bg_indices_event_stream_ordering.sql +39 -0
  1093. synapse/storage/schema/main/delta/78/01_validate_and_update_profiles.py +99 -0
  1094. synapse/storage/schema/main/delta/78/02_validate_and_update_user_filters.py +100 -0
  1095. synapse/storage/schema/main/delta/78/03_remove_unused_indexes_user_filters.py +72 -0
  1096. synapse/storage/schema/main/delta/78/03event_extremities_constraints.py +65 -0
  1097. synapse/storage/schema/main/delta/78/04_add_full_user_id_index_user_filters.py +32 -0
  1098. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.postgres +102 -0
  1099. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.sqlite +72 -0
  1100. synapse/storage/schema/main/delta/79/04_mitigate_stream_ordering_update_race.py +70 -0
  1101. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.postgres +69 -0
  1102. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.sqlite +65 -0
  1103. synapse/storage/schema/main/delta/80/01_users_alter_locked.sql +35 -0
  1104. synapse/storage/schema/main/delta/80/02_read_write_locks_unlogged.sql.postgres +30 -0
  1105. synapse/storage/schema/main/delta/80/02_scheduled_tasks.sql +47 -0
  1106. synapse/storage/schema/main/delta/80/03_read_write_locks_triggers.sql.postgres +37 -0
  1107. synapse/storage/schema/main/delta/80/04_read_write_locks_deadlock.sql.postgres +71 -0
  1108. synapse/storage/schema/main/delta/82/02_scheduled_tasks_index.sql +35 -0
  1109. synapse/storage/schema/main/delta/82/04_add_indices_for_purging_rooms.sql +39 -0
  1110. synapse/storage/schema/main/delta/82/05gaps.sql +44 -0
  1111. synapse/storage/schema/main/delta/83/01_drop_old_tables.sql +43 -0
  1112. synapse/storage/schema/main/delta/83/03_instance_name_receipts.sql.sqlite +17 -0
  1113. synapse/storage/schema/main/delta/83/05_cross_signing_key_update_grant.sql +34 -0
  1114. synapse/storage/schema/main/delta/83/06_event_push_summary_room.sql +36 -0
  1115. synapse/storage/schema/main/delta/84/01_auth_links_stats.sql.postgres +20 -0
  1116. synapse/storage/schema/main/delta/84/02_auth_links_index.sql +16 -0
  1117. synapse/storage/schema/main/delta/84/03_auth_links_analyze.sql.postgres +16 -0
  1118. synapse/storage/schema/main/delta/84/04_access_token_index.sql +15 -0
  1119. synapse/storage/schema/main/delta/85/01_add_suspended.sql +14 -0
  1120. synapse/storage/schema/main/delta/85/02_add_instance_names.sql +27 -0
  1121. synapse/storage/schema/main/delta/85/03_new_sequences.sql.postgres +54 -0
  1122. synapse/storage/schema/main/delta/85/04_cleanup_device_federation_outbox.sql +15 -0
  1123. synapse/storage/schema/main/delta/85/05_add_instance_names_converted_pos.sql +16 -0
  1124. synapse/storage/schema/main/delta/85/06_add_room_reports.sql +20 -0
  1125. synapse/storage/schema/main/delta/86/01_authenticate_media.sql +15 -0
  1126. synapse/storage/schema/main/delta/86/02_receipts_event_id_index.sql +15 -0
  1127. synapse/storage/schema/main/delta/87/01_sliding_sync_memberships.sql +169 -0
  1128. synapse/storage/schema/main/delta/87/02_per_connection_state.sql +81 -0
  1129. synapse/storage/schema/main/delta/87/03_current_state_index.sql +19 -0
  1130. synapse/storage/schema/main/delta/88/01_add_delayed_events.sql +43 -0
  1131. synapse/storage/schema/main/delta/88/01_custom_profile_fields.sql +15 -0
  1132. synapse/storage/schema/main/delta/88/02_fix_sliding_sync_membership_snapshots_forgotten_column.sql +21 -0
  1133. synapse/storage/schema/main/delta/88/03_add_otk_ts_added_index.sql +18 -0
  1134. synapse/storage/schema/main/delta/88/04_current_state_delta_index.sql +18 -0
  1135. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.postgres +19 -0
  1136. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.sqlite +19 -0
  1137. synapse/storage/schema/main/delta/88/05_sliding_sync_room_config_index.sql +20 -0
  1138. synapse/storage/schema/main/delta/88/06_events_received_ts_index.sql +17 -0
  1139. synapse/storage/schema/main/delta/89/01_sliding_sync_membership_snapshot_index.sql +15 -0
  1140. synapse/storage/schema/main/delta/90/01_add_column_participant_room_memberships_table.sql +16 -0
  1141. synapse/storage/schema/main/delta/91/01_media_hash.sql +28 -0
  1142. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.postgres +16 -0
  1143. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.sqlite +16 -0
  1144. synapse/storage/schema/main/delta/92/02_remove_populate_participant_bg_update.sql +17 -0
  1145. synapse/storage/schema/main/delta/92/04_ss_membership_snapshot_idx.sql +16 -0
  1146. synapse/storage/schema/main/delta/92/04_thread_subscriptions.sql +59 -0
  1147. synapse/storage/schema/main/delta/92/04_thread_subscriptions_seq.sql.postgres +19 -0
  1148. synapse/storage/schema/main/delta/92/05_fixup_max_depth_cap.sql +17 -0
  1149. synapse/storage/schema/main/delta/92/05_thread_subscriptions_comments.sql.postgres +18 -0
  1150. synapse/storage/schema/main/delta/92/06_device_federation_inbox_index.sql +16 -0
  1151. synapse/storage/schema/main/delta/92/06_threads_last_sent_stream_ordering_comments.sql.postgres +24 -0
  1152. synapse/storage/schema/main/delta/92/07_add_user_reports.sql +22 -0
  1153. synapse/storage/schema/main/delta/92/07_event_txn_id_device_id_txn_id2.sql +15 -0
  1154. synapse/storage/schema/main/delta/92/08_room_ban_redactions.sql +21 -0
  1155. synapse/storage/schema/main/delta/92/08_thread_subscriptions_seq_fixup.sql.postgres +19 -0
  1156. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql +20 -0
  1157. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql.postgres +18 -0
  1158. synapse/storage/schema/main/delta/93/01_add_delayed_events.sql +15 -0
  1159. synapse/storage/schema/main/delta/93/02_sliding_sync_members.sql +60 -0
  1160. synapse/storage/schema/main/delta/93/03_sss_pos_last_used.sql +27 -0
  1161. synapse/storage/schema/main/full_schemas/72/full.sql.postgres +1344 -0
  1162. synapse/storage/schema/main/full_schemas/72/full.sql.sqlite +646 -0
  1163. synapse/storage/schema/state/delta/23/drop_state_index.sql +35 -0
  1164. synapse/storage/schema/state/delta/32/remove_state_indices.sql +38 -0
  1165. synapse/storage/schema/state/delta/35/add_state_index.sql +36 -0
  1166. synapse/storage/schema/state/delta/35/state.sql +41 -0
  1167. synapse/storage/schema/state/delta/35/state_dedupe.sql +36 -0
  1168. synapse/storage/schema/state/delta/47/state_group_seq.py +38 -0
  1169. synapse/storage/schema/state/delta/56/state_group_room_idx.sql +36 -0
  1170. synapse/storage/schema/state/delta/61/02state_groups_state_n_distinct.sql.postgres +34 -0
  1171. synapse/storage/schema/state/delta/70/08_state_group_edges_unique.sql +36 -0
  1172. synapse/storage/schema/state/delta/89/01_state_groups_deletion.sql +39 -0
  1173. synapse/storage/schema/state/delta/90/02_delete_unreferenced_state_groups.sql +16 -0
  1174. synapse/storage/schema/state/delta/90/03_remove_old_deletion_bg_update.sql +15 -0
  1175. synapse/storage/schema/state/full_schemas/72/full.sql.postgres +30 -0
  1176. synapse/storage/schema/state/full_schemas/72/full.sql.sqlite +20 -0
  1177. synapse/storage/types.py +183 -0
  1178. synapse/storage/util/__init__.py +20 -0
  1179. synapse/storage/util/id_generators.py +928 -0
  1180. synapse/storage/util/partial_state_events_tracker.py +194 -0
  1181. synapse/storage/util/sequence.py +315 -0
  1182. synapse/streams/__init__.py +43 -0
  1183. synapse/streams/config.py +91 -0
  1184. synapse/streams/events.py +203 -0
  1185. synapse/synapse_rust/__init__.pyi +3 -0
  1186. synapse/synapse_rust/acl.pyi +20 -0
  1187. synapse/synapse_rust/events.pyi +136 -0
  1188. synapse/synapse_rust/http_client.pyi +32 -0
  1189. synapse/synapse_rust/push.pyi +86 -0
  1190. synapse/synapse_rust/rendezvous.pyi +30 -0
  1191. synapse/synapse_rust/segmenter.pyi +1 -0
  1192. synapse/synapse_rust.abi3.so +0 -0
  1193. synapse/types/__init__.py +1600 -0
  1194. synapse/types/handlers/__init__.py +93 -0
  1195. synapse/types/handlers/policy_server.py +16 -0
  1196. synapse/types/handlers/sliding_sync.py +1004 -0
  1197. synapse/types/rest/__init__.py +25 -0
  1198. synapse/types/rest/client/__init__.py +413 -0
  1199. synapse/types/state.py +634 -0
  1200. synapse/types/storage/__init__.py +66 -0
  1201. synapse/util/__init__.py +160 -0
  1202. synapse/util/async_helpers.py +1048 -0
  1203. synapse/util/background_queue.py +142 -0
  1204. synapse/util/batching_queue.py +203 -0
  1205. synapse/util/caches/__init__.py +300 -0
  1206. synapse/util/caches/cached_call.py +143 -0
  1207. synapse/util/caches/deferred_cache.py +530 -0
  1208. synapse/util/caches/descriptors.py +692 -0
  1209. synapse/util/caches/dictionary_cache.py +346 -0
  1210. synapse/util/caches/expiringcache.py +250 -0
  1211. synapse/util/caches/lrucache.py +976 -0
  1212. synapse/util/caches/response_cache.py +323 -0
  1213. synapse/util/caches/stream_change_cache.py +370 -0
  1214. synapse/util/caches/treecache.py +189 -0
  1215. synapse/util/caches/ttlcache.py +197 -0
  1216. synapse/util/cancellation.py +63 -0
  1217. synapse/util/check_dependencies.py +335 -0
  1218. synapse/util/clock.py +592 -0
  1219. synapse/util/daemonize.py +165 -0
  1220. synapse/util/distributor.py +157 -0
  1221. synapse/util/duration.py +117 -0
  1222. synapse/util/events.py +134 -0
  1223. synapse/util/file_consumer.py +164 -0
  1224. synapse/util/frozenutils.py +57 -0
  1225. synapse/util/gai_resolver.py +178 -0
  1226. synapse/util/hash.py +38 -0
  1227. synapse/util/httpresourcetree.py +108 -0
  1228. synapse/util/iterutils.py +190 -0
  1229. synapse/util/json.py +56 -0
  1230. synapse/util/linked_list.py +156 -0
  1231. synapse/util/logcontext.py +46 -0
  1232. synapse/util/logformatter.py +28 -0
  1233. synapse/util/macaroons.py +325 -0
  1234. synapse/util/manhole.py +191 -0
  1235. synapse/util/metrics.py +339 -0
  1236. synapse/util/module_loader.py +116 -0
  1237. synapse/util/msisdn.py +51 -0
  1238. synapse/util/patch_inline_callbacks.py +250 -0
  1239. synapse/util/pydantic_models.py +63 -0
  1240. synapse/util/ratelimitutils.py +422 -0
  1241. synapse/util/retryutils.py +339 -0
  1242. synapse/util/rlimit.py +42 -0
  1243. synapse/util/rust.py +164 -0
  1244. synapse/util/sentinel.py +21 -0
  1245. synapse/util/stringutils.py +293 -0
  1246. synapse/util/task_scheduler.py +494 -0
  1247. synapse/util/templates.py +126 -0
  1248. synapse/util/threepids.py +123 -0
  1249. synapse/util/wheel_timer.py +112 -0
  1250. synapse/visibility.py +869 -0
  1251. synmark/__init__.py +47 -0
  1252. synmark/__main__.py +128 -0
  1253. synmark/suites/__init__.py +9 -0
  1254. synmark/suites/logging.py +154 -0
  1255. synmark/suites/lrucache.py +48 -0
  1256. synmark/suites/lrucache_evict.py +49 -0
  1257. sytest-blacklist +33 -0
  1258. tests/__init__.py +29 -0
  1259. tests/api/__init__.py +0 -0
  1260. tests/api/test_auth.py +548 -0
  1261. tests/api/test_errors.py +46 -0
  1262. tests/api/test_filtering.py +622 -0
  1263. tests/api/test_ratelimiting.py +505 -0
  1264. tests/api/test_urls.py +81 -0
  1265. tests/app/__init__.py +0 -0
  1266. tests/app/test_homeserver_shutdown.py +271 -0
  1267. tests/app/test_homeserver_start.py +49 -0
  1268. tests/app/test_openid_listener.py +139 -0
  1269. tests/app/test_phone_stats_home.py +248 -0
  1270. tests/appservice/__init__.py +20 -0
  1271. tests/appservice/test_api.py +253 -0
  1272. tests/appservice/test_appservice.py +259 -0
  1273. tests/appservice/test_scheduler.py +477 -0
  1274. tests/config/__init__.py +20 -0
  1275. tests/config/test___main__.py +38 -0
  1276. tests/config/test_api.py +146 -0
  1277. tests/config/test_appservice.py +48 -0
  1278. tests/config/test_background_update.py +65 -0
  1279. tests/config/test_base.py +151 -0
  1280. tests/config/test_cache.py +193 -0
  1281. tests/config/test_database.py +42 -0
  1282. tests/config/test_generate.py +72 -0
  1283. tests/config/test_load.py +322 -0
  1284. tests/config/test_oauth_delegation.py +454 -0
  1285. tests/config/test_ratelimiting.py +77 -0
  1286. tests/config/test_registration_config.py +203 -0
  1287. tests/config/test_room_directory.py +203 -0
  1288. tests/config/test_server.py +248 -0
  1289. tests/config/test_tls.py +209 -0
  1290. tests/config/test_util.py +59 -0
  1291. tests/config/test_workers.py +332 -0
  1292. tests/config/utils.py +66 -0
  1293. tests/crypto/__init__.py +20 -0
  1294. tests/crypto/test_event_signing.py +109 -0
  1295. tests/crypto/test_keyring.py +737 -0
  1296. tests/events/__init__.py +0 -0
  1297. tests/events/test_auto_accept_invites.py +827 -0
  1298. tests/events/test_presence_router.py +540 -0
  1299. tests/events/test_snapshot.py +121 -0
  1300. tests/events/test_utils.py +986 -0
  1301. tests/federation/__init__.py +0 -0
  1302. tests/federation/test_complexity.py +257 -0
  1303. tests/federation/test_federation_catch_up.py +585 -0
  1304. tests/federation/test_federation_client.py +316 -0
  1305. tests/federation/test_federation_devices.py +161 -0
  1306. tests/federation/test_federation_media.py +295 -0
  1307. tests/federation/test_federation_out_of_band_membership.py +671 -0
  1308. tests/federation/test_federation_sender.py +956 -0
  1309. tests/federation/test_federation_server.py +631 -0
  1310. tests/federation/transport/__init__.py +0 -0
  1311. tests/federation/transport/server/__init__.py +20 -0
  1312. tests/federation/transport/server/test__base.py +156 -0
  1313. tests/federation/transport/test_client.py +157 -0
  1314. tests/federation/transport/test_knocking.py +323 -0
  1315. tests/federation/transport/test_server.py +74 -0
  1316. tests/handlers/__init__.py +0 -0
  1317. tests/handlers/oidc_test_key.p8 +5 -0
  1318. tests/handlers/oidc_test_key.pub.pem +4 -0
  1319. tests/handlers/test_admin.py +361 -0
  1320. tests/handlers/test_appservice.py +1336 -0
  1321. tests/handlers/test_auth.py +248 -0
  1322. tests/handlers/test_cas.py +239 -0
  1323. tests/handlers/test_deactivate_account.py +485 -0
  1324. tests/handlers/test_device.py +665 -0
  1325. tests/handlers/test_directory.py +613 -0
  1326. tests/handlers/test_e2e_keys.py +2025 -0
  1327. tests/handlers/test_e2e_room_keys.py +569 -0
  1328. tests/handlers/test_federation.py +794 -0
  1329. tests/handlers/test_federation_event.py +1181 -0
  1330. tests/handlers/test_message.py +322 -0
  1331. tests/handlers/test_oauth_delegation.py +1314 -0
  1332. tests/handlers/test_oidc.py +1688 -0
  1333. tests/handlers/test_password_providers.py +987 -0
  1334. tests/handlers/test_presence.py +2144 -0
  1335. tests/handlers/test_profile.py +401 -0
  1336. tests/handlers/test_receipts.py +342 -0
  1337. tests/handlers/test_register.py +880 -0
  1338. tests/handlers/test_room.py +108 -0
  1339. tests/handlers/test_room_list.py +93 -0
  1340. tests/handlers/test_room_member.py +764 -0
  1341. tests/handlers/test_room_policy.py +468 -0
  1342. tests/handlers/test_room_summary.py +1248 -0
  1343. tests/handlers/test_saml.py +427 -0
  1344. tests/handlers/test_send_email.py +230 -0
  1345. tests/handlers/test_sliding_sync.py +5065 -0
  1346. tests/handlers/test_sso.py +152 -0
  1347. tests/handlers/test_stats.py +594 -0
  1348. tests/handlers/test_sync.py +1275 -0
  1349. tests/handlers/test_typing.py +557 -0
  1350. tests/handlers/test_user_directory.py +1435 -0
  1351. tests/handlers/test_worker_lock.py +126 -0
  1352. tests/http/__init__.py +196 -0
  1353. tests/http/ca.crt +19 -0
  1354. tests/http/ca.key +27 -0
  1355. tests/http/federation/__init__.py +19 -0
  1356. tests/http/federation/test_matrix_federation_agent.py +1855 -0
  1357. tests/http/federation/test_srv_resolver.py +220 -0
  1358. tests/http/server/__init__.py +20 -0
  1359. tests/http/server/_base.py +621 -0
  1360. tests/http/server.key +27 -0
  1361. tests/http/test_additional_resource.py +76 -0
  1362. tests/http/test_client.py +422 -0
  1363. tests/http/test_endpoint.py +62 -0
  1364. tests/http/test_matrixfederationclient.py +1092 -0
  1365. tests/http/test_proxy.py +75 -0
  1366. tests/http/test_proxyagent.py +1008 -0
  1367. tests/http/test_servlet.py +145 -0
  1368. tests/http/test_simple_client.py +188 -0
  1369. tests/http/test_site.py +247 -0
  1370. tests/logging/__init__.py +42 -0
  1371. tests/logging/test_loggers.py +127 -0
  1372. tests/logging/test_opentracing.py +524 -0
  1373. tests/logging/test_remote_handler.py +184 -0
  1374. tests/logging/test_terse_json.py +253 -0
  1375. tests/media/__init__.py +20 -0
  1376. tests/media/test_base.py +88 -0
  1377. tests/media/test_filepath.py +602 -0
  1378. tests/media/test_html_preview.py +565 -0
  1379. tests/media/test_media_retention.py +299 -0
  1380. tests/media/test_media_storage.py +1401 -0
  1381. tests/media/test_oembed.py +172 -0
  1382. tests/media/test_url_previewer.py +120 -0
  1383. tests/metrics/__init__.py +0 -0
  1384. tests/metrics/test_background_process_metrics.py +21 -0
  1385. tests/metrics/test_metrics.py +407 -0
  1386. tests/metrics/test_phone_home_stats.py +263 -0
  1387. tests/module_api/__init__.py +0 -0
  1388. tests/module_api/test_account_data_manager.py +171 -0
  1389. tests/module_api/test_api.py +1035 -0
  1390. tests/module_api/test_event_unsigned_addition.py +66 -0
  1391. tests/module_api/test_spamchecker.py +286 -0
  1392. tests/push/__init__.py +0 -0
  1393. tests/push/test_bulk_push_rule_evaluator.py +652 -0
  1394. tests/push/test_email.py +570 -0
  1395. tests/push/test_http.py +1247 -0
  1396. tests/push/test_presentable_names.py +238 -0
  1397. tests/push/test_push_rule_evaluator.py +1069 -0
  1398. tests/replication/__init__.py +20 -0
  1399. tests/replication/_base.py +619 -0
  1400. tests/replication/http/__init__.py +20 -0
  1401. tests/replication/http/test__base.py +113 -0
  1402. tests/replication/storage/__init__.py +20 -0
  1403. tests/replication/storage/_base.py +85 -0
  1404. tests/replication/storage/test_events.py +299 -0
  1405. tests/replication/tcp/__init__.py +19 -0
  1406. tests/replication/tcp/streams/__init__.py +19 -0
  1407. tests/replication/tcp/streams/test_account_data.py +133 -0
  1408. tests/replication/tcp/streams/test_events.py +565 -0
  1409. tests/replication/tcp/streams/test_federation.py +117 -0
  1410. tests/replication/tcp/streams/test_partial_state.py +72 -0
  1411. tests/replication/tcp/streams/test_receipts.py +110 -0
  1412. tests/replication/tcp/streams/test_thread_subscriptions.py +157 -0
  1413. tests/replication/tcp/streams/test_to_device.py +112 -0
  1414. tests/replication/tcp/streams/test_typing.py +223 -0
  1415. tests/replication/tcp/test_commands.py +50 -0
  1416. tests/replication/tcp/test_handler.py +211 -0
  1417. tests/replication/test_auth.py +120 -0
  1418. tests/replication/test_client_reader_shard.py +101 -0
  1419. tests/replication/test_federation_ack.py +88 -0
  1420. tests/replication/test_federation_sender_shard.py +352 -0
  1421. tests/replication/test_module_cache_invalidation.py +89 -0
  1422. tests/replication/test_multi_media_repo.py +496 -0
  1423. tests/replication/test_pusher_shard.py +192 -0
  1424. tests/replication/test_sharded_event_persister.py +332 -0
  1425. tests/replication/test_sharded_receipts.py +250 -0
  1426. tests/rest/__init__.py +20 -0
  1427. tests/rest/admin/__init__.py +19 -0
  1428. tests/rest/admin/test_admin.py +614 -0
  1429. tests/rest/admin/test_background_updates.py +375 -0
  1430. tests/rest/admin/test_device.py +600 -0
  1431. tests/rest/admin/test_event.py +74 -0
  1432. tests/rest/admin/test_event_reports.py +781 -0
  1433. tests/rest/admin/test_federation.py +863 -0
  1434. tests/rest/admin/test_jwks.py +106 -0
  1435. tests/rest/admin/test_media.py +1091 -0
  1436. tests/rest/admin/test_registration_tokens.py +729 -0
  1437. tests/rest/admin/test_room.py +3626 -0
  1438. tests/rest/admin/test_scheduled_tasks.py +192 -0
  1439. tests/rest/admin/test_server_notice.py +753 -0
  1440. tests/rest/admin/test_statistics.py +523 -0
  1441. tests/rest/admin/test_user.py +6061 -0
  1442. tests/rest/admin/test_username_available.py +82 -0
  1443. tests/rest/client/__init__.py +20 -0
  1444. tests/rest/client/sliding_sync/__init__.py +13 -0
  1445. tests/rest/client/sliding_sync/test_connection_tracking.py +505 -0
  1446. tests/rest/client/sliding_sync/test_extension_account_data.py +1056 -0
  1447. tests/rest/client/sliding_sync/test_extension_e2ee.py +459 -0
  1448. tests/rest/client/sliding_sync/test_extension_receipts.py +934 -0
  1449. tests/rest/client/sliding_sync/test_extension_thread_subscriptions.py +497 -0
  1450. tests/rest/client/sliding_sync/test_extension_to_device.py +294 -0
  1451. tests/rest/client/sliding_sync/test_extension_typing.py +500 -0
  1452. tests/rest/client/sliding_sync/test_extensions.py +306 -0
  1453. tests/rest/client/sliding_sync/test_lists_filters.py +1975 -0
  1454. tests/rest/client/sliding_sync/test_room_subscriptions.py +303 -0
  1455. tests/rest/client/sliding_sync/test_rooms_invites.py +528 -0
  1456. tests/rest/client/sliding_sync/test_rooms_meta.py +1338 -0
  1457. tests/rest/client/sliding_sync/test_rooms_required_state.py +2247 -0
  1458. tests/rest/client/sliding_sync/test_rooms_timeline.py +718 -0
  1459. tests/rest/client/sliding_sync/test_sliding_sync.py +1688 -0
  1460. tests/rest/client/test_account.py +1543 -0
  1461. tests/rest/client/test_account_data.py +81 -0
  1462. tests/rest/client/test_auth.py +1508 -0
  1463. tests/rest/client/test_auth_metadata.py +145 -0
  1464. tests/rest/client/test_capabilities.py +318 -0
  1465. tests/rest/client/test_consent.py +138 -0
  1466. tests/rest/client/test_delayed_events.py +553 -0
  1467. tests/rest/client/test_devices.py +634 -0
  1468. tests/rest/client/test_directory.py +249 -0
  1469. tests/rest/client/test_ephemeral_message.py +113 -0
  1470. tests/rest/client/test_events.py +165 -0
  1471. tests/rest/client/test_filter.py +124 -0
  1472. tests/rest/client/test_identity.py +67 -0
  1473. tests/rest/client/test_keys.py +516 -0
  1474. tests/rest/client/test_login.py +1881 -0
  1475. tests/rest/client/test_login_token_request.py +175 -0
  1476. tests/rest/client/test_matrixrtc.py +105 -0
  1477. tests/rest/client/test_media.py +3156 -0
  1478. tests/rest/client/test_models.py +83 -0
  1479. tests/rest/client/test_mutual_rooms.py +235 -0
  1480. tests/rest/client/test_notifications.py +231 -0
  1481. tests/rest/client/test_owned_state.py +308 -0
  1482. tests/rest/client/test_password_policy.py +186 -0
  1483. tests/rest/client/test_power_levels.py +295 -0
  1484. tests/rest/client/test_presence.py +149 -0
  1485. tests/rest/client/test_profile.py +925 -0
  1486. tests/rest/client/test_push_rule_attrs.py +510 -0
  1487. tests/rest/client/test_read_marker.py +151 -0
  1488. tests/rest/client/test_receipts.py +287 -0
  1489. tests/rest/client/test_redactions.py +657 -0
  1490. tests/rest/client/test_register.py +1314 -0
  1491. tests/rest/client/test_relations.py +1954 -0
  1492. tests/rest/client/test_rendezvous.py +468 -0
  1493. tests/rest/client/test_reporting.py +324 -0
  1494. tests/rest/client/test_retention.py +389 -0
  1495. tests/rest/client/test_rooms.py +5486 -0
  1496. tests/rest/client/test_sendtodevice.py +271 -0
  1497. tests/rest/client/test_shadow_banned.py +335 -0
  1498. tests/rest/client/test_sync.py +1147 -0
  1499. tests/rest/client/test_tags.py +161 -0
  1500. tests/rest/client/test_third_party_rules.py +1076 -0
  1501. tests/rest/client/test_thread_subscriptions.py +351 -0
  1502. tests/rest/client/test_transactions.py +204 -0
  1503. tests/rest/client/test_typing.py +114 -0
  1504. tests/rest/client/test_upgrade_room.py +433 -0
  1505. tests/rest/client/utils.py +985 -0
  1506. tests/rest/key/__init__.py +0 -0
  1507. tests/rest/key/v2/__init__.py +0 -0
  1508. tests/rest/key/v2/test_remote_key_resource.py +282 -0
  1509. tests/rest/media/__init__.py +19 -0
  1510. tests/rest/media/test_domain_blocking.py +148 -0
  1511. tests/rest/media/test_url_preview.py +1445 -0
  1512. tests/rest/synapse/__init__.py +12 -0
  1513. tests/rest/synapse/client/__init__.py +12 -0
  1514. tests/rest/synapse/client/test_federation_whitelist.py +118 -0
  1515. tests/rest/synapse/mas/__init__.py +12 -0
  1516. tests/rest/synapse/mas/_base.py +43 -0
  1517. tests/rest/synapse/mas/test_devices.py +693 -0
  1518. tests/rest/synapse/mas/test_users.py +1399 -0
  1519. tests/rest/test_health.py +35 -0
  1520. tests/rest/test_well_known.py +155 -0
  1521. tests/scripts/__init__.py +0 -0
  1522. tests/scripts/test_new_matrix_user.py +172 -0
  1523. tests/server.py +1374 -0
  1524. tests/server_notices/__init__.py +241 -0
  1525. tests/server_notices/test_consent.py +111 -0
  1526. tests/server_notices/test_resource_limits_server_notices.py +409 -0
  1527. tests/state/__init__.py +0 -0
  1528. tests/state/test_v2.py +1096 -0
  1529. tests/state/test_v21.py +506 -0
  1530. tests/storage/__init__.py +0 -0
  1531. tests/storage/databases/__init__.py +20 -0
  1532. tests/storage/databases/main/__init__.py +20 -0
  1533. tests/storage/databases/main/test_cache.py +124 -0
  1534. tests/storage/databases/main/test_deviceinbox.py +323 -0
  1535. tests/storage/databases/main/test_end_to_end_keys.py +127 -0
  1536. tests/storage/databases/main/test_events_worker.py +594 -0
  1537. tests/storage/databases/main/test_lock.py +499 -0
  1538. tests/storage/databases/main/test_metrics.py +88 -0
  1539. tests/storage/databases/main/test_receipts.py +218 -0
  1540. tests/storage/databases/main/test_room.py +192 -0
  1541. tests/storage/test__base.py +178 -0
  1542. tests/storage/test_account_data.py +186 -0
  1543. tests/storage/test_appservice.py +568 -0
  1544. tests/storage/test_background_update.py +671 -0
  1545. tests/storage/test_base.py +813 -0
  1546. tests/storage/test_cleanup_extrems.py +396 -0
  1547. tests/storage/test_client_ips.py +788 -0
  1548. tests/storage/test_database.py +288 -0
  1549. tests/storage/test_devices.py +353 -0
  1550. tests/storage/test_directory.py +74 -0
  1551. tests/storage/test_e2e_room_keys.py +87 -0
  1552. tests/storage/test_end_to_end_keys.py +120 -0
  1553. tests/storage/test_event_chain.py +826 -0
  1554. tests/storage/test_event_federation.py +1433 -0
  1555. tests/storage/test_event_push_actions.py +809 -0
  1556. tests/storage/test_events.py +591 -0
  1557. tests/storage/test_events_bg_updates.py +156 -0
  1558. tests/storage/test_id_generators.py +791 -0
  1559. tests/storage/test_invite_rule.py +171 -0
  1560. tests/storage/test_main.py +56 -0
  1561. tests/storage/test_monthly_active_users.py +500 -0
  1562. tests/storage/test_profile.py +134 -0
  1563. tests/storage/test_purge.py +459 -0
  1564. tests/storage/test_receipts.py +309 -0
  1565. tests/storage/test_redaction.py +462 -0
  1566. tests/storage/test_registration.py +277 -0
  1567. tests/storage/test_relations.py +118 -0
  1568. tests/storage/test_rollback_worker.py +132 -0
  1569. tests/storage/test_room.py +69 -0
  1570. tests/storage/test_room_search.py +383 -0
  1571. tests/storage/test_roommember.py +812 -0
  1572. tests/storage/test_sliding_sync_tables.py +5187 -0
  1573. tests/storage/test_state.py +959 -0
  1574. tests/storage/test_state_deletion.py +475 -0
  1575. tests/storage/test_stream.py +1533 -0
  1576. tests/storage/test_thread_subscriptions.py +369 -0
  1577. tests/storage/test_transactions.py +77 -0
  1578. tests/storage/test_txn_limit.py +49 -0
  1579. tests/storage/test_unsafe_locale.py +67 -0
  1580. tests/storage/test_user_directory.py +691 -0
  1581. tests/storage/test_user_filters.py +101 -0
  1582. tests/storage/util/__init__.py +20 -0
  1583. tests/storage/util/test_partial_state_events_tracker.py +181 -0
  1584. tests/synapse_rust/__init__.py +11 -0
  1585. tests/synapse_rust/test_http_client.py +225 -0
  1586. tests/test_distributor.py +74 -0
  1587. tests/test_event_auth.py +921 -0
  1588. tests/test_mau.py +347 -0
  1589. tests/test_phone_home.py +102 -0
  1590. tests/test_rust.py +11 -0
  1591. tests/test_server.py +557 -0
  1592. tests/test_state.py +902 -0
  1593. tests/test_terms_auth.py +128 -0
  1594. tests/test_types.py +201 -0
  1595. tests/test_utils/__init__.py +161 -0
  1596. tests/test_utils/event_injection.py +150 -0
  1597. tests/test_utils/html_parsers.py +59 -0
  1598. tests/test_utils/logging_setup.py +74 -0
  1599. tests/test_utils/oidc.py +370 -0
  1600. tests/test_visibility.py +712 -0
  1601. tests/types/__init__.py +0 -0
  1602. tests/types/test_init.py +51 -0
  1603. tests/types/test_state.py +627 -0
  1604. tests/unittest.py +1108 -0
  1605. tests/util/__init__.py +20 -0
  1606. tests/util/caches/__init__.py +20 -0
  1607. tests/util/caches/test_cached_call.py +168 -0
  1608. tests/util/caches/test_deferred_cache.py +317 -0
  1609. tests/util/caches/test_descriptors.py +1110 -0
  1610. tests/util/caches/test_response_cache.py +225 -0
  1611. tests/util/caches/test_ttlcache.py +90 -0
  1612. tests/util/test_async_helpers.py +808 -0
  1613. tests/util/test_background_queue.py +117 -0
  1614. tests/util/test_batching_queue.py +252 -0
  1615. tests/util/test_check_dependencies.py +243 -0
  1616. tests/util/test_dict_cache.py +130 -0
  1617. tests/util/test_events.py +118 -0
  1618. tests/util/test_expiring_cache.py +113 -0
  1619. tests/util/test_file_consumer.py +199 -0
  1620. tests/util/test_itertools.py +190 -0
  1621. tests/util/test_linearizer.py +264 -0
  1622. tests/util/test_logcontext.py +715 -0
  1623. tests/util/test_logformatter.py +44 -0
  1624. tests/util/test_lrucache.py +479 -0
  1625. tests/util/test_macaroons.py +126 -0
  1626. tests/util/test_mutable_overlay_mapping.py +189 -0
  1627. tests/util/test_ratelimitutils.py +146 -0
  1628. tests/util/test_retryutils.py +314 -0
  1629. tests/util/test_rwlock.py +401 -0
  1630. tests/util/test_stream_change_cache.py +304 -0
  1631. tests/util/test_stringutils.py +86 -0
  1632. tests/util/test_task_scheduler.py +227 -0
  1633. tests/util/test_threepids.py +55 -0
  1634. tests/util/test_treecache.py +93 -0
  1635. tests/util/test_wheel_timer.py +82 -0
  1636. tests/utils.py +342 -0
@@ -0,0 +1,1961 @@
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
+
15
+ import itertools
16
+ import logging
17
+ from itertools import chain
18
+ from typing import TYPE_CHECKING, AbstractSet, Mapping
19
+
20
+ import attr
21
+ from prometheus_client import Histogram
22
+ from typing_extensions import assert_never
23
+
24
+ from synapse.api.constants import Direction, EventTypes, Membership
25
+ from synapse.events import EventBase
26
+ from synapse.events.utils import strip_event
27
+ from synapse.handlers.relations import BundledAggregations
28
+ from synapse.handlers.sliding_sync.extensions import SlidingSyncExtensionHandler
29
+ from synapse.handlers.sliding_sync.room_lists import (
30
+ RoomsForUserType,
31
+ SlidingSyncRoomLists,
32
+ )
33
+ from synapse.handlers.sliding_sync.store import SlidingSyncConnectionStore
34
+ from synapse.logging.opentracing import (
35
+ SynapseTags,
36
+ log_kv,
37
+ set_tag,
38
+ start_active_span,
39
+ tag_args,
40
+ trace,
41
+ )
42
+ from synapse.metrics import SERVER_NAME_LABEL
43
+ from synapse.storage.databases.main.roommember import extract_heroes_from_room_summary
44
+ from synapse.storage.databases.main.state_deltas import StateDelta
45
+ from synapse.storage.databases.main.stream import PaginateFunction
46
+ from synapse.storage.roommember import (
47
+ MemberSummary,
48
+ )
49
+ from synapse.types import (
50
+ JsonDict,
51
+ MutableStateMap,
52
+ PersistedEventPosition,
53
+ Requester,
54
+ RoomStreamToken,
55
+ SlidingSyncStreamToken,
56
+ StateMap,
57
+ StrCollection,
58
+ StreamKeyType,
59
+ StreamToken,
60
+ )
61
+ from synapse.types.handlers import SLIDING_SYNC_DEFAULT_BUMP_EVENT_TYPES
62
+ from synapse.types.handlers.sliding_sync import (
63
+ HaveSentRoomFlag,
64
+ MutablePerConnectionState,
65
+ PerConnectionState,
66
+ RoomLazyMembershipChanges,
67
+ RoomSyncConfig,
68
+ SlidingSyncConfig,
69
+ SlidingSyncResult,
70
+ StateValues,
71
+ )
72
+ from synapse.types.state import StateFilter
73
+ from synapse.util.async_helpers import concurrently_execute
74
+ from synapse.visibility import filter_and_transform_events_for_client
75
+
76
+ if TYPE_CHECKING:
77
+ from synapse.server import HomeServer
78
+
79
+ logger = logging.getLogger(__name__)
80
+
81
+
82
+ sync_processing_time = Histogram(
83
+ "synapse_sliding_sync_processing_time",
84
+ "Time taken to generate a sliding sync response, ignoring wait times.",
85
+ labelnames=["initial", SERVER_NAME_LABEL],
86
+ )
87
+
88
+ # Limit the number of state_keys we should remember sending down the connection for each
89
+ # (room_id, user_id). We don't want to store and pull out too much data in the database.
90
+ #
91
+ # 100 is an arbitrary but small-ish number. The idea is that we probably won't send down
92
+ # too many redundant member state events (that the client already knows about) for a
93
+ # given ongoing conversation if we keep 100 around. Most rooms don't have 100 members
94
+ # anyway and it takes a while to cycle through 100 members.
95
+ MAX_NUMBER_PREVIOUS_STATE_KEYS_TO_REMEMBER = 100
96
+
97
+
98
+ class SlidingSyncHandler:
99
+ def __init__(self, hs: "HomeServer"):
100
+ self.server_name = hs.hostname
101
+ self.clock = hs.get_clock()
102
+ self.store = hs.get_datastores().main
103
+ self.storage_controllers = hs.get_storage_controllers()
104
+ self.auth_blocking = hs.get_auth_blocking()
105
+ self.notifier = hs.get_notifier()
106
+ self.event_sources = hs.get_event_sources()
107
+ self.relations_handler = hs.get_relations_handler()
108
+ self.rooms_to_exclude_globally = hs.config.server.rooms_to_exclude_from_sync
109
+ self.is_mine_id = hs.is_mine_id
110
+
111
+ self.connection_store = SlidingSyncConnectionStore(self.clock, self.store)
112
+ self.extensions = SlidingSyncExtensionHandler(hs)
113
+ self.room_lists = SlidingSyncRoomLists(hs)
114
+
115
+ async def wait_for_sync_for_user(
116
+ self,
117
+ requester: Requester,
118
+ sync_config: SlidingSyncConfig,
119
+ from_token: SlidingSyncStreamToken | None = None,
120
+ timeout_ms: int = 0,
121
+ ) -> tuple[SlidingSyncResult, bool]:
122
+ """
123
+ Get the sync for a client if we have new data for it now. Otherwise
124
+ wait for new data to arrive on the server. If the timeout expires, then
125
+ return an empty sync result.
126
+
127
+ Args:
128
+ requester: The user making the request
129
+ sync_config: Sync configuration
130
+ from_token: The point in the stream to sync from. Token of the end of the
131
+ previous batch. May be `None` if this is the initial sync request.
132
+ timeout_ms: The time in milliseconds to wait for new data to arrive. If 0,
133
+ we will respond immediately but there might not be any new data so we just
134
+ return an empty response.
135
+
136
+ Returns:
137
+ A tuple containing the `SlidingSyncResult` and whether we waited for new
138
+ activity before responding. Knowing whether we waited is useful in traces
139
+ to filter out long-running requests where we were just waiting.
140
+ """
141
+ did_wait = False
142
+
143
+ # If the user is not part of the mau group, then check that limits have
144
+ # not been exceeded (if not part of the group by this point, almost certain
145
+ # auth_blocking will occur)
146
+ await self.auth_blocking.check_auth_blocking(requester=requester)
147
+
148
+ # If we're working with a user-provided token, we need to make sure to wait for
149
+ # this worker to catch up with the token so we don't skip past any incoming
150
+ # events or future events if the user is nefariously, manually modifying the
151
+ # token.
152
+ if from_token is not None:
153
+ # We need to make sure this worker has caught up with the token. If
154
+ # this returns false, it means we timed out waiting, and we should
155
+ # just return an empty response.
156
+ before_wait_ts = self.clock.time_msec()
157
+ if not await self.notifier.wait_for_stream_token(from_token.stream_token):
158
+ logger.warning(
159
+ "Timed out waiting for worker to catch up. Returning empty response"
160
+ )
161
+ return SlidingSyncResult.empty(from_token), did_wait
162
+
163
+ # If we've spent significant time waiting to catch up, take it off
164
+ # the timeout.
165
+ after_wait_ts = self.clock.time_msec()
166
+ if after_wait_ts - before_wait_ts > 1_000:
167
+ timeout_ms -= after_wait_ts - before_wait_ts
168
+ timeout_ms = max(timeout_ms, 0)
169
+
170
+ # We're going to respond immediately if the timeout is 0 or if this is an
171
+ # initial sync (without a `from_token`) so we can avoid calling
172
+ # `notifier.wait_for_events()`.
173
+ if timeout_ms == 0 or from_token is None:
174
+ now_token = self.event_sources.get_current_token()
175
+ result = await self.current_sync_for_user(
176
+ sync_config,
177
+ from_token=from_token,
178
+ to_token=now_token,
179
+ )
180
+ else:
181
+ # Otherwise, we wait for something to happen and report it to the user.
182
+ async def current_sync_callback(
183
+ before_token: StreamToken, after_token: StreamToken
184
+ ) -> SlidingSyncResult:
185
+ return await self.current_sync_for_user(
186
+ sync_config,
187
+ from_token=from_token,
188
+ to_token=after_token,
189
+ )
190
+
191
+ result = await self.notifier.wait_for_events(
192
+ sync_config.user.to_string(),
193
+ timeout_ms,
194
+ current_sync_callback,
195
+ from_token=from_token.stream_token,
196
+ )
197
+ did_wait = True
198
+
199
+ return result, did_wait
200
+
201
+ @trace
202
+ async def current_sync_for_user(
203
+ self,
204
+ sync_config: SlidingSyncConfig,
205
+ to_token: StreamToken,
206
+ from_token: SlidingSyncStreamToken | None = None,
207
+ ) -> SlidingSyncResult:
208
+ """
209
+ Generates the response body of a Sliding Sync result, represented as a
210
+ `SlidingSyncResult`.
211
+
212
+ We fetch data according to the token range (> `from_token` and <= `to_token`).
213
+
214
+ Args:
215
+ sync_config: Sync configuration
216
+ to_token: The latest point in the stream to sync up to.
217
+ from_token: The point in the stream to sync from. Token of the end of the
218
+ previous batch. May be `None` if this is the initial sync request.
219
+ """
220
+ start_time_s = self.clock.time()
221
+
222
+ user_id = sync_config.user.to_string()
223
+ app_service = self.store.get_app_service_by_user_id(user_id)
224
+ if app_service:
225
+ # We no longer support AS users using /sync directly.
226
+ # See https://github.com/matrix-org/matrix-doc/issues/1144
227
+ raise NotImplementedError()
228
+
229
+ # Get the per-connection state (if any).
230
+ #
231
+ # Raises an exception if there is a `connection_position` that we don't
232
+ # recognize. If we don't do this and the client asks for the full range
233
+ # of rooms, we end up sending down all rooms and their state from
234
+ # scratch (which can be very slow). By expiring the connection we allow
235
+ # the client a chance to do an initial request with a smaller range of
236
+ # rooms to get them some results sooner but will end up taking the same
237
+ # amount of time (more with round-trips and re-processing) in the end to
238
+ # get everything again.
239
+ previous_connection_state = (
240
+ await self.connection_store.get_and_clear_connection_positions(
241
+ sync_config, from_token
242
+ )
243
+ )
244
+
245
+ # Get all of the room IDs that the user should be able to see in the sync
246
+ # response
247
+ has_lists = sync_config.lists is not None and len(sync_config.lists) > 0
248
+ has_room_subscriptions = (
249
+ sync_config.room_subscriptions is not None
250
+ and len(sync_config.room_subscriptions) > 0
251
+ )
252
+
253
+ interested_rooms = await self.room_lists.compute_interested_rooms(
254
+ sync_config=sync_config,
255
+ previous_connection_state=previous_connection_state,
256
+ from_token=from_token.stream_token if from_token else None,
257
+ to_token=to_token,
258
+ )
259
+
260
+ lists = interested_rooms.lists
261
+ relevant_room_map = interested_rooms.relevant_room_map
262
+ all_rooms = interested_rooms.all_rooms
263
+ room_membership_for_user_map = interested_rooms.room_membership_for_user_map
264
+ relevant_rooms_to_send_map = interested_rooms.relevant_rooms_to_send_map
265
+
266
+ # Fetch room data
267
+ rooms: dict[str, SlidingSyncResult.RoomResult] = {}
268
+
269
+ new_connection_state = previous_connection_state.get_mutable()
270
+
271
+ @trace
272
+ @tag_args
273
+ async def handle_room(room_id: str) -> None:
274
+ room_sync_result = await self.get_room_sync_data(
275
+ sync_config=sync_config,
276
+ previous_connection_state=previous_connection_state,
277
+ new_connection_state=new_connection_state,
278
+ room_id=room_id,
279
+ room_sync_config=relevant_rooms_to_send_map[room_id],
280
+ room_membership_for_user_at_to_token=room_membership_for_user_map[
281
+ room_id
282
+ ],
283
+ from_token=from_token,
284
+ to_token=to_token,
285
+ newly_joined=room_id in interested_rooms.newly_joined_rooms,
286
+ newly_left=room_id in interested_rooms.newly_left_rooms,
287
+ is_dm=room_id in interested_rooms.dm_room_ids,
288
+ )
289
+
290
+ # Filter out empty room results during incremental sync
291
+ if room_sync_result or not from_token:
292
+ rooms[room_id] = room_sync_result
293
+
294
+ if relevant_rooms_to_send_map:
295
+ with start_active_span("sliding_sync.generate_room_entries"):
296
+ await concurrently_execute(handle_room, relevant_rooms_to_send_map, 20)
297
+
298
+ extensions = await self.extensions.get_extensions_response(
299
+ sync_config=sync_config,
300
+ actual_lists=lists,
301
+ previous_connection_state=previous_connection_state,
302
+ new_connection_state=new_connection_state,
303
+ # We're purposely using `relevant_room_map` instead of
304
+ # `relevant_rooms_to_send_map` here. This needs to be all room_ids we could
305
+ # send regardless of whether they have an event update or not. The
306
+ # extensions care about more than just normal events in the rooms (like
307
+ # account data, read receipts, typing indicators, to-device messages, etc).
308
+ actual_room_ids=set(relevant_room_map.keys()),
309
+ actual_room_response_map=rooms,
310
+ from_token=from_token,
311
+ to_token=to_token,
312
+ )
313
+
314
+ if has_lists or has_room_subscriptions:
315
+ # We now calculate if any rooms outside the range have had updates,
316
+ # which we are not sending down.
317
+ #
318
+ # We *must* record rooms that have had updates, but it is also fine
319
+ # to record rooms as having updates even if there might not actually
320
+ # be anything new for the user (e.g. due to event filters, events
321
+ # having happened after the user left, etc).
322
+ if from_token:
323
+ # The set of rooms that the client (may) care about, but aren't
324
+ # in any list range (or subscribed to).
325
+ missing_rooms = all_rooms - relevant_room_map.keys()
326
+
327
+ # We now just go and try fetching any events in the above rooms
328
+ # to see if anything has happened since the `from_token`.
329
+ #
330
+ # TODO: Replace this with something faster. When we land the
331
+ # sliding sync tables that record the most recent event
332
+ # positions we can use that.
333
+ unsent_room_ids: StrCollection
334
+ if await self.store.have_finished_sliding_sync_background_jobs():
335
+ unsent_room_ids = await (
336
+ self.store.get_rooms_that_have_updates_since_sliding_sync_table(
337
+ room_ids=missing_rooms,
338
+ from_key=from_token.stream_token.room_key,
339
+ )
340
+ )
341
+ else:
342
+ missing_event_map_by_room = (
343
+ await self.store.get_room_events_stream_for_rooms(
344
+ room_ids=missing_rooms,
345
+ from_key=to_token.room_key,
346
+ to_key=from_token.stream_token.room_key,
347
+ limit=1,
348
+ )
349
+ )
350
+ unsent_room_ids = list(missing_event_map_by_room)
351
+
352
+ new_connection_state.rooms.record_unsent_rooms(
353
+ unsent_room_ids, from_token.stream_token.room_key
354
+ )
355
+
356
+ new_connection_state.rooms.record_sent_rooms(
357
+ relevant_rooms_to_send_map.keys()
358
+ )
359
+
360
+ connection_position = await self.connection_store.record_new_state(
361
+ sync_config=sync_config,
362
+ from_token=from_token,
363
+ new_connection_state=new_connection_state,
364
+ )
365
+ elif from_token:
366
+ connection_position = from_token.connection_position
367
+ else:
368
+ # Initial sync without a `from_token` starts at `0`
369
+ connection_position = 0
370
+
371
+ sliding_sync_result = SlidingSyncResult(
372
+ next_pos=SlidingSyncStreamToken(to_token, connection_position),
373
+ lists=lists,
374
+ rooms=rooms,
375
+ extensions=extensions,
376
+ )
377
+
378
+ # Make it easy to find traces for syncs that aren't empty
379
+ set_tag(SynapseTags.RESULT_PREFIX + "result", bool(sliding_sync_result))
380
+ set_tag(SynapseTags.FUNC_ARG_PREFIX + "sync_config.user", user_id)
381
+
382
+ end_time_s = self.clock.time()
383
+ sync_processing_time.labels(
384
+ initial=from_token is not None, **{SERVER_NAME_LABEL: self.server_name}
385
+ ).observe(end_time_s - start_time_s)
386
+
387
+ return sliding_sync_result
388
+
389
+ @trace
390
+ async def get_current_state_ids_at(
391
+ self,
392
+ room_id: str,
393
+ room_membership_for_user_at_to_token: RoomsForUserType,
394
+ state_filter: StateFilter,
395
+ to_token: StreamToken,
396
+ ) -> StateMap[str]:
397
+ """
398
+ Get current state IDs for the user in the room according to their membership. This
399
+ will be the current state at the time of their LEAVE/BAN, otherwise will be the
400
+ current state <= to_token.
401
+
402
+ Args:
403
+ room_id: The room ID to fetch data for
404
+ room_membership_for_user_at_token: Membership information for the user
405
+ in the room at the time of `to_token`.
406
+ to_token: The point in the stream to sync up to.
407
+ """
408
+ state_ids: StateMap[str]
409
+ # People shouldn't see past their leave/ban event
410
+ if room_membership_for_user_at_to_token.membership in (
411
+ Membership.LEAVE,
412
+ Membership.BAN,
413
+ ):
414
+ # TODO: `get_state_ids_at(...)` doesn't take into account the "current
415
+ # state". Maybe we need to use
416
+ # `get_forward_extremities_for_room_at_stream_ordering(...)` to "Fetch the
417
+ # current state at the time."
418
+ state_ids = await self.storage_controllers.state.get_state_ids_at(
419
+ room_id,
420
+ stream_position=to_token.copy_and_replace(
421
+ StreamKeyType.ROOM,
422
+ room_membership_for_user_at_to_token.event_pos.to_room_stream_token(),
423
+ ),
424
+ state_filter=state_filter,
425
+ # Partially-stated rooms should have all state events except for
426
+ # remote membership events. Since we've already excluded
427
+ # partially-stated rooms unless `required_state` only has
428
+ # `["m.room.member", "$LAZY"]` for membership, we should be able to
429
+ # retrieve everything requested. When we're lazy-loading, if there
430
+ # are some remote senders in the timeline, we should also have their
431
+ # membership event because we had to auth that timeline event. Plus
432
+ # we don't want to block the whole sync waiting for this one room.
433
+ await_full_state=False,
434
+ )
435
+ # Otherwise, we can get the latest current state in the room
436
+ else:
437
+ state_ids = await self.storage_controllers.state.get_current_state_ids(
438
+ room_id,
439
+ state_filter,
440
+ # Partially-stated rooms should have all state events except for
441
+ # remote membership events. Since we've already excluded
442
+ # partially-stated rooms unless `required_state` only has
443
+ # `["m.room.member", "$LAZY"]` for membership, we should be able to
444
+ # retrieve everything requested. When we're lazy-loading, if there
445
+ # are some remote senders in the timeline, we should also have their
446
+ # membership event because we had to auth that timeline event. Plus
447
+ # we don't want to block the whole sync waiting for this one room.
448
+ await_full_state=False,
449
+ )
450
+ # TODO: Query `current_state_delta_stream` and reverse/rewind back to the `to_token`
451
+
452
+ return state_ids
453
+
454
+ @trace
455
+ async def get_current_state_at(
456
+ self,
457
+ room_id: str,
458
+ room_membership_for_user_at_to_token: RoomsForUserType,
459
+ state_filter: StateFilter,
460
+ to_token: StreamToken,
461
+ ) -> StateMap[EventBase]:
462
+ """
463
+ Get current state for the user in the room according to their membership. This
464
+ will be the current state at the time of their LEAVE/BAN, otherwise will be the
465
+ current state <= to_token.
466
+
467
+ Args:
468
+ room_id: The room ID to fetch data for
469
+ room_membership_for_user_at_token: Membership information for the user
470
+ in the room at the time of `to_token`.
471
+ to_token: The point in the stream to sync up to.
472
+ """
473
+ state_ids = await self.get_current_state_ids_at(
474
+ room_id=room_id,
475
+ room_membership_for_user_at_to_token=room_membership_for_user_at_to_token,
476
+ state_filter=state_filter,
477
+ to_token=to_token,
478
+ )
479
+
480
+ events = await self.store.get_events_as_list(list(state_ids.values()))
481
+
482
+ state_map = {}
483
+ for event in events:
484
+ state_map[(event.type, event.state_key)] = event
485
+
486
+ return state_map
487
+
488
+ @trace
489
+ async def get_current_state_deltas_for_room(
490
+ self,
491
+ room_id: str,
492
+ room_membership_for_user_at_to_token: RoomsForUserType,
493
+ from_token: RoomStreamToken,
494
+ to_token: RoomStreamToken,
495
+ ) -> list[StateDelta]:
496
+ """
497
+ Get the state deltas between two tokens taking into account the user's
498
+ membership. If the user is LEAVE/BAN, we will only get the state deltas up to
499
+ their LEAVE/BAN event (inclusive).
500
+
501
+ (> `from_token` and <= `to_token`)
502
+ """
503
+ membership = room_membership_for_user_at_to_token.membership
504
+ # We don't know how to handle `membership` values other than these. The
505
+ # code below would need to be updated.
506
+ assert membership in (
507
+ Membership.JOIN,
508
+ Membership.INVITE,
509
+ Membership.KNOCK,
510
+ Membership.LEAVE,
511
+ Membership.BAN,
512
+ )
513
+
514
+ # People shouldn't see past their leave/ban event
515
+ if membership in (
516
+ Membership.LEAVE,
517
+ Membership.BAN,
518
+ ):
519
+ to_bound = (
520
+ room_membership_for_user_at_to_token.event_pos.to_room_stream_token()
521
+ )
522
+ # If we are participating in the room, we can get the latest current state in
523
+ # the room
524
+ elif membership == Membership.JOIN:
525
+ to_bound = to_token
526
+ # We can only rely on the stripped state included in the invite/knock event
527
+ # itself so there will never be any state deltas to send down.
528
+ elif membership in (Membership.INVITE, Membership.KNOCK):
529
+ return []
530
+ else:
531
+ # We don't know how to handle this type of membership yet
532
+ #
533
+ # FIXME: We should use `assert_never` here but for some reason
534
+ # the exhaustive matching doesn't recognize the `Never` here.
535
+ # assert_never(membership)
536
+ raise AssertionError(
537
+ f"Unexpected membership {membership} that we don't know how to handle yet"
538
+ )
539
+
540
+ return await self.store.get_current_state_deltas_for_room(
541
+ room_id=room_id,
542
+ from_token=from_token,
543
+ to_token=to_bound,
544
+ )
545
+
546
+ @trace
547
+ async def get_room_sync_data(
548
+ self,
549
+ sync_config: SlidingSyncConfig,
550
+ previous_connection_state: "PerConnectionState",
551
+ new_connection_state: "MutablePerConnectionState",
552
+ room_id: str,
553
+ room_sync_config: RoomSyncConfig,
554
+ room_membership_for_user_at_to_token: RoomsForUserType,
555
+ from_token: SlidingSyncStreamToken | None,
556
+ to_token: StreamToken,
557
+ newly_joined: bool,
558
+ newly_left: bool,
559
+ is_dm: bool,
560
+ ) -> SlidingSyncResult.RoomResult:
561
+ """
562
+ Fetch room data for the sync response.
563
+
564
+ We fetch data according to the token range (> `from_token` and <= `to_token`).
565
+
566
+ Args:
567
+ user: User to fetch data for
568
+ room_id: The room ID to fetch data for
569
+ room_sync_config: Config for what data we should fetch for a room in the
570
+ sync response.
571
+ room_membership_for_user_at_to_token: Membership information for the user
572
+ in the room at the time of `to_token`.
573
+ from_token: The point in the stream to sync from.
574
+ to_token: The point in the stream to sync up to.
575
+ newly_joined: If the user has newly joined the room
576
+ newly_left: If the user has newly left the room
577
+ is_dm: Whether the room is a DM room
578
+ """
579
+ user = sync_config.user
580
+
581
+ set_tag(
582
+ SynapseTags.FUNC_ARG_PREFIX + "membership",
583
+ room_membership_for_user_at_to_token.membership,
584
+ )
585
+ set_tag(
586
+ SynapseTags.FUNC_ARG_PREFIX + "timeline_limit",
587
+ room_sync_config.timeline_limit,
588
+ )
589
+
590
+ # Handle state resets. For example, if we see
591
+ # `room_membership_for_user_at_to_token.event_id=None and
592
+ # room_membership_for_user_at_to_token.membership is not None`, we should
593
+ # indicate to the client that a state reset happened. Perhaps we should indicate
594
+ # this by setting `initial: True` and empty `required_state: []`.
595
+ state_reset_out_of_room = False
596
+ if (
597
+ room_membership_for_user_at_to_token.event_id is None
598
+ and room_membership_for_user_at_to_token.membership is not None
599
+ ):
600
+ # We only expect the `event_id` to be `None` if you've been state reset out
601
+ # of the room (meaning you're no longer in the room). We could put this as
602
+ # part of the if-statement above but we want to handle every case where
603
+ # `event_id` is `None`.
604
+ assert room_membership_for_user_at_to_token.membership is Membership.LEAVE
605
+
606
+ state_reset_out_of_room = True
607
+
608
+ prev_room_sync_config = previous_connection_state.room_configs.get(room_id)
609
+
610
+ # Determine whether we should limit the timeline to the token range.
611
+ #
612
+ # We should return historical messages (before token range) in the
613
+ # following cases because we want clients to be able to show a basic
614
+ # screen of information:
615
+ #
616
+ # - Initial sync (because no `from_token` to limit us anyway)
617
+ # - When users `newly_joined`
618
+ # - For an incremental sync where we haven't sent it down this
619
+ # connection before
620
+ #
621
+ # Relevant spec issue:
622
+ # https://github.com/matrix-org/matrix-spec/issues/1917
623
+ #
624
+ # XXX: Odd behavior - We also check if the `timeline_limit` has increased, if so
625
+ # we ignore the from bound for the timeline to send down a larger chunk of
626
+ # history and set `unstable_expanded_timeline` to true. This is only being added
627
+ # to match the behavior of the Sliding Sync proxy as we expect the ElementX
628
+ # client to feel a certain way and be able to trickle in a full page of timeline
629
+ # messages to fill up the screen. This is a bit different to the behavior of the
630
+ # Sliding Sync proxy (which sets initial=true, but then doesn't send down the
631
+ # full state again), but existing apps, e.g. ElementX, just need `limited` set.
632
+ # We don't explicitly set `limited` but this will be the case for any room that
633
+ # has more history than we're trying to pull out. Using
634
+ # `unstable_expanded_timeline` allows us to avoid contaminating what `initial`
635
+ # or `limited` mean for clients that interpret them correctly. In future this
636
+ # behavior is almost certainly going to change.
637
+ #
638
+ from_bound = None
639
+ initial = True
640
+ ignore_timeline_bound = False
641
+ if from_token and not newly_joined and not state_reset_out_of_room:
642
+ room_status = previous_connection_state.rooms.have_sent_room(room_id)
643
+ if room_status.status == HaveSentRoomFlag.LIVE:
644
+ from_bound = from_token.stream_token.room_key
645
+ initial = False
646
+ elif room_status.status == HaveSentRoomFlag.PREVIOUSLY:
647
+ assert room_status.last_token is not None
648
+ from_bound = room_status.last_token
649
+ initial = False
650
+ elif room_status.status == HaveSentRoomFlag.NEVER:
651
+ from_bound = None
652
+ initial = True
653
+ else:
654
+ assert_never(room_status.status)
655
+
656
+ log_kv({"sliding_sync.room_status": room_status})
657
+
658
+ if prev_room_sync_config is not None:
659
+ # Check if the timeline limit has increased, if so ignore the
660
+ # timeline bound and record the change (see "XXX: Odd behavior"
661
+ # above).
662
+ if (
663
+ prev_room_sync_config.timeline_limit
664
+ < room_sync_config.timeline_limit
665
+ ):
666
+ ignore_timeline_bound = True
667
+
668
+ log_kv(
669
+ {
670
+ "sliding_sync.from_bound": from_bound,
671
+ "sliding_sync.initial": initial,
672
+ "sliding_sync.ignore_timeline_bound": ignore_timeline_bound,
673
+ }
674
+ )
675
+
676
+ # Assemble the list of timeline events
677
+ #
678
+ # FIXME: It would be nice to make the `rooms` response more uniform regardless of
679
+ # membership. Currently, we have to make all of these optional because
680
+ # `invite`/`knock` rooms only have `stripped_state`. See
681
+ # https://github.com/matrix-org/matrix-spec-proposals/pull/3575#discussion_r1653045932
682
+ timeline_events: list[EventBase] = []
683
+ bundled_aggregations: dict[str, BundledAggregations] | None = None
684
+ limited: bool | None = None
685
+ prev_batch_token: StreamToken | None = None
686
+ num_live: int | None = None
687
+ if (
688
+ room_sync_config.timeline_limit > 0
689
+ # No timeline for invite/knock rooms (just `stripped_state`)
690
+ and room_membership_for_user_at_to_token.membership
691
+ not in (Membership.INVITE, Membership.KNOCK)
692
+ ):
693
+ limited = False
694
+ # We want to start off using the `to_token` (vs `from_token`) because we look
695
+ # backwards from the `to_token` up to the `timeline_limit` and we might not
696
+ # reach the `from_token` before we hit the limit. We will update the room stream
697
+ # position once we've fetched the events to point to the earliest event fetched.
698
+ prev_batch_token = to_token
699
+
700
+ # We're going to paginate backwards from the `to_token`
701
+ to_bound = to_token.room_key
702
+ # People shouldn't see past their leave/ban event
703
+ if room_membership_for_user_at_to_token.membership in (
704
+ Membership.LEAVE,
705
+ Membership.BAN,
706
+ ):
707
+ to_bound = room_membership_for_user_at_to_token.event_pos.to_room_stream_token()
708
+
709
+ timeline_from_bound = from_bound
710
+ if ignore_timeline_bound:
711
+ timeline_from_bound = None
712
+
713
+ # For initial `/sync` (and other historical scenarios mentioned above), we
714
+ # want to view a historical section of the timeline; to fetch events by
715
+ # `topological_ordering` (best representation of the room DAG as others were
716
+ # seeing it at the time). This also aligns with the order that `/messages`
717
+ # returns events in.
718
+ #
719
+ # For incremental `/sync`, we want to get all updates for rooms since
720
+ # the last `/sync` (regardless if those updates arrived late or happened
721
+ # a while ago in the past); to fetch events by `stream_ordering` (in the
722
+ # order they were received by the server).
723
+ #
724
+ # Relevant spec issue: https://github.com/matrix-org/matrix-spec/issues/1917
725
+ #
726
+ # FIXME: Using workaround for mypy,
727
+ # https://github.com/python/mypy/issues/10740#issuecomment-1997047277 and
728
+ # https://github.com/python/mypy/issues/17479
729
+ paginate_room_events_by_topological_ordering: PaginateFunction = (
730
+ self.store.paginate_room_events_by_topological_ordering
731
+ )
732
+ paginate_room_events_by_stream_ordering: PaginateFunction = (
733
+ self.store.paginate_room_events_by_stream_ordering
734
+ )
735
+ pagination_method: PaginateFunction = (
736
+ # Use `topographical_ordering` for historical events
737
+ paginate_room_events_by_topological_ordering
738
+ if timeline_from_bound is None
739
+ # Use `stream_ordering` for updates
740
+ else paginate_room_events_by_stream_ordering
741
+ )
742
+ timeline_events, new_room_key, limited = await pagination_method(
743
+ room_id=room_id,
744
+ # The bounds are reversed so we can paginate backwards
745
+ # (from newer to older events) starting at to_bound.
746
+ # This ensures we fill the `limit` with the newest events first,
747
+ from_key=to_bound,
748
+ to_key=timeline_from_bound,
749
+ direction=Direction.BACKWARDS,
750
+ limit=room_sync_config.timeline_limit,
751
+ )
752
+
753
+ # We want to return the events in ascending order (the last event is the
754
+ # most recent).
755
+ timeline_events.reverse()
756
+
757
+ # Make sure we don't expose any events that the client shouldn't see
758
+ timeline_events = await filter_and_transform_events_for_client(
759
+ self.storage_controllers,
760
+ user.to_string(),
761
+ timeline_events,
762
+ is_peeking=room_membership_for_user_at_to_token.membership
763
+ != Membership.JOIN,
764
+ filter_send_to_client=True,
765
+ )
766
+
767
+ # TODO: Handle timeline gaps (`get_timeline_gaps()`)
768
+
769
+ # Determine how many "live" events we have (events within the given token range).
770
+ #
771
+ # This is mostly useful to determine whether a given @mention event should
772
+ # make a noise or not. Clients cannot rely solely on the absence of
773
+ # `initial: true` to determine live events because if a room not in the
774
+ # sliding window bumps into the window because of an @mention it will have
775
+ # `initial: true` yet contain a single live event (with potentially other
776
+ # old events in the timeline)
777
+ num_live = 0
778
+ if from_token is not None:
779
+ for timeline_event in reversed(timeline_events):
780
+ # This fields should be present for all persisted events
781
+ assert timeline_event.internal_metadata.stream_ordering is not None
782
+ assert timeline_event.internal_metadata.instance_name is not None
783
+
784
+ persisted_position = PersistedEventPosition(
785
+ instance_name=timeline_event.internal_metadata.instance_name,
786
+ stream=timeline_event.internal_metadata.stream_ordering,
787
+ )
788
+ if persisted_position.persisted_after(
789
+ from_token.stream_token.room_key
790
+ ):
791
+ num_live += 1
792
+ else:
793
+ # Since we're iterating over the timeline events in
794
+ # reverse-chronological order, we can break once we hit an event
795
+ # that's not live. In the future, we could potentially optimize
796
+ # this more with a binary search (bisect).
797
+ break
798
+
799
+ # If the timeline is `limited=True`, the client does not have all events
800
+ # necessary to calculate aggregations themselves.
801
+ if limited:
802
+ bundled_aggregations = (
803
+ await self.relations_handler.get_bundled_aggregations(
804
+ timeline_events, user.to_string()
805
+ )
806
+ )
807
+
808
+ # Update the `prev_batch_token` to point to the position that allows us to
809
+ # keep paginating backwards from the oldest event we return in the timeline.
810
+ prev_batch_token = prev_batch_token.copy_and_replace(
811
+ StreamKeyType.ROOM, new_room_key
812
+ )
813
+
814
+ # Figure out any stripped state events for invite/knocks. This allows the
815
+ # potential joiner to identify the room.
816
+ stripped_state: list[JsonDict] = []
817
+ if room_membership_for_user_at_to_token.membership in (
818
+ Membership.INVITE,
819
+ Membership.KNOCK,
820
+ ):
821
+ # This should never happen. If someone is invited/knocked on room, then
822
+ # there should be an event for it.
823
+ assert room_membership_for_user_at_to_token.event_id is not None
824
+
825
+ invite_or_knock_event = await self.store.get_event(
826
+ room_membership_for_user_at_to_token.event_id
827
+ )
828
+
829
+ stripped_state = []
830
+ if invite_or_knock_event.membership == Membership.INVITE:
831
+ invite_state = invite_or_knock_event.unsigned.get(
832
+ "invite_room_state", []
833
+ )
834
+ if not isinstance(invite_state, list):
835
+ invite_state = []
836
+
837
+ stripped_state.extend(invite_state)
838
+ elif invite_or_knock_event.membership == Membership.KNOCK:
839
+ knock_state = invite_or_knock_event.unsigned.get("knock_room_state", [])
840
+ if not isinstance(knock_state, list):
841
+ knock_state = []
842
+
843
+ stripped_state.extend(knock_state)
844
+
845
+ stripped_state.append(strip_event(invite_or_knock_event))
846
+
847
+ # Get the changes to current state in the token range from the
848
+ # `current_state_delta_stream` table.
849
+ #
850
+ # For incremental syncs, we can do this first to determine if something relevant
851
+ # has changed and strategically avoid fetching other costly things.
852
+ room_state_delta_id_map: MutableStateMap[str] = {}
853
+ name_event_id: str | None = None
854
+ membership_changed = False
855
+ name_changed = False
856
+ avatar_changed = False
857
+ if initial:
858
+ # Check whether the room has a name set
859
+ name_state_ids = await self.get_current_state_ids_at(
860
+ room_id=room_id,
861
+ room_membership_for_user_at_to_token=room_membership_for_user_at_to_token,
862
+ state_filter=StateFilter.from_types([(EventTypes.Name, "")]),
863
+ to_token=to_token,
864
+ )
865
+ name_event_id = name_state_ids.get((EventTypes.Name, ""))
866
+ else:
867
+ assert from_bound is not None
868
+
869
+ # TODO: Limit the number of state events we're about to send down
870
+ # the room, if its too many we should change this to an
871
+ # `initial=True`?
872
+
873
+ # For the case of rejecting remote invites, the leave event won't be
874
+ # returned by `get_current_state_deltas_for_room`. This is due to the current
875
+ # state only being filled out for rooms the server is in, and so doesn't pick
876
+ # up out-of-band leaves (including locally rejected invites) as these events
877
+ # are outliers and not added to the `current_state_delta_stream`.
878
+ #
879
+ # We rely on being explicitly told that the room has been `newly_left` to
880
+ # ensure we extract the out-of-band leave.
881
+ if newly_left and room_membership_for_user_at_to_token.event_id is not None:
882
+ membership_changed = True
883
+ leave_event = await self.store.get_event(
884
+ room_membership_for_user_at_to_token.event_id
885
+ )
886
+ state_key = leave_event.get_state_key()
887
+ if state_key is not None:
888
+ room_state_delta_id_map[(leave_event.type, state_key)] = (
889
+ room_membership_for_user_at_to_token.event_id
890
+ )
891
+
892
+ deltas = await self.get_current_state_deltas_for_room(
893
+ room_id=room_id,
894
+ room_membership_for_user_at_to_token=room_membership_for_user_at_to_token,
895
+ from_token=from_bound,
896
+ to_token=to_token.room_key,
897
+ )
898
+ for delta in deltas:
899
+ # TODO: Handle state resets where event_id is None
900
+ if delta.event_id is not None:
901
+ room_state_delta_id_map[(delta.event_type, delta.state_key)] = (
902
+ delta.event_id
903
+ )
904
+
905
+ if delta.event_type == EventTypes.Member:
906
+ membership_changed = True
907
+ elif delta.event_type == EventTypes.Name and delta.state_key == "":
908
+ name_changed = True
909
+ elif (
910
+ delta.event_type == EventTypes.RoomAvatar and delta.state_key == ""
911
+ ):
912
+ avatar_changed = True
913
+
914
+ # We only need the room summary for calculating heroes, however if we do
915
+ # fetch it then we can use it to calculate `joined_count` and
916
+ # `invited_count`.
917
+ room_membership_summary: Mapping[str, MemberSummary] | None = None
918
+
919
+ # `heroes` are required if the room name is not set.
920
+ #
921
+ # Note: When you're the first one on your server to be invited to a new room
922
+ # over federation, we only have access to some stripped state in
923
+ # `event.unsigned.invite_room_state` which currently doesn't include `heroes`,
924
+ # see https://github.com/matrix-org/matrix-spec/issues/380. This means that
925
+ # clients won't be able to calculate the room name when necessary and just a
926
+ # pitfall we have to deal with until that spec issue is resolved.
927
+ hero_user_ids: list[str] = []
928
+ # TODO: Should we also check for `EventTypes.CanonicalAlias`
929
+ # (`m.room.canonical_alias`) as a fallback for the room name? see
930
+ # https://github.com/matrix-org/matrix-spec-proposals/pull/3575#discussion_r1671260153
931
+ #
932
+ # We need to fetch the `heroes` if the room name is not set. But we only need to
933
+ # get them on initial syncs (or the first time we send down the room) or if the
934
+ # membership has changed which may change the heroes.
935
+ if name_event_id is None and (initial or (not initial and membership_changed)):
936
+ # We need the room summary to extract the heroes from
937
+ if room_membership_for_user_at_to_token.membership != Membership.JOIN:
938
+ # TODO: Figure out how to get the membership summary for left/banned rooms
939
+ # For invite/knock rooms we don't include the information.
940
+ room_membership_summary = {}
941
+ else:
942
+ room_membership_summary = await self.store.get_room_summary(room_id)
943
+ # TODO: Reverse/rewind back to the `to_token`
944
+
945
+ hero_user_ids = extract_heroes_from_room_summary(
946
+ room_membership_summary, me=user.to_string()
947
+ )
948
+
949
+ # Fetch the membership counts for rooms we're joined to.
950
+ #
951
+ # Similarly to other metadata, we only need to calculate the member
952
+ # counts if this is an initial sync or the memberships have changed.
953
+ joined_count: int | None = None
954
+ invited_count: int | None = None
955
+ if (
956
+ initial or membership_changed
957
+ ) and room_membership_for_user_at_to_token.membership == Membership.JOIN:
958
+ # If we have the room summary (because we calculated heroes above)
959
+ # then we can simply pull the counts from there.
960
+ if room_membership_summary is not None:
961
+ empty_membership_summary = MemberSummary([], 0)
962
+
963
+ joined_count = room_membership_summary.get(
964
+ Membership.JOIN, empty_membership_summary
965
+ ).count
966
+
967
+ invited_count = room_membership_summary.get(
968
+ Membership.INVITE, empty_membership_summary
969
+ ).count
970
+ else:
971
+ member_counts = await self.store.get_member_counts(room_id)
972
+ joined_count = member_counts.get(Membership.JOIN, 0)
973
+ invited_count = member_counts.get(Membership.INVITE, 0)
974
+
975
+ # Fetch the `required_state` for the room
976
+ #
977
+ # No `required_state` for invite/knock rooms (just `stripped_state`)
978
+ #
979
+ # FIXME: It would be nice to make the `rooms` response more uniform regardless
980
+ # of membership. Currently, we have to make this optional because
981
+ # `invite`/`knock` rooms only have `stripped_state`. See
982
+ # https://github.com/matrix-org/matrix-spec-proposals/pull/3575#discussion_r1653045932
983
+ #
984
+ # Calculate the `StateFilter` based on the `required_state` for the room
985
+ required_state_filter = StateFilter.none()
986
+
987
+ # Keep track of which users' state we may need to fetch. We split this
988
+ # into explicit users and lazy loaded users.
989
+ explicit_user_state = set()
990
+ lazy_load_user_ids = set()
991
+
992
+ # Whether lazy-loading of room members is enabled.
993
+ lazy_load_room_members = False
994
+
995
+ if room_membership_for_user_at_to_token.membership not in (
996
+ Membership.INVITE,
997
+ Membership.KNOCK,
998
+ ):
999
+ # If we have a double wildcard ("*", "*") in the `required_state`, we need
1000
+ # to fetch all state for the room
1001
+ #
1002
+ # Note: MSC3575 describes different behavior to how we're handling things
1003
+ # here but since it's not wrong to return more state than requested
1004
+ # (`required_state` is just the minimum requested), it doesn't matter if we
1005
+ # include more than client wanted. This complexity is also under scrutiny,
1006
+ # see
1007
+ # https://github.com/matrix-org/matrix-spec-proposals/pull/3575#discussion_r1185109050
1008
+ #
1009
+ # > One unique exception is when you request all state events via ["*", "*"]. When used,
1010
+ # > all state events are returned by default, and additional entries FILTER OUT the returned set
1011
+ # > of state events. These additional entries cannot use '*' themselves.
1012
+ # > For example, ["*", "*"], ["m.room.member", "@alice:example.com"] will _exclude_ every m.room.member
1013
+ # > event _except_ for @alice:example.com, and include every other state event.
1014
+ # > In addition, ["*", "*"], ["m.space.child", "*"] is an error, the m.space.child filter is not
1015
+ # > required as it would have been returned anyway.
1016
+ # >
1017
+ # > -- MSC3575 (https://github.com/matrix-org/matrix-spec-proposals/pull/3575)
1018
+ if StateValues.WILDCARD in room_sync_config.required_state_map.get(
1019
+ StateValues.WILDCARD, set()
1020
+ ):
1021
+ set_tag(
1022
+ SynapseTags.FUNC_ARG_PREFIX + "required_state_wildcard",
1023
+ True,
1024
+ )
1025
+ required_state_filter = StateFilter.all()
1026
+ # TODO: `StateFilter` currently doesn't support wildcard event types. We're
1027
+ # currently working around this by returning all state to the client but it
1028
+ # would be nice to fetch less from the database and return just what the
1029
+ # client wanted.
1030
+ elif (
1031
+ room_sync_config.required_state_map.get(StateValues.WILDCARD)
1032
+ is not None
1033
+ ):
1034
+ set_tag(
1035
+ SynapseTags.FUNC_ARG_PREFIX + "required_state_wildcard_event_type",
1036
+ True,
1037
+ )
1038
+ required_state_filter = StateFilter.all()
1039
+ else:
1040
+ required_state_types: list[tuple[str, str | None]] = []
1041
+ num_wild_state_keys = 0
1042
+ num_others = 0
1043
+ for (
1044
+ state_type,
1045
+ state_key_set,
1046
+ ) in room_sync_config.required_state_map.items():
1047
+ for state_key in state_key_set:
1048
+ if state_key == StateValues.WILDCARD:
1049
+ num_wild_state_keys += 1
1050
+ # `None` is a wildcard in the `StateFilter`
1051
+ required_state_types.append((state_type, None))
1052
+ # We need to fetch all relevant people when we're lazy-loading membership
1053
+ elif (
1054
+ state_type == EventTypes.Member
1055
+ and state_key == StateValues.LAZY
1056
+ ):
1057
+ lazy_load_room_members = True
1058
+
1059
+ # Everyone in the timeline is relevant
1060
+ timeline_membership: set[str] = set()
1061
+ if timeline_events is not None:
1062
+ for timeline_event in timeline_events:
1063
+ # Anyone who sent a message is relevant
1064
+ timeline_membership.add(timeline_event.sender)
1065
+
1066
+ # We also care about invite, ban, kick, targets,
1067
+ # etc.
1068
+ if timeline_event.type == EventTypes.Member:
1069
+ timeline_membership.add(
1070
+ timeline_event.state_key
1071
+ )
1072
+
1073
+ # The client needs to know the membership of everyone in
1074
+ # the timeline we're returning.
1075
+ lazy_load_user_ids.update(timeline_membership)
1076
+
1077
+ # Update the required state filter so we pick up the new
1078
+ # membership
1079
+ if limited or initial:
1080
+ # If the timeline is limited, we only need to
1081
+ # return the membership changes for people in
1082
+ # the timeline.
1083
+ for user_id in timeline_membership:
1084
+ required_state_types.append(
1085
+ (EventTypes.Member, user_id)
1086
+ )
1087
+ else:
1088
+ # For non-limited timelines we always return all
1089
+ # membership changes. This is so that clients
1090
+ # who have fetched the full membership list
1091
+ # already can continue to maintain it for
1092
+ # non-limited syncs.
1093
+ #
1094
+ # This assumes that for non-limited syncs there
1095
+ # won't be many membership changes that wouldn't
1096
+ # have been included already (this can only
1097
+ # happen if membership state was rolled back due
1098
+ # to state resolution anyway).
1099
+ #
1100
+ # `None` is a wildcard in the `StateFilter`
1101
+ required_state_types.append((EventTypes.Member, None))
1102
+
1103
+ # Record the extra members we're returning.
1104
+ lazy_load_user_ids.update(
1105
+ state_key
1106
+ for event_type, state_key in room_state_delta_id_map
1107
+ if event_type == EventTypes.Member
1108
+ )
1109
+ else:
1110
+ num_others += 1
1111
+
1112
+ # Replace `$ME` with the user's ID so we can deduplicate
1113
+ # when someone requests the same state with `$ME` or with
1114
+ # their user ID.
1115
+ normalized_state_key = state_key
1116
+ if state_key == StateValues.ME:
1117
+ normalized_state_key = user.to_string()
1118
+
1119
+ if state_type == EventTypes.Member:
1120
+ # Also track explicitly requested member state for
1121
+ # lazy membership tracking.
1122
+ explicit_user_state.add(normalized_state_key)
1123
+
1124
+ required_state_types.append(
1125
+ (state_type, normalized_state_key)
1126
+ )
1127
+
1128
+ set_tag(
1129
+ SynapseTags.FUNC_ARG_PREFIX
1130
+ + "required_state_wildcard_state_key_count",
1131
+ num_wild_state_keys,
1132
+ )
1133
+ set_tag(
1134
+ SynapseTags.FUNC_ARG_PREFIX + "required_state_lazy",
1135
+ lazy_load_room_members,
1136
+ )
1137
+ set_tag(
1138
+ SynapseTags.FUNC_ARG_PREFIX + "required_state_other_count",
1139
+ num_others,
1140
+ )
1141
+
1142
+ required_state_filter = StateFilter.from_types(required_state_types)
1143
+
1144
+ # Remove any explicitly requested user state from the lazy-loaded set,
1145
+ # as we track them separately.
1146
+ lazy_load_user_ids -= explicit_user_state
1147
+
1148
+ # We need this base set of info for the response so let's just fetch it along
1149
+ # with the `required_state` for the room
1150
+ hero_room_state = [
1151
+ (EventTypes.Member, hero_user_id) for hero_user_id in hero_user_ids
1152
+ ]
1153
+ meta_room_state = list(hero_room_state)
1154
+ if initial or name_changed:
1155
+ meta_room_state.append((EventTypes.Name, ""))
1156
+ if initial or avatar_changed:
1157
+ meta_room_state.append((EventTypes.RoomAvatar, ""))
1158
+
1159
+ state_filter = StateFilter.all()
1160
+ if required_state_filter != StateFilter.all():
1161
+ state_filter = StateFilter(
1162
+ types=StateFilter.from_types(
1163
+ chain(meta_room_state, required_state_filter.to_types())
1164
+ ).types,
1165
+ include_others=required_state_filter.include_others,
1166
+ )
1167
+
1168
+ # The required state map to store in the room sync config, if it has
1169
+ # changed.
1170
+ changed_required_state_map: Mapping[str, AbstractSet[str]] | None = None
1171
+
1172
+ # We can return all of the state that was requested if this was the first
1173
+ # time we've sent the room down this connection.
1174
+ room_state: StateMap[EventBase] = {}
1175
+
1176
+ # Includes the state for the heroes if we need them (may contain other
1177
+ # state as well).
1178
+ hero_membership_state: StateMap[EventBase] = {}
1179
+
1180
+ # By default, we mark all `lazy_load_user_ids` as being sent down
1181
+ # for the first time in this sync. We later check if we sent any of them
1182
+ # down previously and update `returned_user_id_to_last_seen_ts_map` if
1183
+ # we have.
1184
+ returned_user_id_to_last_seen_ts_map = {}
1185
+ if lazy_load_room_members:
1186
+ returned_user_id_to_last_seen_ts_map = dict.fromkeys(lazy_load_user_ids)
1187
+ new_connection_state.room_lazy_membership[room_id] = RoomLazyMembershipChanges(
1188
+ returned_user_id_to_last_seen_ts_map=returned_user_id_to_last_seen_ts_map
1189
+ )
1190
+
1191
+ if initial:
1192
+ room_state = await self.get_current_state_at(
1193
+ room_id=room_id,
1194
+ room_membership_for_user_at_to_token=room_membership_for_user_at_to_token,
1195
+ state_filter=state_filter,
1196
+ to_token=to_token,
1197
+ )
1198
+
1199
+ # The `room_state` includes the hero membership state if needed.
1200
+ # We'll later filter this down so we don't need to do so here.
1201
+ hero_membership_state = room_state
1202
+ else:
1203
+ assert from_token is not None
1204
+ assert from_bound is not None
1205
+
1206
+ if prev_room_sync_config is not None:
1207
+ # Define `all_required_user_state` as all user state we want, which
1208
+ # is the explicitly requested members, any needed for lazy
1209
+ # loading, and users whose membership has changed.
1210
+ all_required_user_state = explicit_user_state | lazy_load_user_ids
1211
+ for state_type, state_key in room_state_delta_id_map:
1212
+ if state_type == EventTypes.Member:
1213
+ all_required_user_state.add(state_key)
1214
+
1215
+ # We need to know what user state we previously sent down the
1216
+ # connection so we can determine what has changed.
1217
+ #
1218
+ # We need to fetch all users whose memberships we may want
1219
+ # to send down this sync. This includes (and matches
1220
+ # `all_required_user_state`):
1221
+ # 1. Explicitly requested user state
1222
+ # 2. Lazy loaded members, i.e. users who appear in the
1223
+ # timeline.
1224
+ # 3. The users whose membership has changed in the room, i.e.
1225
+ # in the state deltas.
1226
+ #
1227
+ # This is to correctly handle the cases where a user was
1228
+ # previously sent down as a lazy loaded member:
1229
+ # - and is now explicitly requested (so shouldn't be sent down
1230
+ # again); or
1231
+ # - their membership has changed (so we need to invalidate
1232
+ # their entry in the lazy loaded table if we don't send the
1233
+ # change down).
1234
+ if all_required_user_state:
1235
+ previously_returned_user_to_last_seen = (
1236
+ await self.store.get_sliding_sync_connection_lazy_members(
1237
+ connection_position=from_token.connection_position,
1238
+ room_id=room_id,
1239
+ user_ids=all_required_user_state,
1240
+ )
1241
+ )
1242
+
1243
+ # Update the room lazy membership changes to track which
1244
+ # lazy loaded members were needed for this sync. This is so
1245
+ # that we can correctly track the last time we sent down
1246
+ # users' membership (and so can evict old membership state
1247
+ # from the DB tables).
1248
+ returned_user_id_to_last_seen_ts_map.update(
1249
+ (user_id, timestamp)
1250
+ for user_id, timestamp in previously_returned_user_to_last_seen.items()
1251
+ if user_id in lazy_load_user_ids
1252
+ )
1253
+ else:
1254
+ previously_returned_user_to_last_seen = {}
1255
+
1256
+ # Check if there are any changes to the required state config
1257
+ # that we need to handle.
1258
+ changes_return = _required_state_changes(
1259
+ user.to_string(),
1260
+ prev_required_state_map=prev_room_sync_config.required_state_map,
1261
+ request_required_state_map=room_sync_config.required_state_map,
1262
+ previously_returned_lazy_user_ids=previously_returned_user_to_last_seen.keys(),
1263
+ request_lazy_load_user_ids=lazy_load_user_ids,
1264
+ state_deltas=room_state_delta_id_map,
1265
+ )
1266
+ changed_required_state_map = changes_return.changed_required_state_map
1267
+
1268
+ new_connection_state.room_lazy_membership[
1269
+ room_id
1270
+ ].invalidated_user_ids = changes_return.lazy_members_invalidated
1271
+
1272
+ # Add any previously returned explicit memberships to the lazy
1273
+ # loaded table. This happens when a client requested explicit
1274
+ # members and then converted them to lazy loading.
1275
+ for user_id in changes_return.extra_users_to_add_to_lazy_cache:
1276
+ # We don't know the right timestamp to use here, as we don't
1277
+ # know the last time we would have sent the membership down.
1278
+ # So we don't overwrite it if we have a timestamp already,
1279
+ # and fallback to `None` (which means now) if we don't.
1280
+ returned_user_id_to_last_seen_ts_map.setdefault(user_id, None)
1281
+
1282
+ if changes_return.added_state_filter:
1283
+ # Some state entries got added, so we pull out the current
1284
+ # state for them. If we don't do this we'd only send down new deltas.
1285
+ state_ids = await self.get_current_state_ids_at(
1286
+ room_id=room_id,
1287
+ room_membership_for_user_at_to_token=room_membership_for_user_at_to_token,
1288
+ state_filter=changes_return.added_state_filter,
1289
+ to_token=to_token,
1290
+ )
1291
+ room_state_delta_id_map.update(state_ids)
1292
+
1293
+ events = await self.store.get_events(
1294
+ state_filter.filter_state(room_state_delta_id_map).values()
1295
+ )
1296
+ room_state = {(s.type, s.state_key): s for s in events.values()}
1297
+
1298
+ # If the membership changed and we have to get heroes, get the remaining
1299
+ # heroes from the state
1300
+ hero_membership_state = {}
1301
+ if hero_user_ids:
1302
+ hero_membership_state = await self.get_current_state_at(
1303
+ room_id=room_id,
1304
+ room_membership_for_user_at_to_token=room_membership_for_user_at_to_token,
1305
+ state_filter=StateFilter.from_types(hero_room_state),
1306
+ to_token=to_token,
1307
+ )
1308
+
1309
+ required_room_state: StateMap[EventBase] = {}
1310
+ if required_state_filter != StateFilter.none():
1311
+ required_room_state = required_state_filter.filter_state(room_state)
1312
+
1313
+ # Find the room name and avatar from the state
1314
+ room_name: str | None = None
1315
+ # TODO: Should we also check for `EventTypes.CanonicalAlias`
1316
+ # (`m.room.canonical_alias`) as a fallback for the room name? see
1317
+ # https://github.com/matrix-org/matrix-spec-proposals/pull/3575#discussion_r1671260153
1318
+ name_event = room_state.get((EventTypes.Name, ""))
1319
+ if name_event is not None:
1320
+ room_name = name_event.content.get("name")
1321
+
1322
+ room_avatar: str | None = None
1323
+ avatar_event = room_state.get((EventTypes.RoomAvatar, ""))
1324
+ if avatar_event is not None:
1325
+ room_avatar = avatar_event.content.get("url")
1326
+
1327
+ # Assemble heroes: extract the info from the state we just fetched
1328
+ heroes: list[SlidingSyncResult.RoomResult.StrippedHero] = []
1329
+ for hero_user_id in hero_user_ids:
1330
+ member_event = hero_membership_state.get((EventTypes.Member, hero_user_id))
1331
+ if member_event is not None:
1332
+ heroes.append(
1333
+ SlidingSyncResult.RoomResult.StrippedHero(
1334
+ user_id=hero_user_id,
1335
+ display_name=member_event.content.get("displayname"),
1336
+ avatar_url=member_event.content.get("avatar_url"),
1337
+ )
1338
+ )
1339
+
1340
+ # Figure out the last bump event in the room. If the bump stamp hasn't
1341
+ # changed we omit it from the response.
1342
+ bump_stamp = None
1343
+
1344
+ always_return_bump_stamp = (
1345
+ # We use the membership event position for any non-join
1346
+ room_membership_for_user_at_to_token.membership != Membership.JOIN
1347
+ # We didn't fetch any timeline events but we should still check for
1348
+ # a bump_stamp that might be somewhere
1349
+ or limited is None
1350
+ # There might be a bump event somewhere before the timeline events
1351
+ # that we fetched, that we didn't previously send down
1352
+ or limited is True
1353
+ # Always give the client some frame of reference if this is the
1354
+ # first time they are seeing the room down the connection
1355
+ or initial
1356
+ )
1357
+
1358
+ # If we're joined to the room, we need to find the last bump event before the
1359
+ # `to_token`
1360
+ if room_membership_for_user_at_to_token.membership == Membership.JOIN:
1361
+ # Try and get a bump stamp
1362
+ new_bump_stamp = await self._get_bump_stamp(
1363
+ room_id,
1364
+ to_token,
1365
+ timeline_events,
1366
+ check_outside_timeline=always_return_bump_stamp,
1367
+ )
1368
+ if new_bump_stamp is not None:
1369
+ bump_stamp = new_bump_stamp
1370
+
1371
+ if bump_stamp is None and always_return_bump_stamp:
1372
+ # By default, just choose the membership event position for any non-join membership
1373
+ bump_stamp = room_membership_for_user_at_to_token.event_pos.stream
1374
+
1375
+ if bump_stamp is not None and bump_stamp < 0:
1376
+ # We never want to send down negative stream orderings, as you can't
1377
+ # sensibly compare positive and negative stream orderings (they have
1378
+ # different meanings).
1379
+ #
1380
+ # A negative bump stamp here can only happen if the stream ordering
1381
+ # of the membership event is negative (and there are no further bump
1382
+ # stamps), which can happen if the server leaves and deletes a room,
1383
+ # and then rejoins it.
1384
+ #
1385
+ # To deal with this, we just set the bump stamp to zero, which will
1386
+ # shove this room to the bottom of the list. This is OK as the
1387
+ # moment a new message happens in the room it will get put into a
1388
+ # sensible order again.
1389
+ bump_stamp = 0
1390
+
1391
+ room_sync_required_state_map_to_persist: Mapping[str, AbstractSet[str]] = (
1392
+ room_sync_config.required_state_map
1393
+ )
1394
+ if changed_required_state_map:
1395
+ room_sync_required_state_map_to_persist = changed_required_state_map
1396
+
1397
+ # Record the `room_sync_config` if we're `ignore_timeline_bound` (which means
1398
+ # that the `timeline_limit` has increased)
1399
+ unstable_expanded_timeline = False
1400
+ if ignore_timeline_bound:
1401
+ # FIXME: We signal the fact that we're sending down more events to
1402
+ # the client by setting `unstable_expanded_timeline` to true (see
1403
+ # "XXX: Odd behavior" above).
1404
+ unstable_expanded_timeline = True
1405
+
1406
+ new_connection_state.room_configs[room_id] = RoomSyncConfig(
1407
+ timeline_limit=room_sync_config.timeline_limit,
1408
+ required_state_map=room_sync_required_state_map_to_persist,
1409
+ )
1410
+ elif prev_room_sync_config is not None:
1411
+ # If the result is `limited` then we need to record that the
1412
+ # `timeline_limit` has been reduced, as when/if the client later requests
1413
+ # more timeline then we have more data to send.
1414
+ #
1415
+ # Otherwise (when not `limited`) we don't need to record that the
1416
+ # `timeline_limit` has been reduced, as the *effective* `timeline_limit`
1417
+ # (i.e. the amount of timeline we have previously sent to the client) is at
1418
+ # least the previous `timeline_limit`.
1419
+ #
1420
+ # This is to handle the case where the `timeline_limit` e.g. goes from 10 to
1421
+ # 5 to 10 again (without any timeline gaps), where there's no point sending
1422
+ # down the initial historical chunk events when the `timeline_limit` is
1423
+ # increased as the client already has the 10 previous events. However, if
1424
+ # client has a gap in the timeline (i.e. `limited` is True), then we *do*
1425
+ # need to record the reduced timeline.
1426
+ #
1427
+ # TODO: Handle timeline gaps (`get_timeline_gaps()`) - This is separate from
1428
+ # the gaps we might see on the client because a response was `limited` we're
1429
+ # talking about above.
1430
+ if (
1431
+ limited
1432
+ and prev_room_sync_config.timeline_limit
1433
+ > room_sync_config.timeline_limit
1434
+ ):
1435
+ new_connection_state.room_configs[room_id] = RoomSyncConfig(
1436
+ timeline_limit=room_sync_config.timeline_limit,
1437
+ required_state_map=room_sync_required_state_map_to_persist,
1438
+ )
1439
+
1440
+ elif changed_required_state_map is not None:
1441
+ new_connection_state.room_configs[room_id] = RoomSyncConfig(
1442
+ timeline_limit=room_sync_config.timeline_limit,
1443
+ required_state_map=room_sync_required_state_map_to_persist,
1444
+ )
1445
+
1446
+ else:
1447
+ new_connection_state.room_configs[room_id] = RoomSyncConfig(
1448
+ timeline_limit=room_sync_config.timeline_limit,
1449
+ required_state_map=room_sync_required_state_map_to_persist,
1450
+ )
1451
+
1452
+ set_tag(SynapseTags.RESULT_PREFIX + "initial", initial)
1453
+
1454
+ return SlidingSyncResult.RoomResult(
1455
+ name=room_name,
1456
+ avatar=room_avatar,
1457
+ heroes=heroes,
1458
+ is_dm=is_dm,
1459
+ initial=initial,
1460
+ required_state=list(required_room_state.values()),
1461
+ timeline_events=timeline_events,
1462
+ bundled_aggregations=bundled_aggregations,
1463
+ stripped_state=stripped_state,
1464
+ prev_batch=prev_batch_token,
1465
+ limited=limited,
1466
+ unstable_expanded_timeline=unstable_expanded_timeline,
1467
+ num_live=num_live,
1468
+ bump_stamp=bump_stamp,
1469
+ joined_count=joined_count,
1470
+ invited_count=invited_count,
1471
+ # TODO: These are just dummy values. We could potentially just remove these
1472
+ # since notifications can only really be done correctly on the client anyway
1473
+ # (encrypted rooms).
1474
+ notification_count=0,
1475
+ highlight_count=0,
1476
+ )
1477
+
1478
+ @trace
1479
+ async def _get_bump_stamp(
1480
+ self,
1481
+ room_id: str,
1482
+ to_token: StreamToken,
1483
+ timeline: list[EventBase],
1484
+ check_outside_timeline: bool,
1485
+ ) -> int | None:
1486
+ """Get a bump stamp for the room, if we have a bump event and it has
1487
+ changed.
1488
+
1489
+ Args:
1490
+ room_id
1491
+ to_token: The upper bound of token to return
1492
+ timeline: The list of events we have fetched.
1493
+ limited: If the timeline was limited.
1494
+ check_outside_timeline: Whether we need to check for bump stamp for
1495
+ events before the timeline if we didn't find a bump stamp in
1496
+ the timeline events.
1497
+ """
1498
+
1499
+ # First check the timeline events we're returning to see if one of
1500
+ # those matches. We iterate backwards and take the stream ordering
1501
+ # of the first event that matches the bump event types.
1502
+ for timeline_event in reversed(timeline):
1503
+ if timeline_event.type in SLIDING_SYNC_DEFAULT_BUMP_EVENT_TYPES:
1504
+ new_bump_stamp = timeline_event.internal_metadata.stream_ordering
1505
+
1506
+ # All persisted events have a stream ordering
1507
+ assert new_bump_stamp is not None
1508
+
1509
+ # If we've just joined a remote room, then the last bump event may
1510
+ # have been backfilled (and so have a negative stream ordering).
1511
+ # These negative stream orderings can't sensibly be compared, so
1512
+ # instead we use the membership event position.
1513
+ if new_bump_stamp > 0:
1514
+ return new_bump_stamp
1515
+
1516
+ if not check_outside_timeline:
1517
+ # If we are not a limited sync, then we know the bump stamp can't
1518
+ # have changed.
1519
+ return None
1520
+
1521
+ # We can quickly query for the latest bump event in the room using the
1522
+ # sliding sync tables.
1523
+ latest_room_bump_stamp = await self.store.get_latest_bump_stamp_for_room(
1524
+ room_id
1525
+ )
1526
+
1527
+ min_to_token_position = to_token.room_key.stream
1528
+
1529
+ # If we can rely on the new sliding sync tables and the `bump_stamp` is
1530
+ # `None`, just fallback to the membership event position. This can happen
1531
+ # when we've just joined a remote room and all the events are backfilled.
1532
+ if (
1533
+ # FIXME: The background job check can be removed once we bump
1534
+ # `SCHEMA_COMPAT_VERSION` and run the foreground update for
1535
+ # `sliding_sync_joined_rooms`/`sliding_sync_membership_snapshots`
1536
+ # (tracked by https://github.com/element-hq/synapse/issues/17623)
1537
+ latest_room_bump_stamp is None
1538
+ and await self.store.have_finished_sliding_sync_background_jobs()
1539
+ ):
1540
+ return None
1541
+
1542
+ # The `bump_stamp` stored in the database might be ahead of our token. Since
1543
+ # `bump_stamp` is only a `stream_ordering` position, we can't be 100% sure
1544
+ # that's before the `to_token` in all scenarios. The only scenario we can be
1545
+ # sure of is if the `bump_stamp` is totally before the minimum position from
1546
+ # the token.
1547
+ #
1548
+ # We don't need to check if the background update has finished, as if the
1549
+ # returned bump stamp is not None then it must be up to date.
1550
+ elif (
1551
+ latest_room_bump_stamp is not None
1552
+ and latest_room_bump_stamp < min_to_token_position
1553
+ ):
1554
+ if latest_room_bump_stamp > 0:
1555
+ return latest_room_bump_stamp
1556
+ else:
1557
+ return None
1558
+
1559
+ # Otherwise, if it's within or after the `to_token`, we need to find the
1560
+ # last bump event before the `to_token`.
1561
+ else:
1562
+ last_bump_event_result = (
1563
+ await self.store.get_last_event_pos_in_room_before_stream_ordering(
1564
+ room_id,
1565
+ to_token.room_key,
1566
+ event_types=SLIDING_SYNC_DEFAULT_BUMP_EVENT_TYPES,
1567
+ )
1568
+ )
1569
+ if last_bump_event_result is not None:
1570
+ _, new_bump_event_pos = last_bump_event_result
1571
+
1572
+ # If we've just joined a remote room, then the last bump event may
1573
+ # have been backfilled (and so have a negative stream ordering).
1574
+ # These negative stream orderings can't sensibly be compared, so
1575
+ # instead we use the membership event position.
1576
+ if new_bump_event_pos.stream > 0:
1577
+ return new_bump_event_pos.stream
1578
+
1579
+ return None
1580
+
1581
+
1582
+ @attr.s(auto_attribs=True)
1583
+ class _RequiredStateChangesReturn:
1584
+ """Return type for _required_state_changes."""
1585
+
1586
+ changed_required_state_map: Mapping[str, AbstractSet[str]] | None
1587
+ """The updated required state map to store in the room config, or None if
1588
+ there is no change."""
1589
+
1590
+ added_state_filter: StateFilter
1591
+ """The state filter to use to fetch any additional current state that needs
1592
+ to be returned to the client."""
1593
+
1594
+ extra_users_to_add_to_lazy_cache: AbstractSet[str] = frozenset()
1595
+ """The set of user IDs we should add to the lazy members cache that we had
1596
+ previously returned. Handles the case where a user was previously sent down
1597
+ explicitly but is now being lazy loaded."""
1598
+
1599
+ lazy_members_invalidated: AbstractSet[str] = frozenset()
1600
+ """The set of user IDs whose membership has changed but we didn't send down,
1601
+ so we need to invalidate them from the cache."""
1602
+
1603
+
1604
+ def _required_state_changes(
1605
+ user_id: str,
1606
+ *,
1607
+ prev_required_state_map: Mapping[str, AbstractSet[str]],
1608
+ request_required_state_map: Mapping[str, AbstractSet[str]],
1609
+ previously_returned_lazy_user_ids: AbstractSet[str],
1610
+ request_lazy_load_user_ids: AbstractSet[str],
1611
+ state_deltas: StateMap[str],
1612
+ ) -> _RequiredStateChangesReturn:
1613
+ """Calculates the changes between the required state room config from the
1614
+ previous requests compared with the current request.
1615
+
1616
+ This does two things. First, it calculates if we need to update the room
1617
+ config due to changes to required state. Secondly, it works out which state
1618
+ entries we need to pull from current state and return due to the state entry
1619
+ now appearing in the required state when it previously wasn't (on top of the
1620
+ state deltas).
1621
+
1622
+ This function tries to ensure to handle the case where a state entry is
1623
+ added, removed and then added again to the required state. In that case we
1624
+ only want to re-send that entry down sync if it has changed.
1625
+
1626
+ Args:
1627
+ user_id: The user ID of the user making the request.
1628
+ prev_required_state_map: The required state map from the previous
1629
+ request.
1630
+ request_required_state_map: The required state map from the current
1631
+ request.
1632
+ previously_returned_lazy_user_ids: The set of user IDs whose membership
1633
+ we have previously returned to the client due to lazy loading. This
1634
+ is filtered to only include users who have either sent events in the
1635
+ `timeline`, `required_state` or whose membership changed.
1636
+ request_lazy_load_user_ids: The set of user IDs whose lazy-loaded
1637
+ membership is required for this request.
1638
+ state_deltas: The state deltas in the room in the request token range,
1639
+ considering user membership. See `get_current_state_deltas_for_room`
1640
+ for more details.
1641
+ """
1642
+
1643
+ # First we find any lazy members that have been invalidated due to state
1644
+ # changes that we are not sending down.
1645
+ lazy_members_invalidated = set()
1646
+ for event_type, state_key in state_deltas:
1647
+ if event_type != EventTypes.Member:
1648
+ continue
1649
+
1650
+ if state_key in request_lazy_load_user_ids:
1651
+ # Because it's part of the `request_lazy_load_user_ids`, we're going to
1652
+ # send this member change down.
1653
+ continue
1654
+
1655
+ if state_key not in previously_returned_lazy_user_ids:
1656
+ # We've not previously returned this member so nothing to
1657
+ # invalidate.
1658
+ continue
1659
+
1660
+ lazy_members_invalidated.add(state_key)
1661
+
1662
+ if prev_required_state_map == request_required_state_map:
1663
+ # There has been no change in state, just need to check lazy members.
1664
+ newly_returned_lazy_members = (
1665
+ request_lazy_load_user_ids - previously_returned_lazy_user_ids
1666
+ )
1667
+ if newly_returned_lazy_members:
1668
+ # There are some new lazy members we need to fetch.
1669
+ added_types: list[tuple[str, str | None]] = []
1670
+ for new_user_id in newly_returned_lazy_members:
1671
+ added_types.append((EventTypes.Member, new_user_id))
1672
+
1673
+ added_state_filter = StateFilter.from_types(added_types)
1674
+ else:
1675
+ added_state_filter = StateFilter.none()
1676
+
1677
+ return _RequiredStateChangesReturn(
1678
+ changed_required_state_map=None,
1679
+ added_state_filter=added_state_filter,
1680
+ lazy_members_invalidated=lazy_members_invalidated,
1681
+ )
1682
+
1683
+ prev_wildcard = prev_required_state_map.get(StateValues.WILDCARD, set())
1684
+ request_wildcard = request_required_state_map.get(StateValues.WILDCARD, set())
1685
+
1686
+ # If we were previously fetching everything ("*", "*"), always update the effective
1687
+ # room required state config to match the request. And since we we're previously
1688
+ # already fetching everything, we don't have to fetch anything now that they've
1689
+ # narrowed.
1690
+ if StateValues.WILDCARD in prev_wildcard:
1691
+ return _RequiredStateChangesReturn(
1692
+ changed_required_state_map=request_required_state_map,
1693
+ added_state_filter=StateFilter.none(),
1694
+ lazy_members_invalidated=lazy_members_invalidated,
1695
+ )
1696
+
1697
+ # If a event type wildcard has been added or removed we don't try and do
1698
+ # anything fancy, and instead always update the effective room required
1699
+ # state config to match the request.
1700
+ if request_wildcard - prev_wildcard:
1701
+ # Some keys were added, so we need to fetch everything
1702
+ return _RequiredStateChangesReturn(
1703
+ changed_required_state_map=request_required_state_map,
1704
+ added_state_filter=StateFilter.all(),
1705
+ lazy_members_invalidated=lazy_members_invalidated,
1706
+ )
1707
+ if prev_wildcard - request_wildcard:
1708
+ # Keys were only removed, so we don't have to fetch everything.
1709
+ return _RequiredStateChangesReturn(
1710
+ changed_required_state_map=request_required_state_map,
1711
+ added_state_filter=StateFilter.none(),
1712
+ lazy_members_invalidated=lazy_members_invalidated,
1713
+ )
1714
+
1715
+ # Contains updates to the required state map compared with the previous room
1716
+ # config. This has the same format as `RoomSyncConfig.required_state`
1717
+ changes: dict[str, AbstractSet[str]] = {}
1718
+
1719
+ # The set of types/state keys that we need to fetch and return to the
1720
+ # client. Passed to `StateFilter.from_types(...)`
1721
+ added: list[tuple[str, str | None]] = []
1722
+
1723
+ # Convert the list of state deltas to map from type to state_keys that have
1724
+ # changed.
1725
+ changed_types_to_state_keys: dict[str, set[str]] = {}
1726
+ for event_type, state_key in state_deltas:
1727
+ changed_types_to_state_keys.setdefault(event_type, set()).add(state_key)
1728
+
1729
+ # First we calculate what, if anything, has been *added*.
1730
+ for event_type in (
1731
+ prev_required_state_map.keys() | request_required_state_map.keys()
1732
+ ):
1733
+ old_state_keys = prev_required_state_map.get(event_type, set())
1734
+ request_state_keys = request_required_state_map.get(event_type, set())
1735
+ changed_state_keys = changed_types_to_state_keys.get(event_type, set())
1736
+
1737
+ if old_state_keys == request_state_keys:
1738
+ # No change to this type
1739
+ continue
1740
+
1741
+ if not request_state_keys - old_state_keys:
1742
+ # Nothing *added*, so we skip. Removals happen below.
1743
+ continue
1744
+
1745
+ # Handle the special case of adding `$LAZY` membership, where we want to
1746
+ # always record the change to be lazy loading, as we immediately start
1747
+ # using the lazy loading tables so there is no point *not* recording the
1748
+ # change to lazy load in the effective room config.
1749
+ if event_type == EventTypes.Member:
1750
+ old_state_key_lazy = StateValues.LAZY in old_state_keys
1751
+ request_state_key_lazy = StateValues.LAZY in request_state_keys
1752
+ if not old_state_key_lazy and request_state_key_lazy:
1753
+ changes[event_type] = request_state_keys
1754
+ continue
1755
+
1756
+ # We only remove state keys from the effective state if they've been
1757
+ # removed from the request *and* the state has changed. This ensures
1758
+ # that if a client removes and then re-adds a state key, we only send
1759
+ # down the associated current state event if its changed (rather than
1760
+ # sending down the same event twice).
1761
+ invalidated_state_keys = (
1762
+ old_state_keys - request_state_keys
1763
+ ) & changed_state_keys
1764
+
1765
+ # Figure out which state keys we should remember sending down the connection
1766
+ inheritable_previous_state_keys = (
1767
+ # Retain the previous state_keys that we've sent down before.
1768
+ # Wildcard and lazy state keys are not sticky from previous requests.
1769
+ (old_state_keys - {StateValues.WILDCARD, StateValues.LAZY})
1770
+ - invalidated_state_keys
1771
+ )
1772
+
1773
+ # Always update changes to include the newly added keys (we've expanded the set
1774
+ # of state keys), use the new requested set with whatever hasn't been
1775
+ # invalidated from the previous set.
1776
+ changes[event_type] = request_state_keys | inheritable_previous_state_keys
1777
+ # Limit the number of state_keys we should remember sending down the connection
1778
+ # for each (room_id, user_id). We don't want to store and pull out too much data
1779
+ # in the database. This is a happy-medium between remembering nothing and
1780
+ # everything. We can avoid sending redundant state down the connection most of
1781
+ # the time given that most rooms don't have 100 members anyway and it takes a
1782
+ # while to cycle through 100 members.
1783
+ #
1784
+ # Only remember up to (MAX_NUMBER_PREVIOUS_STATE_KEYS_TO_REMEMBER)
1785
+ if len(changes[event_type]) > MAX_NUMBER_PREVIOUS_STATE_KEYS_TO_REMEMBER:
1786
+ # Reset back to only the requested state keys
1787
+ changes[event_type] = request_state_keys
1788
+
1789
+ # Skip if there isn't any room to fill in the rest with previous state keys
1790
+ if len(request_state_keys) < MAX_NUMBER_PREVIOUS_STATE_KEYS_TO_REMEMBER:
1791
+ # Fill the rest with previous state_keys. Ideally, we could sort
1792
+ # these by recency but it's just a set so just pick an arbitrary
1793
+ # subset (good enough).
1794
+ changes[event_type] = changes[event_type] | set(
1795
+ itertools.islice(
1796
+ inheritable_previous_state_keys,
1797
+ # Just taking the difference isn't perfect as there could be
1798
+ # overlap in the keys between the requested and previous but we
1799
+ # will decide to just take the easy route for now and avoid
1800
+ # additional set operations to figure it out.
1801
+ MAX_NUMBER_PREVIOUS_STATE_KEYS_TO_REMEMBER
1802
+ - len(request_state_keys),
1803
+ )
1804
+ )
1805
+
1806
+ if StateValues.WILDCARD in old_state_keys:
1807
+ # We were previously fetching everything for this type, so we don't need to
1808
+ # fetch anything new.
1809
+ continue
1810
+
1811
+ # Record the new state keys to fetch for this type.
1812
+ if StateValues.WILDCARD in request_state_keys:
1813
+ # If we have added a wildcard then we always just fetch everything.
1814
+ added.append((event_type, None))
1815
+ else:
1816
+ for state_key in request_state_keys - old_state_keys:
1817
+ if state_key == StateValues.ME:
1818
+ added.append((event_type, user_id))
1819
+ elif state_key == StateValues.LAZY:
1820
+ # We handle lazy loading separately (outside this function),
1821
+ # so don't need to explicitly add anything here.
1822
+ #
1823
+ # LAZY values should also be ignore for event types that are
1824
+ # not membership.
1825
+ pass
1826
+ elif event_type == EventTypes.Member:
1827
+ if state_key not in previously_returned_lazy_user_ids:
1828
+ # Only add *explicit* members we haven't previously sent
1829
+ # down.
1830
+ added.append((event_type, state_key))
1831
+ else:
1832
+ added.append((event_type, state_key))
1833
+
1834
+ previously_required_state_members = set(
1835
+ prev_required_state_map.get(EventTypes.Member, ())
1836
+ )
1837
+ if StateValues.ME in previously_required_state_members:
1838
+ previously_required_state_members.add(user_id)
1839
+
1840
+ # We also need to pull out any lazy members that are now required but
1841
+ # haven't previously been returned.
1842
+ for required_user_id in (
1843
+ request_lazy_load_user_ids
1844
+ # Remove previously returned users
1845
+ - previously_returned_lazy_user_ids
1846
+ # Exclude previously explicitly requested members.
1847
+ - previously_required_state_members
1848
+ ):
1849
+ added.append((EventTypes.Member, required_user_id))
1850
+
1851
+ added_state_filter = StateFilter.from_types(added)
1852
+
1853
+ # Figure out what changes we need to apply to the effective required state
1854
+ # config.
1855
+ for event_type, changed_state_keys in changed_types_to_state_keys.items():
1856
+ old_state_keys = prev_required_state_map.get(event_type, set())
1857
+ request_state_keys = request_required_state_map.get(event_type, set())
1858
+
1859
+ if old_state_keys == request_state_keys:
1860
+ # No change.
1861
+ continue
1862
+
1863
+ # If we see the `user_id` as a state_key, also add "$ME" to the list of state
1864
+ # that has changed to account for people requesting `required_state` with `$ME`
1865
+ # or their user ID.
1866
+ if user_id in changed_state_keys:
1867
+ changed_state_keys.add(StateValues.ME)
1868
+
1869
+ # We only remove state keys from the effective state if they've been
1870
+ # removed from the request *and* the state has changed. This ensures
1871
+ # that if a client removes and then re-adds a state key, we only send
1872
+ # down the associated current state event if its changed (rather than
1873
+ # sending down the same event twice).
1874
+ invalidated_state_keys = (
1875
+ old_state_keys - request_state_keys
1876
+ ) & changed_state_keys
1877
+
1878
+ # We've expanded the set of state keys, ... (already handled above)
1879
+ if request_state_keys - old_state_keys:
1880
+ continue
1881
+
1882
+ old_state_key_wildcard = StateValues.WILDCARD in old_state_keys
1883
+ request_state_key_wildcard = StateValues.WILDCARD in request_state_keys
1884
+
1885
+ if old_state_key_wildcard != request_state_key_wildcard:
1886
+ # If a state_key wildcard has been added or removed, we always update the
1887
+ # effective room required state config to match the request.
1888
+ changes[event_type] = request_state_keys
1889
+ continue
1890
+
1891
+ # When handling $LAZY membership, we want to either a) not update the
1892
+ # state or b) update it to match the request. This is to avoid churn of
1893
+ # the effective required state for rooms (we deduplicate required state
1894
+ # between rooms), and because we can store the previously returned
1895
+ # explicit memberships with the lazy loaded memberships.
1896
+ if event_type == EventTypes.Member:
1897
+ old_state_key_lazy = StateValues.LAZY in old_state_keys
1898
+ request_state_key_lazy = StateValues.LAZY in request_state_keys
1899
+ has_lazy = old_state_key_lazy or request_state_key_lazy
1900
+
1901
+ # If a "$LAZY" has been added or removed we always update to match
1902
+ # the request.
1903
+ if old_state_key_lazy != request_state_key_lazy:
1904
+ changes[event_type] = request_state_keys
1905
+ continue
1906
+
1907
+ # Or if we have lazy membership and there are invalidated
1908
+ # explicit memberships.
1909
+ if has_lazy and invalidated_state_keys:
1910
+ changes[event_type] = request_state_keys
1911
+ continue
1912
+
1913
+ # At this point there are no wildcards and no additions to the set of
1914
+ # state keys requested, only deletions.
1915
+ #
1916
+ # We only remove state keys from the effective state if they've been
1917
+ # removed from the request *and* the state has changed. This ensures
1918
+ # that if a client removes and then re-adds a state key, we only send
1919
+ # down the associated current state event if its changed (rather than
1920
+ # sending down the same event twice).
1921
+ if invalidated_state_keys:
1922
+ changes[event_type] = old_state_keys - invalidated_state_keys
1923
+
1924
+ # Check for any explicit membership changes that were removed that we can
1925
+ # add to the lazy members previously returned. This is so that we don't
1926
+ # return a user due to lazy loading if they were previously returned as an
1927
+ # explicit membership.
1928
+ users_to_add_to_lazy_cache: set[str] = set()
1929
+
1930
+ membership_changes = changes.get(EventTypes.Member, set())
1931
+ if membership_changes and StateValues.LAZY in request_state_keys:
1932
+ for state_key in prev_required_state_map.get(EventTypes.Member, set()):
1933
+ if state_key == StateValues.WILDCARD or state_key == StateValues.LAZY:
1934
+ # Ignore non-user IDs.
1935
+ continue
1936
+
1937
+ if state_key == StateValues.ME:
1938
+ # Normalize to proper user ID
1939
+ state_key = user_id
1940
+
1941
+ # We remember the user if they haven't been invalidated
1942
+ if (EventTypes.Member, state_key) not in state_deltas:
1943
+ users_to_add_to_lazy_cache.add(state_key)
1944
+
1945
+ new_required_state_map = None
1946
+ if changes:
1947
+ # Update the required state config based on the changes.
1948
+ new_required_state_map = dict(prev_required_state_map)
1949
+ for event_type, state_keys in changes.items():
1950
+ if state_keys:
1951
+ new_required_state_map[event_type] = state_keys
1952
+ else:
1953
+ # Remove entries with empty state keys.
1954
+ new_required_state_map.pop(event_type, None)
1955
+
1956
+ return _RequiredStateChangesReturn(
1957
+ changed_required_state_map=new_required_state_map,
1958
+ added_state_filter=added_state_filter,
1959
+ lazy_members_invalidated=lazy_members_invalidated,
1960
+ extra_users_to_add_to_lazy_cache=users_to_add_to_lazy_cache,
1961
+ )