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,1688 @@
1
+ #
2
+ # This file is licensed under the Affero General Public License (AGPL) version 3.
3
+ #
4
+ # Copyright (C) 2024 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
+ import logging
15
+ from typing import Any, Iterable, Literal
16
+ from unittest.mock import AsyncMock
17
+
18
+ from parameterized import parameterized, parameterized_class
19
+ from typing_extensions import assert_never
20
+
21
+ from twisted.internet.testing import MemoryReactor
22
+
23
+ import synapse.rest.admin
24
+ from synapse.api.constants import (
25
+ AccountDataTypes,
26
+ EventContentFields,
27
+ EventTypes,
28
+ JoinRules,
29
+ Membership,
30
+ RoomTypes,
31
+ )
32
+ from synapse.api.room_versions import RoomVersions
33
+ from synapse.events import EventBase, StrippedStateEvent, make_event_from_dict
34
+ from synapse.events.snapshot import EventContext
35
+ from synapse.handlers.sliding_sync import StateValues
36
+ from synapse.rest.client import account_data, devices, login, receipts, room, sync
37
+ from synapse.server import HomeServer
38
+ from synapse.types import (
39
+ JsonDict,
40
+ RoomStreamToken,
41
+ SlidingSyncStreamToken,
42
+ StreamKeyType,
43
+ StreamToken,
44
+ )
45
+ from synapse.util.clock import Clock
46
+ from synapse.util.stringutils import random_string
47
+
48
+ from tests import unittest
49
+ from tests.server import FakeChannel, TimedOutException
50
+ from tests.test_utils.event_injection import create_event
51
+
52
+ logger = logging.getLogger(__name__)
53
+
54
+
55
+ class SlidingSyncBase(unittest.HomeserverTestCase):
56
+ """Base class for sliding sync test cases"""
57
+
58
+ # Flag as to whether to use the new sliding sync tables or not
59
+ #
60
+ # FIXME: This can be removed once we bump `SCHEMA_COMPAT_VERSION` and run the
61
+ # foreground update for
62
+ # `sliding_sync_joined_rooms`/`sliding_sync_membership_snapshots` (tracked by
63
+ # https://github.com/element-hq/synapse/issues/17623)
64
+ use_new_tables: bool = True
65
+
66
+ sync_endpoint = "/_matrix/client/unstable/org.matrix.simplified_msc3575/sync"
67
+
68
+ def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
69
+ # FIXME: This can be removed once we bump `SCHEMA_COMPAT_VERSION` and run the
70
+ # foreground update for
71
+ # `sliding_sync_joined_rooms`/`sliding_sync_membership_snapshots` (tracked by
72
+ # https://github.com/element-hq/synapse/issues/17623)
73
+ hs.get_datastores().main.have_finished_sliding_sync_background_jobs = AsyncMock( # type: ignore[method-assign]
74
+ return_value=self.use_new_tables
75
+ )
76
+
77
+ def default_config(self) -> JsonDict:
78
+ config = super().default_config()
79
+ # Enable sliding sync
80
+ config["experimental_features"] = {"msc3575_enabled": True}
81
+ return config
82
+
83
+ def make_sync_request(
84
+ self, sync_body: JsonDict, *, since: str | None = None, tok: str
85
+ ) -> FakeChannel:
86
+ """Make a sliding sync request with given body.
87
+
88
+ Attributes:
89
+ sync_body: The full request body to use
90
+ since: Optional since token
91
+ tok: Access token to use
92
+
93
+ Returns:
94
+ A tuple of the response body and the `pos` field.
95
+ """
96
+
97
+ sync_path = self.sync_endpoint
98
+ if since:
99
+ sync_path += f"?pos={since}"
100
+
101
+ channel = self.make_request(
102
+ method="POST",
103
+ path=sync_path,
104
+ content=sync_body,
105
+ access_token=tok,
106
+ )
107
+ return channel
108
+
109
+ def do_sync(
110
+ self, sync_body: JsonDict, *, since: str | None = None, tok: str
111
+ ) -> tuple[JsonDict, str]:
112
+ """Do a sliding sync request with given body.
113
+
114
+ Asserts the request was successful.
115
+
116
+ Attributes:
117
+ sync_body: The full request body to use
118
+ since: Optional since token
119
+ tok: Access token to use
120
+
121
+ Returns:
122
+ A tuple of the response body and the `pos` field.
123
+ """
124
+ channel = self.make_sync_request(sync_body, since=since, tok=tok)
125
+ self.assertEqual(channel.code, 200, channel.json_body)
126
+
127
+ return channel.json_body, channel.json_body["pos"]
128
+
129
+ def _assertRequiredStateIncludes(
130
+ self,
131
+ actual_required_state: Any,
132
+ expected_state_events: Iterable[EventBase],
133
+ exact: bool = False,
134
+ ) -> None:
135
+ """
136
+ Wrapper around `assertIncludes` to give slightly better looking diff error
137
+ messages that include some context "$event_id (type, state_key)".
138
+
139
+ Args:
140
+ actual_required_state: The "required_state" of a room from a Sliding Sync
141
+ request response.
142
+ expected_state_events: The expected state events to be included in the
143
+ `actual_required_state`.
144
+ exact: Whether the actual state should be exactly equal to the expected
145
+ state (no extras).
146
+ """
147
+
148
+ assert isinstance(actual_required_state, list)
149
+ for event in actual_required_state:
150
+ assert isinstance(event, dict)
151
+
152
+ self.assertIncludes(
153
+ {
154
+ f'{event["event_id"]} ("{event["type"]}", "{event["state_key"]}")'
155
+ for event in actual_required_state
156
+ },
157
+ {
158
+ f'{event.event_id} ("{event.type}", "{event.state_key}")'
159
+ for event in expected_state_events
160
+ },
161
+ exact=exact,
162
+ # Message to help understand the diff in context
163
+ message=str(actual_required_state),
164
+ )
165
+
166
+ def _add_new_dm_to_global_account_data(
167
+ self, source_user_id: str, target_user_id: str, target_room_id: str
168
+ ) -> None:
169
+ """
170
+ Helper to handle inserting a new DM for the source user into global account data
171
+ (handles all of the list merging).
172
+
173
+ Args:
174
+ source_user_id: The user ID of the DM mapping we're going to update
175
+ target_user_id: User ID of the person the DM is with
176
+ target_room_id: Room ID of the DM
177
+ """
178
+ store = self.hs.get_datastores().main
179
+
180
+ # Get the current DM map
181
+ existing_dm_map = self.get_success(
182
+ store.get_global_account_data_by_type_for_user(
183
+ source_user_id, AccountDataTypes.DIRECT
184
+ )
185
+ )
186
+ # Scrutinize the account data since it has no concrete type. We're just copying
187
+ # everything into a known type. It should be a mapping from user ID to a list of
188
+ # room IDs. Ignore anything else.
189
+ new_dm_map: dict[str, list[str]] = {}
190
+ if isinstance(existing_dm_map, dict):
191
+ for user_id, room_ids in existing_dm_map.items():
192
+ if isinstance(user_id, str) and isinstance(room_ids, list):
193
+ for room_id in room_ids:
194
+ if isinstance(room_id, str):
195
+ new_dm_map[user_id] = new_dm_map.get(user_id, []) + [
196
+ room_id
197
+ ]
198
+
199
+ # Add the new DM to the map
200
+ new_dm_map[target_user_id] = new_dm_map.get(target_user_id, []) + [
201
+ target_room_id
202
+ ]
203
+ # Save the DM map to global account data
204
+ self.get_success(
205
+ store.add_account_data_for_user(
206
+ source_user_id,
207
+ AccountDataTypes.DIRECT,
208
+ new_dm_map,
209
+ )
210
+ )
211
+
212
+ def _create_dm_room(
213
+ self,
214
+ inviter_user_id: str,
215
+ inviter_tok: str,
216
+ invitee_user_id: str,
217
+ invitee_tok: str,
218
+ should_join_room: bool = True,
219
+ ) -> str:
220
+ """
221
+ Helper to create a DM room as the "inviter" and invite the "invitee" user to the
222
+ room. The "invitee" user also will join the room. The `m.direct` account data
223
+ will be set for both users.
224
+ """
225
+ # Create a room and send an invite the other user
226
+ room_id = self.helper.create_room_as(
227
+ inviter_user_id,
228
+ is_public=False,
229
+ tok=inviter_tok,
230
+ )
231
+ self.helper.invite(
232
+ room_id,
233
+ src=inviter_user_id,
234
+ targ=invitee_user_id,
235
+ tok=inviter_tok,
236
+ extra_data={"is_direct": True},
237
+ )
238
+ if should_join_room:
239
+ # Person that was invited joins the room
240
+ self.helper.join(room_id, invitee_user_id, tok=invitee_tok)
241
+
242
+ # Mimic the client setting the room as a direct message in the global account
243
+ # data for both users.
244
+ self._add_new_dm_to_global_account_data(
245
+ invitee_user_id, inviter_user_id, room_id
246
+ )
247
+ self._add_new_dm_to_global_account_data(
248
+ inviter_user_id, invitee_user_id, room_id
249
+ )
250
+
251
+ return room_id
252
+
253
+ _remote_invite_count: int = 0
254
+
255
+ def _create_remote_invite_room_for_user(
256
+ self,
257
+ invitee_user_id: str,
258
+ unsigned_invite_room_state: list[StrippedStateEvent] | None,
259
+ invite_room_id: str | None = None,
260
+ ) -> tuple[str, EventBase]:
261
+ """
262
+ Create a fake invite for a remote room and persist it.
263
+
264
+ We don't have any state for these kind of rooms and can only rely on the
265
+ stripped state included in the unsigned portion of the invite event to identify
266
+ the room.
267
+
268
+ Args:
269
+ invitee_user_id: The person being invited
270
+ unsigned_invite_room_state: List of stripped state events to assist the
271
+ receiver in identifying the room.
272
+ invite_room_id: Optional remote room ID to be invited to. When unset, we
273
+ will generate one.
274
+
275
+ Returns:
276
+ The room ID of the remote invite room
277
+ """
278
+ store = self.hs.get_datastores().main
279
+
280
+ if invite_room_id is None:
281
+ invite_room_id = f"!test_room{self._remote_invite_count}:remote_server"
282
+
283
+ invite_event_dict = {
284
+ "room_id": invite_room_id,
285
+ "sender": "@inviter:remote_server",
286
+ "state_key": invitee_user_id,
287
+ # Just keep advancing the depth
288
+ "depth": self._remote_invite_count,
289
+ "origin_server_ts": 1,
290
+ "type": EventTypes.Member,
291
+ "content": {"membership": Membership.INVITE},
292
+ "auth_events": [],
293
+ "prev_events": [],
294
+ }
295
+ if unsigned_invite_room_state is not None:
296
+ serialized_stripped_state_events = []
297
+ for stripped_event in unsigned_invite_room_state:
298
+ serialized_stripped_state_events.append(
299
+ {
300
+ "type": stripped_event.type,
301
+ "state_key": stripped_event.state_key,
302
+ "sender": stripped_event.sender,
303
+ "content": stripped_event.content,
304
+ }
305
+ )
306
+
307
+ invite_event_dict["unsigned"] = {
308
+ "invite_room_state": serialized_stripped_state_events
309
+ }
310
+
311
+ invite_event = make_event_from_dict(
312
+ invite_event_dict,
313
+ room_version=RoomVersions.V10,
314
+ )
315
+ invite_event.internal_metadata.outlier = True
316
+ invite_event.internal_metadata.out_of_band_membership = True
317
+
318
+ self.get_success(
319
+ store.maybe_store_room_on_outlier_membership(
320
+ room_id=invite_room_id, room_version=invite_event.room_version
321
+ )
322
+ )
323
+ context = EventContext.for_outlier(self.hs.get_storage_controllers())
324
+ persist_controller = self.hs.get_storage_controllers().persistence
325
+ assert persist_controller is not None
326
+ persisted_event, _, _ = self.get_success(
327
+ persist_controller.persist_event(invite_event, context)
328
+ )
329
+
330
+ self._remote_invite_count += 1
331
+
332
+ return invite_room_id, persisted_event
333
+
334
+ def _bump_notifier_wait_for_events(
335
+ self,
336
+ user_id: str,
337
+ wake_stream_key: Literal[
338
+ StreamKeyType.ACCOUNT_DATA,
339
+ StreamKeyType.PRESENCE,
340
+ ],
341
+ ) -> None:
342
+ """
343
+ Wake-up a `notifier.wait_for_events(user_id)` call without affecting the Sliding
344
+ Sync results.
345
+
346
+ Args:
347
+ user_id: The user ID to wake up the notifier for
348
+ wake_stream_key: The stream key to wake up. This will create an actual new
349
+ entity in that stream so it's best to choose one that won't affect the
350
+ Sliding Sync results you're testing for. In other words, if your testing
351
+ account data, choose `StreamKeyType.PRESENCE` instead. We support two
352
+ possible stream keys because you're probably testing one or the other so
353
+ one is always a "safe" option.
354
+ """
355
+ # We're expecting some new activity from this point onwards
356
+ from_token = self.hs.get_event_sources().get_current_token()
357
+
358
+ triggered_notifier_wait_for_events = False
359
+
360
+ async def _on_new_acivity(
361
+ before_token: StreamToken, after_token: StreamToken
362
+ ) -> bool:
363
+ nonlocal triggered_notifier_wait_for_events
364
+ triggered_notifier_wait_for_events = True
365
+ return True
366
+
367
+ notifier = self.hs.get_notifier()
368
+
369
+ # Listen for some new activity for the user. We're just trying to confirm that
370
+ # our bump below actually does what we think it does (triggers new activity for
371
+ # the user).
372
+ result_awaitable = notifier.wait_for_events(
373
+ user_id,
374
+ 1000,
375
+ _on_new_acivity,
376
+ from_token=from_token,
377
+ )
378
+
379
+ # Update the account data or presence so that `notifier.wait_for_events(...)`
380
+ # wakes up. We chose these two options because they're least likely to show up
381
+ # in the Sliding Sync response so it won't affect whether we have results.
382
+ if wake_stream_key == StreamKeyType.ACCOUNT_DATA:
383
+ self.get_success(
384
+ self.hs.get_account_data_handler().add_account_data_for_user(
385
+ user_id,
386
+ "org.matrix.foobarbaz",
387
+ {"foo": "bar"},
388
+ )
389
+ )
390
+ elif wake_stream_key == StreamKeyType.PRESENCE:
391
+ sending_user_id = self.register_user(
392
+ "user_bump_notifier_wait_for_events_" + random_string(10), "pass"
393
+ )
394
+ sending_user_tok = self.login(sending_user_id, "pass")
395
+ test_msg = {"foo": "bar"}
396
+ chan = self.make_request(
397
+ "PUT",
398
+ "/_matrix/client/r0/sendToDevice/m.test/1234",
399
+ content={"messages": {user_id: {"d1": test_msg}}},
400
+ access_token=sending_user_tok,
401
+ )
402
+ self.assertEqual(chan.code, 200, chan.result)
403
+ else:
404
+ assert_never(wake_stream_key)
405
+
406
+ # Wait for our notifier result
407
+ self.get_success(result_awaitable)
408
+
409
+ if not triggered_notifier_wait_for_events:
410
+ raise AssertionError(
411
+ "Expected `notifier.wait_for_events(...)` to be triggered"
412
+ )
413
+
414
+
415
+ # FIXME: This can be removed once we bump `SCHEMA_COMPAT_VERSION` and run the
416
+ # foreground update for
417
+ # `sliding_sync_joined_rooms`/`sliding_sync_membership_snapshots` (tracked by
418
+ # https://github.com/element-hq/synapse/issues/17623)
419
+ @parameterized_class(
420
+ ("use_new_tables",),
421
+ [
422
+ (True,),
423
+ (False,),
424
+ ],
425
+ class_name_func=lambda cls,
426
+ num,
427
+ params_dict: f"{cls.__name__}_{'new' if params_dict['use_new_tables'] else 'fallback'}",
428
+ )
429
+ class SlidingSyncTestCase(SlidingSyncBase):
430
+ """
431
+ Tests regarding MSC3575 Sliding Sync `/sync` endpoint.
432
+
433
+ Please put tests in more specific test files if applicable. This test class is meant
434
+ for generic behavior of the endpoint.
435
+ """
436
+
437
+ servlets = [
438
+ synapse.rest.admin.register_servlets,
439
+ login.register_servlets,
440
+ room.register_servlets,
441
+ sync.register_servlets,
442
+ devices.register_servlets,
443
+ receipts.register_servlets,
444
+ account_data.register_servlets,
445
+ ]
446
+
447
+ def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
448
+ self.store = hs.get_datastores().main
449
+ self.event_sources = hs.get_event_sources()
450
+ self.storage_controllers = hs.get_storage_controllers()
451
+ self.account_data_handler = hs.get_account_data_handler()
452
+ persistence = self.hs.get_storage_controllers().persistence
453
+ assert persistence is not None
454
+ self.persistence = persistence
455
+
456
+ super().prepare(reactor, clock, hs)
457
+
458
+ def test_sync_list(self) -> None:
459
+ """
460
+ Test that room IDs show up in the Sliding Sync `lists`
461
+ """
462
+ user1_id = self.register_user("user1", "pass")
463
+ user1_tok = self.login(user1_id, "pass")
464
+
465
+ room_id = self.helper.create_room_as(user1_id, tok=user1_tok, is_public=True)
466
+
467
+ # Make the Sliding Sync request
468
+ sync_body = {
469
+ "lists": {
470
+ "foo-list": {
471
+ "ranges": [[0, 99]],
472
+ "required_state": [],
473
+ "timeline_limit": 1,
474
+ }
475
+ }
476
+ }
477
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
478
+
479
+ # Make sure it has the foo-list we requested
480
+ self.assertListEqual(
481
+ list(response_body["lists"].keys()),
482
+ ["foo-list"],
483
+ response_body["lists"].keys(),
484
+ )
485
+
486
+ # Make sure the list includes the room we are joined to
487
+ self.assertListEqual(
488
+ list(response_body["lists"]["foo-list"]["ops"]),
489
+ [
490
+ {
491
+ "op": "SYNC",
492
+ "range": [0, 99],
493
+ "room_ids": [room_id],
494
+ }
495
+ ],
496
+ response_body["lists"]["foo-list"],
497
+ )
498
+
499
+ def test_wait_for_sync_token(self) -> None:
500
+ """
501
+ Test that worker will wait until it catches up to the given token
502
+ """
503
+ user1_id = self.register_user("user1", "pass")
504
+ user1_tok = self.login(user1_id, "pass")
505
+
506
+ # Create a future token that will cause us to wait. Since we never send a new
507
+ # event to reach that future stream_ordering, the worker will wait until the
508
+ # full timeout.
509
+ stream_id_gen = self.store.get_events_stream_id_generator()
510
+ stream_id = self.get_success(stream_id_gen.get_next().__aenter__())
511
+ current_token = self.event_sources.get_current_token()
512
+ future_position_token = current_token.copy_and_replace(
513
+ StreamKeyType.ROOM,
514
+ RoomStreamToken(stream=stream_id),
515
+ )
516
+
517
+ future_position_token_serialized = self.get_success(
518
+ SlidingSyncStreamToken(future_position_token, 0).to_string(self.store)
519
+ )
520
+
521
+ # Make the Sliding Sync request
522
+ sync_body = {
523
+ "lists": {
524
+ "foo-list": {
525
+ "ranges": [[0, 99]],
526
+ "required_state": [],
527
+ "timeline_limit": 1,
528
+ }
529
+ }
530
+ }
531
+ channel = self.make_request(
532
+ "POST",
533
+ self.sync_endpoint + f"?pos={future_position_token_serialized}",
534
+ content=sync_body,
535
+ access_token=user1_tok,
536
+ await_result=False,
537
+ )
538
+ # Block for 10 seconds to make `notifier.wait_for_stream_token(from_token)`
539
+ # timeout
540
+ with self.assertRaises(TimedOutException):
541
+ channel.await_result(timeout_ms=9900)
542
+ channel.await_result(timeout_ms=200)
543
+ self.assertEqual(channel.code, 200, channel.json_body)
544
+
545
+ # We expect the next `pos` in the result to be the same as what we requested
546
+ # with because we weren't able to find anything new yet.
547
+ self.assertEqual(channel.json_body["pos"], future_position_token_serialized)
548
+
549
+ def test_wait_for_new_data(self) -> None:
550
+ """
551
+ Test to make sure that the Sliding Sync request waits for new data to arrive.
552
+
553
+ (Only applies to incremental syncs with a `timeout` specified)
554
+ """
555
+ user1_id = self.register_user("user1", "pass")
556
+ user1_tok = self.login(user1_id, "pass")
557
+ user2_id = self.register_user("user2", "pass")
558
+ user2_tok = self.login(user2_id, "pass")
559
+
560
+ room_id = self.helper.create_room_as(user2_id, tok=user2_tok)
561
+ self.helper.join(room_id, user1_id, tok=user1_tok)
562
+
563
+ sync_body = {
564
+ "lists": {
565
+ "foo-list": {
566
+ "ranges": [[0, 0]],
567
+ "required_state": [],
568
+ "timeline_limit": 1,
569
+ }
570
+ }
571
+ }
572
+ _, from_token = self.do_sync(sync_body, tok=user1_tok)
573
+
574
+ # Make the Sliding Sync request
575
+ channel = self.make_request(
576
+ "POST",
577
+ self.sync_endpoint + f"?timeout=10000&pos={from_token}",
578
+ content=sync_body,
579
+ access_token=user1_tok,
580
+ await_result=False,
581
+ )
582
+ # Block for 5 seconds to make sure we are `notifier.wait_for_events(...)`
583
+ with self.assertRaises(TimedOutException):
584
+ channel.await_result(timeout_ms=5000)
585
+ # Bump the room with new events to trigger new results
586
+ event_response1 = self.helper.send(
587
+ room_id, "new activity in room", tok=user1_tok
588
+ )
589
+ # Should respond before the 10 second timeout
590
+ channel.await_result(timeout_ms=3000)
591
+ self.assertEqual(channel.code, 200, channel.json_body)
592
+
593
+ # Check to make sure the new event is returned
594
+ self.assertEqual(
595
+ [
596
+ event["event_id"]
597
+ for event in channel.json_body["rooms"][room_id]["timeline"]
598
+ ],
599
+ [
600
+ event_response1["event_id"],
601
+ ],
602
+ channel.json_body["rooms"][room_id]["timeline"],
603
+ )
604
+
605
+ def test_wait_for_new_data_timeout(self) -> None:
606
+ """
607
+ Test to make sure that the Sliding Sync request waits for new data to arrive but
608
+ no data ever arrives so we timeout. We're also making sure that the default data
609
+ doesn't trigger a false-positive for new data.
610
+ """
611
+ user1_id = self.register_user("user1", "pass")
612
+ user1_tok = self.login(user1_id, "pass")
613
+ user2_id = self.register_user("user2", "pass")
614
+ user2_tok = self.login(user2_id, "pass")
615
+
616
+ room_id = self.helper.create_room_as(user2_id, tok=user2_tok)
617
+ self.helper.join(room_id, user1_id, tok=user1_tok)
618
+
619
+ sync_body = {
620
+ "lists": {
621
+ "foo-list": {
622
+ "ranges": [[0, 0]],
623
+ "required_state": [],
624
+ "timeline_limit": 1,
625
+ }
626
+ }
627
+ }
628
+ _, from_token = self.do_sync(sync_body, tok=user1_tok)
629
+
630
+ # Make the Sliding Sync request
631
+ channel = self.make_request(
632
+ "POST",
633
+ self.sync_endpoint + f"?timeout=10000&pos={from_token}",
634
+ content=sync_body,
635
+ access_token=user1_tok,
636
+ await_result=False,
637
+ )
638
+ # Block for 5 seconds to make sure we are `notifier.wait_for_events(...)`
639
+ with self.assertRaises(TimedOutException):
640
+ channel.await_result(timeout_ms=5000)
641
+ # Wake-up `notifier.wait_for_events(...)` that will cause us test
642
+ # `SlidingSyncResult.__bool__` for new results.
643
+ self._bump_notifier_wait_for_events(
644
+ user1_id, wake_stream_key=StreamKeyType.ACCOUNT_DATA
645
+ )
646
+ # Block for a little bit more to ensure we don't see any new results.
647
+ with self.assertRaises(TimedOutException):
648
+ channel.await_result(timeout_ms=4000)
649
+ # Wait for the sync to complete (wait for the rest of the 10 second timeout,
650
+ # 5000 + 4000 + 1200 > 10000)
651
+ channel.await_result(timeout_ms=1200)
652
+ self.assertEqual(channel.code, 200, channel.json_body)
653
+
654
+ # There should be no room sent down.
655
+ self.assertFalse(channel.json_body["rooms"])
656
+
657
+ def test_forgotten_up_to_date(self) -> None:
658
+ """
659
+ Make sure we get up-to-date `forgotten` status for rooms
660
+ """
661
+ user1_id = self.register_user("user1", "pass")
662
+ user1_tok = self.login(user1_id, "pass")
663
+ user2_id = self.register_user("user2", "pass")
664
+ user2_tok = self.login(user2_id, "pass")
665
+
666
+ room_id = self.helper.create_room_as(user2_id, tok=user2_tok)
667
+
668
+ # User1 is banned from the room (was never in the room)
669
+ self.helper.ban(room_id, src=user2_id, targ=user1_id, tok=user2_tok)
670
+
671
+ sync_body = {
672
+ "lists": {
673
+ "foo-list": {
674
+ "ranges": [[0, 99]],
675
+ "required_state": [],
676
+ "timeline_limit": 0,
677
+ "filters": {},
678
+ },
679
+ }
680
+ }
681
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
682
+ self.assertIncludes(
683
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
684
+ {room_id},
685
+ exact=True,
686
+ )
687
+
688
+ # User1 forgets the room
689
+ channel = self.make_request(
690
+ "POST",
691
+ f"/_matrix/client/r0/rooms/{room_id}/forget",
692
+ content={},
693
+ access_token=user1_tok,
694
+ )
695
+ self.assertEqual(channel.code, 200, channel.result)
696
+
697
+ # We should no longer see the forgotten room
698
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
699
+ self.assertIncludes(
700
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
701
+ set(),
702
+ exact=True,
703
+ )
704
+
705
+ def test_rejoin_forgotten_room(self) -> None:
706
+ """
707
+ Make sure we can see a forgotten room again if we rejoin (or any new membership
708
+ like an invite) (no longer forgotten)
709
+ """
710
+ user1_id = self.register_user("user1", "pass")
711
+ user1_tok = self.login(user1_id, "pass")
712
+ user2_id = self.register_user("user2", "pass")
713
+ user2_tok = self.login(user2_id, "pass")
714
+
715
+ room_id = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
716
+ # User1 joins the room
717
+ self.helper.join(room_id, user1_id, tok=user1_tok)
718
+
719
+ # Make the Sliding Sync request
720
+ sync_body = {
721
+ "lists": {
722
+ "foo-list": {
723
+ "ranges": [[0, 99]],
724
+ "required_state": [],
725
+ "timeline_limit": 0,
726
+ }
727
+ }
728
+ }
729
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
730
+ # We should see the room (like normal)
731
+ self.assertIncludes(
732
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
733
+ {room_id},
734
+ exact=True,
735
+ )
736
+
737
+ # Leave and forget the room
738
+ self.helper.leave(room_id, user1_id, tok=user1_tok)
739
+ # User1 forgets the room
740
+ channel = self.make_request(
741
+ "POST",
742
+ f"/_matrix/client/r0/rooms/{room_id}/forget",
743
+ content={},
744
+ access_token=user1_tok,
745
+ )
746
+ self.assertEqual(channel.code, 200, channel.result)
747
+
748
+ # Re-join the room
749
+ self.helper.join(room_id, user1_id, tok=user1_tok)
750
+
751
+ # We should see the room again after re-joining
752
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
753
+ self.assertIncludes(
754
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
755
+ {room_id},
756
+ exact=True,
757
+ )
758
+
759
+ def test_invited_to_forgotten_remote_room(self) -> None:
760
+ """
761
+ Make sure we can see a forgotten room again if we are invited again
762
+ (remote/federated out-of-band memberships)
763
+ """
764
+ user1_id = self.register_user("user1", "pass")
765
+ user1_tok = self.login(user1_id, "pass")
766
+
767
+ # Create a remote room invite (out-of-band membership)
768
+ room_id, _ = self._create_remote_invite_room_for_user(user1_id, None)
769
+
770
+ # Make the Sliding Sync request
771
+ sync_body = {
772
+ "lists": {
773
+ "foo-list": {
774
+ "ranges": [[0, 99]],
775
+ "required_state": [],
776
+ "timeline_limit": 0,
777
+ }
778
+ }
779
+ }
780
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
781
+ # We should see the room (like normal)
782
+ self.assertIncludes(
783
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
784
+ {room_id},
785
+ exact=True,
786
+ )
787
+
788
+ # Leave and forget the room
789
+ self.helper.leave(room_id, user1_id, tok=user1_tok)
790
+ # User1 forgets the room
791
+ channel = self.make_request(
792
+ "POST",
793
+ f"/_matrix/client/r0/rooms/{room_id}/forget",
794
+ content={},
795
+ access_token=user1_tok,
796
+ )
797
+ self.assertEqual(channel.code, 200, channel.result)
798
+
799
+ # Get invited to the room again
800
+ # self.helper.join(room_id, user1_id, tok=user1_tok)
801
+ self._create_remote_invite_room_for_user(user1_id, None, invite_room_id=room_id)
802
+
803
+ # We should see the room again after re-joining
804
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
805
+ self.assertIncludes(
806
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
807
+ {room_id},
808
+ exact=True,
809
+ )
810
+
811
+ def test_reject_remote_invite(self) -> None:
812
+ """Test that rejecting a remote invite comes down incremental sync"""
813
+
814
+ user_id = self.register_user("user1", "pass")
815
+ user_tok = self.login(user_id, "pass")
816
+
817
+ # Create a remote room invite (out-of-band membership)
818
+ room_id = "!room:remote.server"
819
+ self._create_remote_invite_room_for_user(user_id, None, room_id)
820
+
821
+ # Make the Sliding Sync request
822
+ sync_body = {
823
+ "lists": {
824
+ "foo-list": {
825
+ "ranges": [[0, 1]],
826
+ "required_state": [(EventTypes.Member, StateValues.ME)],
827
+ "timeline_limit": 3,
828
+ }
829
+ }
830
+ }
831
+ response_body, from_token = self.do_sync(sync_body, tok=user_tok)
832
+ # We should see the room (like normal)
833
+ self.assertIncludes(
834
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
835
+ {room_id},
836
+ exact=True,
837
+ )
838
+
839
+ # Reject the remote room invite
840
+ self.helper.leave(room_id, user_id, tok=user_tok)
841
+
842
+ # Sync again after rejecting the invite
843
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user_tok)
844
+
845
+ # The fix to add the leave event to incremental sync when rejecting a remote
846
+ # invite relies on the new tables to work.
847
+ if self.use_new_tables:
848
+ # We should see the newly_left room
849
+ self.assertIncludes(
850
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
851
+ {room_id},
852
+ exact=True,
853
+ )
854
+ # We should see the leave state for the room so clients don't end up with stuck
855
+ # invites
856
+ self.assertIncludes(
857
+ {
858
+ (
859
+ state["type"],
860
+ state["state_key"],
861
+ state["content"].get("membership"),
862
+ )
863
+ for state in response_body["rooms"][room_id]["required_state"]
864
+ },
865
+ {(EventTypes.Member, user_id, Membership.LEAVE)},
866
+ exact=True,
867
+ )
868
+
869
+ def test_ignored_user_invites_initial_sync(self) -> None:
870
+ """
871
+ Make sure we ignore invites if they are from one of the `m.ignored_user_list` on
872
+ initial sync.
873
+ """
874
+ user1_id = self.register_user("user1", "pass")
875
+ user1_tok = self.login(user1_id, "pass")
876
+ user2_id = self.register_user("user2", "pass")
877
+ user2_tok = self.login(user2_id, "pass")
878
+
879
+ # Create a room that user1 is already in
880
+ room_id1 = self.helper.create_room_as(user1_id, tok=user1_tok)
881
+
882
+ # Create a room that user2 is already in
883
+ room_id2 = self.helper.create_room_as(user2_id, tok=user2_tok)
884
+
885
+ # User1 is invited to room_id2
886
+ self.helper.invite(room_id2, src=user2_id, targ=user1_id, tok=user2_tok)
887
+
888
+ # Sync once before we ignore to make sure the rooms can show up
889
+ sync_body = {
890
+ "lists": {
891
+ "foo-list": {
892
+ "ranges": [[0, 99]],
893
+ "required_state": [],
894
+ "timeline_limit": 0,
895
+ },
896
+ }
897
+ }
898
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
899
+ # room_id2 shows up because we haven't ignored the user yet
900
+ self.assertIncludes(
901
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
902
+ {room_id1, room_id2},
903
+ exact=True,
904
+ )
905
+
906
+ # User1 ignores user2
907
+ channel = self.make_request(
908
+ "PUT",
909
+ f"/_matrix/client/v3/user/{user1_id}/account_data/{AccountDataTypes.IGNORED_USER_LIST}",
910
+ content={"ignored_users": {user2_id: {}}},
911
+ access_token=user1_tok,
912
+ )
913
+ self.assertEqual(channel.code, 200, channel.result)
914
+
915
+ # Sync again (initial sync)
916
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
917
+ # The invite for room_id2 should no longer show up because user2 is ignored
918
+ self.assertIncludes(
919
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
920
+ {room_id1},
921
+ exact=True,
922
+ )
923
+
924
+ def test_ignored_user_invites_incremental_sync(self) -> None:
925
+ """
926
+ Make sure we ignore invites if they are from one of the `m.ignored_user_list` on
927
+ incremental sync.
928
+ """
929
+ user1_id = self.register_user("user1", "pass")
930
+ user1_tok = self.login(user1_id, "pass")
931
+ user2_id = self.register_user("user2", "pass")
932
+ user2_tok = self.login(user2_id, "pass")
933
+
934
+ # Create a room that user1 is already in
935
+ room_id1 = self.helper.create_room_as(user1_id, tok=user1_tok)
936
+
937
+ # Create a room that user2 is already in
938
+ room_id2 = self.helper.create_room_as(user2_id, tok=user2_tok)
939
+
940
+ # User1 ignores user2
941
+ channel = self.make_request(
942
+ "PUT",
943
+ f"/_matrix/client/v3/user/{user1_id}/account_data/{AccountDataTypes.IGNORED_USER_LIST}",
944
+ content={"ignored_users": {user2_id: {}}},
945
+ access_token=user1_tok,
946
+ )
947
+ self.assertEqual(channel.code, 200, channel.result)
948
+
949
+ # Initial sync
950
+ sync_body = {
951
+ "lists": {
952
+ "foo-list": {
953
+ "ranges": [[0, 99]],
954
+ "required_state": [],
955
+ "timeline_limit": 0,
956
+ },
957
+ }
958
+ }
959
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
960
+ # User1 only has membership in room_id1 at this point
961
+ self.assertIncludes(
962
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
963
+ {room_id1},
964
+ exact=True,
965
+ )
966
+
967
+ # User1 is invited to room_id2 after the initial sync
968
+ self.helper.invite(room_id2, src=user2_id, targ=user1_id, tok=user2_tok)
969
+
970
+ # Sync again (incremental sync)
971
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
972
+ # The invite for room_id2 doesn't show up because user2 is ignored
973
+ self.assertIncludes(
974
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
975
+ {room_id1},
976
+ exact=True,
977
+ )
978
+
979
+ def test_sort_list(self) -> None:
980
+ """
981
+ Test that the `lists` are sorted by `stream_ordering`
982
+ """
983
+ user1_id = self.register_user("user1", "pass")
984
+ user1_tok = self.login(user1_id, "pass")
985
+
986
+ room_id1 = self.helper.create_room_as(user1_id, tok=user1_tok, is_public=True)
987
+ room_id2 = self.helper.create_room_as(user1_id, tok=user1_tok, is_public=True)
988
+ room_id3 = self.helper.create_room_as(user1_id, tok=user1_tok, is_public=True)
989
+
990
+ # Activity that will order the rooms
991
+ self.helper.send(room_id3, "activity in room3", tok=user1_tok)
992
+ self.helper.send(room_id1, "activity in room1", tok=user1_tok)
993
+ self.helper.send(room_id2, "activity in room2", tok=user1_tok)
994
+
995
+ # Make the Sliding Sync request where the range includes *some* of the rooms
996
+ sync_body = {
997
+ "lists": {
998
+ "foo-list": {
999
+ "ranges": [[0, 1]],
1000
+ "required_state": [],
1001
+ "timeline_limit": 1,
1002
+ }
1003
+ }
1004
+ }
1005
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
1006
+
1007
+ # Make sure it has the foo-list we requested
1008
+ self.assertIncludes(
1009
+ response_body["lists"].keys(),
1010
+ {"foo-list"},
1011
+ )
1012
+ # Make sure the list is sorted in the way we expect (we only sort when the range
1013
+ # doesn't include all of the room)
1014
+ self.assertListEqual(
1015
+ list(response_body["lists"]["foo-list"]["ops"]),
1016
+ [
1017
+ {
1018
+ "op": "SYNC",
1019
+ "range": [0, 1],
1020
+ "room_ids": [room_id2, room_id1],
1021
+ }
1022
+ ],
1023
+ response_body["lists"]["foo-list"],
1024
+ )
1025
+
1026
+ # Make the Sliding Sync request where the range includes *all* of the rooms
1027
+ sync_body = {
1028
+ "lists": {
1029
+ "foo-list": {
1030
+ "ranges": [[0, 99]],
1031
+ "required_state": [],
1032
+ "timeline_limit": 1,
1033
+ }
1034
+ }
1035
+ }
1036
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
1037
+
1038
+ # Make sure it has the foo-list we requested
1039
+ self.assertIncludes(
1040
+ response_body["lists"].keys(),
1041
+ {"foo-list"},
1042
+ )
1043
+ # Since the range includes all of the rooms, we don't sort the list
1044
+ self.assertEqual(
1045
+ len(response_body["lists"]["foo-list"]["ops"]),
1046
+ 1,
1047
+ response_body["lists"]["foo-list"],
1048
+ )
1049
+ op = response_body["lists"]["foo-list"]["ops"][0]
1050
+ self.assertEqual(op["op"], "SYNC")
1051
+ self.assertEqual(op["range"], [0, 99])
1052
+ # Note that we don't sort the rooms when the range includes all of the rooms, so
1053
+ # we just assert that the rooms are included
1054
+ self.assertIncludes(
1055
+ set(op["room_ids"]), {room_id1, room_id2, room_id3}, exact=True
1056
+ )
1057
+
1058
+ def test_sliced_windows(self) -> None:
1059
+ """
1060
+ Test that the `lists` `ranges` are sliced correctly. Both sides of each range
1061
+ are inclusive.
1062
+ """
1063
+ user1_id = self.register_user("user1", "pass")
1064
+ user1_tok = self.login(user1_id, "pass")
1065
+
1066
+ _room_id1 = self.helper.create_room_as(user1_id, tok=user1_tok, is_public=True)
1067
+ room_id2 = self.helper.create_room_as(user1_id, tok=user1_tok, is_public=True)
1068
+ room_id3 = self.helper.create_room_as(user1_id, tok=user1_tok, is_public=True)
1069
+
1070
+ # Make the Sliding Sync request for a single room
1071
+ sync_body = {
1072
+ "lists": {
1073
+ "foo-list": {
1074
+ "ranges": [[0, 0]],
1075
+ "required_state": [],
1076
+ "timeline_limit": 1,
1077
+ }
1078
+ }
1079
+ }
1080
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
1081
+
1082
+ # Make sure it has the foo-list we requested
1083
+ self.assertListEqual(
1084
+ list(response_body["lists"].keys()),
1085
+ ["foo-list"],
1086
+ response_body["lists"].keys(),
1087
+ )
1088
+ # Make sure the list is sorted in the way we expect
1089
+ self.assertListEqual(
1090
+ list(response_body["lists"]["foo-list"]["ops"]),
1091
+ [
1092
+ {
1093
+ "op": "SYNC",
1094
+ "range": [0, 0],
1095
+ "room_ids": [room_id3],
1096
+ }
1097
+ ],
1098
+ response_body["lists"]["foo-list"],
1099
+ )
1100
+
1101
+ # Make the Sliding Sync request for the first two rooms
1102
+ sync_body = {
1103
+ "lists": {
1104
+ "foo-list": {
1105
+ "ranges": [[0, 1]],
1106
+ "required_state": [],
1107
+ "timeline_limit": 1,
1108
+ }
1109
+ }
1110
+ }
1111
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
1112
+
1113
+ # Make sure it has the foo-list we requested
1114
+ self.assertListEqual(
1115
+ list(response_body["lists"].keys()),
1116
+ ["foo-list"],
1117
+ response_body["lists"].keys(),
1118
+ )
1119
+ # Make sure the list is sorted in the way we expect
1120
+ self.assertListEqual(
1121
+ list(response_body["lists"]["foo-list"]["ops"]),
1122
+ [
1123
+ {
1124
+ "op": "SYNC",
1125
+ "range": [0, 1],
1126
+ "room_ids": [room_id3, room_id2],
1127
+ }
1128
+ ],
1129
+ response_body["lists"]["foo-list"],
1130
+ )
1131
+
1132
+ def test_rooms_with_no_updates_do_not_come_down_incremental_sync(self) -> None:
1133
+ """
1134
+ Test that rooms with no updates are returned in subsequent incremental
1135
+ syncs.
1136
+ """
1137
+
1138
+ user1_id = self.register_user("user1", "pass")
1139
+ user1_tok = self.login(user1_id, "pass")
1140
+
1141
+ room_id1 = self.helper.create_room_as(user1_id, tok=user1_tok)
1142
+
1143
+ sync_body = {
1144
+ "lists": {
1145
+ "foo-list": {
1146
+ "ranges": [[0, 1]],
1147
+ "required_state": [],
1148
+ "timeline_limit": 0,
1149
+ }
1150
+ }
1151
+ }
1152
+
1153
+ _, from_token = self.do_sync(sync_body, tok=user1_tok)
1154
+
1155
+ # Make the incremental Sliding Sync request
1156
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
1157
+
1158
+ # Nothing has happened in the room, so the room should not come down
1159
+ # /sync.
1160
+ self.assertIsNone(response_body["rooms"].get(room_id1))
1161
+
1162
+ def test_empty_initial_room_comes_down_sync(self) -> None:
1163
+ """
1164
+ Test that rooms come down /sync even with empty required state and
1165
+ timeline limit in initial sync.
1166
+ """
1167
+
1168
+ user1_id = self.register_user("user1", "pass")
1169
+ user1_tok = self.login(user1_id, "pass")
1170
+
1171
+ room_id1 = self.helper.create_room_as(user1_id, tok=user1_tok)
1172
+
1173
+ sync_body = {
1174
+ "lists": {
1175
+ "foo-list": {
1176
+ "ranges": [[0, 1]],
1177
+ "required_state": [],
1178
+ "timeline_limit": 0,
1179
+ }
1180
+ }
1181
+ }
1182
+
1183
+ # Make the Sliding Sync request
1184
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
1185
+ self.assertEqual(response_body["rooms"][room_id1]["initial"], True)
1186
+
1187
+ def test_state_reset_room_comes_down_incremental_sync(self) -> None:
1188
+ """Test that a room that we were state reset out of comes down
1189
+ incremental sync"""
1190
+
1191
+ user1_id = self.register_user("user1", "pass")
1192
+ user1_tok = self.login(user1_id, "pass")
1193
+ user2_id = self.register_user("user2", "pass")
1194
+ user2_tok = self.login(user2_id, "pass")
1195
+
1196
+ room_id1 = self.helper.create_room_as(
1197
+ user2_id,
1198
+ is_public=True,
1199
+ tok=user2_tok,
1200
+ extra_content={
1201
+ "name": "my super room",
1202
+ },
1203
+ )
1204
+
1205
+ # Create an event for us to point back to for the state reset
1206
+ event_response = self.helper.send(room_id1, "test", tok=user2_tok)
1207
+ event_id = event_response["event_id"]
1208
+
1209
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
1210
+
1211
+ sync_body = {
1212
+ "lists": {
1213
+ "foo-list": {
1214
+ "ranges": [[0, 1]],
1215
+ "required_state": [
1216
+ # Request all state just to see what we get back when we are
1217
+ # state reset out of the room
1218
+ [StateValues.WILDCARD, StateValues.WILDCARD]
1219
+ ],
1220
+ "timeline_limit": 1,
1221
+ }
1222
+ }
1223
+ }
1224
+
1225
+ # Make the Sliding Sync request
1226
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
1227
+ # Make sure we see room1
1228
+ self.assertIncludes(set(response_body["rooms"].keys()), {room_id1}, exact=True)
1229
+ self.assertEqual(response_body["rooms"][room_id1]["initial"], True)
1230
+
1231
+ # Trigger a state reset
1232
+ join_rule_event, join_rule_context = self.get_success(
1233
+ create_event(
1234
+ self.hs,
1235
+ prev_event_ids=[event_id],
1236
+ type=EventTypes.JoinRules,
1237
+ state_key="",
1238
+ content={"join_rule": JoinRules.INVITE},
1239
+ sender=user2_id,
1240
+ room_id=room_id1,
1241
+ room_version=self.get_success(self.store.get_room_version_id(room_id1)),
1242
+ )
1243
+ )
1244
+ _, join_rule_event_pos, _ = self.get_success(
1245
+ self.persistence.persist_event(join_rule_event, join_rule_context)
1246
+ )
1247
+
1248
+ # Ensure that the state reset worked and only user2 is in the room now
1249
+ users_in_room = self.get_success(self.store.get_users_in_room(room_id1))
1250
+ self.assertIncludes(set(users_in_room), {user2_id}, exact=True)
1251
+
1252
+ state_map_at_reset = self.get_success(
1253
+ self.storage_controllers.state.get_current_state(room_id1)
1254
+ )
1255
+
1256
+ # Update the state after user1 was state reset out of the room
1257
+ self.helper.send_state(
1258
+ room_id1,
1259
+ EventTypes.Name,
1260
+ {EventContentFields.ROOM_NAME: "my super duper room"},
1261
+ tok=user2_tok,
1262
+ )
1263
+
1264
+ # Make another Sliding Sync request (incremental)
1265
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
1266
+
1267
+ # Expect to see room1 because it is `newly_left` thanks to being state reset out
1268
+ # of it since the last time we synced. We need to let the client know that
1269
+ # something happened and that they are no longer in the room.
1270
+ self.assertIncludes(set(response_body["rooms"].keys()), {room_id1}, exact=True)
1271
+ # We set `initial=True` to indicate that the client should reset the state they
1272
+ # have about the room
1273
+ self.assertEqual(response_body["rooms"][room_id1]["initial"], True)
1274
+ # They shouldn't see anything past the state reset
1275
+ self._assertRequiredStateIncludes(
1276
+ response_body["rooms"][room_id1]["required_state"],
1277
+ # We should see all the state events in the room
1278
+ state_map_at_reset.values(),
1279
+ exact=True,
1280
+ )
1281
+ # The position where the state reset happened
1282
+ self.assertEqual(
1283
+ response_body["rooms"][room_id1]["bump_stamp"],
1284
+ join_rule_event_pos.stream,
1285
+ response_body["rooms"][room_id1],
1286
+ )
1287
+
1288
+ # Other non-important things. We just want to check what these are so we know
1289
+ # what happens in a state reset scenario.
1290
+ #
1291
+ # Room name was set at the time of the state reset so we should still be able to
1292
+ # see it.
1293
+ self.assertEqual(response_body["rooms"][room_id1]["name"], "my super room")
1294
+ # Could be set but there is no avatar for this room
1295
+ self.assertIsNone(
1296
+ response_body["rooms"][room_id1].get("avatar"),
1297
+ response_body["rooms"][room_id1],
1298
+ )
1299
+ # Could be set but this room isn't marked as a DM
1300
+ self.assertIsNone(
1301
+ response_body["rooms"][room_id1].get("is_dm"),
1302
+ response_body["rooms"][room_id1],
1303
+ )
1304
+ # Empty timeline because we are not in the room at all (they are all being
1305
+ # filtered out)
1306
+ self.assertIsNone(
1307
+ response_body["rooms"][room_id1].get("timeline"),
1308
+ response_body["rooms"][room_id1],
1309
+ )
1310
+ # `limited` since we're not providing any timeline events but there are some in
1311
+ # the room.
1312
+ self.assertEqual(response_body["rooms"][room_id1]["limited"], True)
1313
+ # User is no longer in the room so they can't see this info
1314
+ self.assertIsNone(
1315
+ response_body["rooms"][room_id1].get("joined_count"),
1316
+ response_body["rooms"][room_id1],
1317
+ )
1318
+ self.assertIsNone(
1319
+ response_body["rooms"][room_id1].get("invited_count"),
1320
+ response_body["rooms"][room_id1],
1321
+ )
1322
+
1323
+ def test_state_reset_previously_room_comes_down_incremental_sync_with_filters(
1324
+ self,
1325
+ ) -> None:
1326
+ """
1327
+ Test that a room that we were state reset out of should always be sent down
1328
+ regardless of the filters if it has been sent down the connection before.
1329
+ """
1330
+ user1_id = self.register_user("user1", "pass")
1331
+ user1_tok = self.login(user1_id, "pass")
1332
+ user2_id = self.register_user("user2", "pass")
1333
+ user2_tok = self.login(user2_id, "pass")
1334
+
1335
+ # Create a space room
1336
+ space_room_id = self.helper.create_room_as(
1337
+ user2_id,
1338
+ tok=user2_tok,
1339
+ extra_content={
1340
+ "creation_content": {EventContentFields.ROOM_TYPE: RoomTypes.SPACE},
1341
+ "name": "my super space",
1342
+ },
1343
+ )
1344
+
1345
+ # Create an event for us to point back to for the state reset
1346
+ event_response = self.helper.send(space_room_id, "test", tok=user2_tok)
1347
+ event_id = event_response["event_id"]
1348
+
1349
+ self.helper.join(space_room_id, user1_id, tok=user1_tok)
1350
+
1351
+ sync_body = {
1352
+ "lists": {
1353
+ "foo-list": {
1354
+ "ranges": [[0, 1]],
1355
+ "required_state": [
1356
+ # Request all state just to see what we get back when we are
1357
+ # state reset out of the room
1358
+ [StateValues.WILDCARD, StateValues.WILDCARD]
1359
+ ],
1360
+ "timeline_limit": 1,
1361
+ "filters": {
1362
+ "room_types": [RoomTypes.SPACE],
1363
+ },
1364
+ }
1365
+ }
1366
+ }
1367
+
1368
+ # Make the Sliding Sync request
1369
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
1370
+ # Make sure we see room1
1371
+ self.assertIncludes(
1372
+ set(response_body["rooms"].keys()), {space_room_id}, exact=True
1373
+ )
1374
+ self.assertEqual(response_body["rooms"][space_room_id]["initial"], True)
1375
+
1376
+ # Trigger a state reset
1377
+ join_rule_event, join_rule_context = self.get_success(
1378
+ create_event(
1379
+ self.hs,
1380
+ prev_event_ids=[event_id],
1381
+ type=EventTypes.JoinRules,
1382
+ state_key="",
1383
+ content={"join_rule": JoinRules.INVITE},
1384
+ sender=user2_id,
1385
+ room_id=space_room_id,
1386
+ room_version=self.get_success(
1387
+ self.store.get_room_version_id(space_room_id)
1388
+ ),
1389
+ )
1390
+ )
1391
+ _, join_rule_event_pos, _ = self.get_success(
1392
+ self.persistence.persist_event(join_rule_event, join_rule_context)
1393
+ )
1394
+
1395
+ # Ensure that the state reset worked and only user2 is in the room now
1396
+ users_in_room = self.get_success(self.store.get_users_in_room(space_room_id))
1397
+ self.assertIncludes(set(users_in_room), {user2_id}, exact=True)
1398
+
1399
+ state_map_at_reset = self.get_success(
1400
+ self.storage_controllers.state.get_current_state(space_room_id)
1401
+ )
1402
+
1403
+ # Update the state after user1 was state reset out of the room
1404
+ self.helper.send_state(
1405
+ space_room_id,
1406
+ EventTypes.Name,
1407
+ {EventContentFields.ROOM_NAME: "my super duper space"},
1408
+ tok=user2_tok,
1409
+ )
1410
+
1411
+ # User2 also leaves the room so the server is no longer participating in the room
1412
+ # and we don't have access to current state
1413
+ self.helper.leave(space_room_id, user2_id, tok=user2_tok)
1414
+
1415
+ # Make another Sliding Sync request (incremental)
1416
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
1417
+
1418
+ # Expect to see room1 because it is `newly_left` thanks to being state reset out
1419
+ # of it since the last time we synced. We need to let the client know that
1420
+ # something happened and that they are no longer in the room.
1421
+ self.assertIncludes(
1422
+ set(response_body["rooms"].keys()), {space_room_id}, exact=True
1423
+ )
1424
+ # We set `initial=True` to indicate that the client should reset the state they
1425
+ # have about the room
1426
+ self.assertEqual(response_body["rooms"][space_room_id]["initial"], True)
1427
+ # They shouldn't see anything past the state reset
1428
+ self._assertRequiredStateIncludes(
1429
+ response_body["rooms"][space_room_id]["required_state"],
1430
+ # We should see all the state events in the room
1431
+ state_map_at_reset.values(),
1432
+ exact=True,
1433
+ )
1434
+ # The position where the state reset happened
1435
+ self.assertEqual(
1436
+ response_body["rooms"][space_room_id]["bump_stamp"],
1437
+ join_rule_event_pos.stream,
1438
+ response_body["rooms"][space_room_id],
1439
+ )
1440
+
1441
+ # Other non-important things. We just want to check what these are so we know
1442
+ # what happens in a state reset scenario.
1443
+ #
1444
+ # Room name was set at the time of the state reset so we should still be able to
1445
+ # see it.
1446
+ self.assertEqual(
1447
+ response_body["rooms"][space_room_id]["name"], "my super space"
1448
+ )
1449
+ # Could be set but there is no avatar for this room
1450
+ self.assertIsNone(
1451
+ response_body["rooms"][space_room_id].get("avatar"),
1452
+ response_body["rooms"][space_room_id],
1453
+ )
1454
+ # Could be set but this room isn't marked as a DM
1455
+ self.assertIsNone(
1456
+ response_body["rooms"][space_room_id].get("is_dm"),
1457
+ response_body["rooms"][space_room_id],
1458
+ )
1459
+ # Empty timeline because we are not in the room at all (they are all being
1460
+ # filtered out)
1461
+ self.assertIsNone(
1462
+ response_body["rooms"][space_room_id].get("timeline"),
1463
+ response_body["rooms"][space_room_id],
1464
+ )
1465
+ # `limited` since we're not providing any timeline events but there are some in
1466
+ # the room.
1467
+ self.assertEqual(response_body["rooms"][space_room_id]["limited"], True)
1468
+ # User is no longer in the room so they can't see this info
1469
+ self.assertIsNone(
1470
+ response_body["rooms"][space_room_id].get("joined_count"),
1471
+ response_body["rooms"][space_room_id],
1472
+ )
1473
+ self.assertIsNone(
1474
+ response_body["rooms"][space_room_id].get("invited_count"),
1475
+ response_body["rooms"][space_room_id],
1476
+ )
1477
+
1478
+ @parameterized.expand(
1479
+ [
1480
+ ("server_leaves_room", True),
1481
+ ("server_participating_in_room", False),
1482
+ ]
1483
+ )
1484
+ def test_state_reset_never_room_incremental_sync_with_filters(
1485
+ self, test_description: str, server_leaves_room: bool
1486
+ ) -> None:
1487
+ """
1488
+ Test that a room that we were state reset out of should be sent down if we can
1489
+ figure out the state or if it was sent down the connection before.
1490
+ """
1491
+ user1_id = self.register_user("user1", "pass")
1492
+ user1_tok = self.login(user1_id, "pass")
1493
+ user2_id = self.register_user("user2", "pass")
1494
+ user2_tok = self.login(user2_id, "pass")
1495
+
1496
+ # Create a space room
1497
+ space_room_id = self.helper.create_room_as(
1498
+ user2_id,
1499
+ tok=user2_tok,
1500
+ extra_content={
1501
+ "creation_content": {EventContentFields.ROOM_TYPE: RoomTypes.SPACE},
1502
+ "name": "my super space",
1503
+ },
1504
+ )
1505
+
1506
+ # Create another space room
1507
+ space_room_id2 = self.helper.create_room_as(
1508
+ user2_id,
1509
+ tok=user2_tok,
1510
+ extra_content={
1511
+ "creation_content": {EventContentFields.ROOM_TYPE: RoomTypes.SPACE},
1512
+ },
1513
+ )
1514
+
1515
+ # Create an event for us to point back to for the state reset
1516
+ event_response = self.helper.send(space_room_id, "test", tok=user2_tok)
1517
+ event_id = event_response["event_id"]
1518
+
1519
+ # User1 joins the rooms
1520
+ #
1521
+ self.helper.join(space_room_id, user1_id, tok=user1_tok)
1522
+ # Join space_room_id2 so that it is at the top of the list
1523
+ self.helper.join(space_room_id2, user1_id, tok=user1_tok)
1524
+
1525
+ # Make a SS request for only the top room.
1526
+ sync_body = {
1527
+ "lists": {
1528
+ "foo-list": {
1529
+ "ranges": [[0, 0]],
1530
+ "required_state": [
1531
+ # Request all state just to see what we get back when we are
1532
+ # state reset out of the room
1533
+ [StateValues.WILDCARD, StateValues.WILDCARD]
1534
+ ],
1535
+ "timeline_limit": 1,
1536
+ "filters": {
1537
+ "room_types": [RoomTypes.SPACE],
1538
+ },
1539
+ }
1540
+ }
1541
+ }
1542
+
1543
+ # Make the Sliding Sync request
1544
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
1545
+ # Make sure we only see space_room_id2
1546
+ self.assertIncludes(
1547
+ set(response_body["rooms"].keys()), {space_room_id2}, exact=True
1548
+ )
1549
+ self.assertEqual(response_body["rooms"][space_room_id2]["initial"], True)
1550
+
1551
+ # Just create some activity in space_room_id2 so it appears when we incremental sync again
1552
+ self.helper.send(space_room_id2, "test", tok=user2_tok)
1553
+
1554
+ # Trigger a state reset
1555
+ join_rule_event, join_rule_context = self.get_success(
1556
+ create_event(
1557
+ self.hs,
1558
+ prev_event_ids=[event_id],
1559
+ type=EventTypes.JoinRules,
1560
+ state_key="",
1561
+ content={"join_rule": JoinRules.INVITE},
1562
+ sender=user2_id,
1563
+ room_id=space_room_id,
1564
+ room_version=self.get_success(
1565
+ self.store.get_room_version_id(space_room_id)
1566
+ ),
1567
+ )
1568
+ )
1569
+ _, join_rule_event_pos, _ = self.get_success(
1570
+ self.persistence.persist_event(join_rule_event, join_rule_context)
1571
+ )
1572
+
1573
+ # Ensure that the state reset worked and only user2 is in the room now
1574
+ users_in_room = self.get_success(self.store.get_users_in_room(space_room_id))
1575
+ self.assertIncludes(set(users_in_room), {user2_id}, exact=True)
1576
+
1577
+ # Update the state after user1 was state reset out of the room.
1578
+ # This will also bump it to the top of the list.
1579
+ self.helper.send_state(
1580
+ space_room_id,
1581
+ EventTypes.Name,
1582
+ {EventContentFields.ROOM_NAME: "my super duper space"},
1583
+ tok=user2_tok,
1584
+ )
1585
+
1586
+ if server_leaves_room:
1587
+ # User2 also leaves the room so the server is no longer participating in the room
1588
+ # and we don't have access to current state
1589
+ self.helper.leave(space_room_id, user2_id, tok=user2_tok)
1590
+
1591
+ # Make another Sliding Sync request (incremental)
1592
+ sync_body = {
1593
+ "lists": {
1594
+ "foo-list": {
1595
+ # Expand the range to include all rooms
1596
+ "ranges": [[0, 1]],
1597
+ "required_state": [
1598
+ # Request all state just to see what we get back when we are
1599
+ # state reset out of the room
1600
+ [StateValues.WILDCARD, StateValues.WILDCARD]
1601
+ ],
1602
+ "timeline_limit": 1,
1603
+ "filters": {
1604
+ "room_types": [RoomTypes.SPACE],
1605
+ },
1606
+ }
1607
+ }
1608
+ }
1609
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
1610
+
1611
+ if self.use_new_tables:
1612
+ if server_leaves_room:
1613
+ # We still only expect to see space_room_id2 because even though we were state
1614
+ # reset out of space_room_id, it was never sent down the connection before so we
1615
+ # don't need to bother the client with it.
1616
+ self.assertIncludes(
1617
+ set(response_body["rooms"].keys()), {space_room_id2}, exact=True
1618
+ )
1619
+ else:
1620
+ # Both rooms show up because we can figure out the state for the
1621
+ # `filters.room_types` if someone is still in the room (we look at the
1622
+ # current state because `room_type` never changes).
1623
+ self.assertIncludes(
1624
+ set(response_body["rooms"].keys()),
1625
+ {space_room_id, space_room_id2},
1626
+ exact=True,
1627
+ )
1628
+ else:
1629
+ # Both rooms show up because we can actually take the time to figure out the
1630
+ # state for the `filters.room_types` in the fallback path (we look at
1631
+ # historical state for `LEAVE` membership).
1632
+ self.assertIncludes(
1633
+ set(response_body["rooms"].keys()),
1634
+ {space_room_id, space_room_id2},
1635
+ exact=True,
1636
+ )
1637
+
1638
+ def test_exclude_rooms_from_sync(self) -> None:
1639
+ """Tests that sliding sync honours the `exclude_rooms_from_sync` config
1640
+ option.
1641
+ """
1642
+ user1_id = self.register_user("user1", "pass")
1643
+ user1_tok = self.login(user1_id, "pass")
1644
+
1645
+ room_id_to_exclude = self.helper.create_room_as(
1646
+ user1_id,
1647
+ tok=user1_tok,
1648
+ )
1649
+ room_id_to_include = self.helper.create_room_as(
1650
+ user1_id,
1651
+ tok=user1_tok,
1652
+ )
1653
+
1654
+ # We cheekily modify the stored config here, as we can't add it to the
1655
+ # raw config since we don't know the room ID before we start up.
1656
+ self.hs.get_sliding_sync_handler().rooms_to_exclude_globally.append(
1657
+ room_id_to_exclude
1658
+ )
1659
+ self.hs.get_sliding_sync_handler().room_lists.rooms_to_exclude_globally.append(
1660
+ room_id_to_exclude
1661
+ )
1662
+
1663
+ # Make the Sliding Sync request
1664
+ sync_body = {
1665
+ "lists": {
1666
+ "foo-list": {
1667
+ "ranges": [[0, 99]],
1668
+ "required_state": [],
1669
+ "timeline_limit": 0,
1670
+ },
1671
+ }
1672
+ }
1673
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
1674
+
1675
+ # Make sure response only contains room_id_to_include
1676
+ self.assertIncludes(
1677
+ set(response_body["rooms"].keys()),
1678
+ {room_id_to_include},
1679
+ exact=True,
1680
+ )
1681
+
1682
+ # Test that the excluded room is not in the list ops
1683
+ # Make sure the list is sorted in the way we expect
1684
+ self.assertIncludes(
1685
+ set(response_body["lists"]["foo-list"]["ops"][0]["room_ids"]),
1686
+ {room_id_to_include},
1687
+ exact=True,
1688
+ )