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,2247 @@
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 enum
15
+ import logging
16
+
17
+ from parameterized import parameterized, parameterized_class
18
+
19
+ from twisted.internet.testing import MemoryReactor
20
+
21
+ import synapse.rest.admin
22
+ from synapse.api.constants import EventContentFields, EventTypes, JoinRules, Membership
23
+ from synapse.handlers.sliding_sync import StateValues
24
+ from synapse.rest.client import knock, login, room, sync
25
+ from synapse.server import HomeServer
26
+ from synapse.storage.databases.main.events import DeltaState, SlidingSyncTableChanges
27
+ from synapse.util.clock import Clock
28
+
29
+ from tests.rest.client.sliding_sync.test_sliding_sync import SlidingSyncBase
30
+ from tests.test_utils.event_injection import mark_event_as_partial_state
31
+
32
+ logger = logging.getLogger(__name__)
33
+
34
+
35
+ # Inherit from `str` so that they show up in the test description when we
36
+ # `@parameterized.expand(...)` the first parameter
37
+ class MembershipAction(str, enum.Enum):
38
+ INVITE = "invite"
39
+ JOIN = "join"
40
+ KNOCK = "knock"
41
+ LEAVE = "leave"
42
+ BAN = "ban"
43
+ KICK = "kick"
44
+
45
+
46
+ # FIXME: This can be removed once we bump `SCHEMA_COMPAT_VERSION` and run the
47
+ # foreground update for
48
+ # `sliding_sync_joined_rooms`/`sliding_sync_membership_snapshots` (tracked by
49
+ # https://github.com/element-hq/synapse/issues/17623)
50
+ @parameterized_class(
51
+ ("use_new_tables",),
52
+ [
53
+ (True,),
54
+ (False,),
55
+ ],
56
+ class_name_func=lambda cls,
57
+ num,
58
+ params_dict: f"{cls.__name__}_{'new' if params_dict['use_new_tables'] else 'fallback'}",
59
+ )
60
+ class SlidingSyncRoomsRequiredStateTestCase(SlidingSyncBase):
61
+ """
62
+ Test `rooms.required_state` in the Sliding Sync API.
63
+ """
64
+
65
+ servlets = [
66
+ synapse.rest.admin.register_servlets,
67
+ login.register_servlets,
68
+ knock.register_servlets,
69
+ room.register_servlets,
70
+ sync.register_servlets,
71
+ ]
72
+
73
+ def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
74
+ self.store = hs.get_datastores().main
75
+ self.storage_controllers = hs.get_storage_controllers()
76
+
77
+ super().prepare(reactor, clock, hs)
78
+
79
+ def test_rooms_no_required_state(self) -> None:
80
+ """
81
+ Empty `rooms.required_state` should not return any state events in the room
82
+ """
83
+ user1_id = self.register_user("user1", "pass")
84
+ user1_tok = self.login(user1_id, "pass")
85
+ user2_id = self.register_user("user2", "pass")
86
+ user2_tok = self.login(user2_id, "pass")
87
+
88
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
89
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
90
+
91
+ # Make the Sliding Sync request
92
+ sync_body = {
93
+ "lists": {
94
+ "foo-list": {
95
+ "ranges": [[0, 1]],
96
+ # Empty `required_state`
97
+ "required_state": [],
98
+ "timeline_limit": 0,
99
+ }
100
+ }
101
+ }
102
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
103
+
104
+ # No `required_state` in response
105
+ self.assertIsNone(
106
+ response_body["rooms"][room_id1].get("required_state"),
107
+ response_body["rooms"][room_id1],
108
+ )
109
+
110
+ def test_rooms_required_state_initial_sync(self) -> None:
111
+ """
112
+ Test `rooms.required_state` returns requested state events in the room during an
113
+ initial sync.
114
+ """
115
+ user1_id = self.register_user("user1", "pass")
116
+ user1_tok = self.login(user1_id, "pass")
117
+ user2_id = self.register_user("user2", "pass")
118
+ user2_tok = self.login(user2_id, "pass")
119
+
120
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
121
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
122
+
123
+ # Make the Sliding Sync request
124
+ sync_body = {
125
+ "lists": {
126
+ "foo-list": {
127
+ "ranges": [[0, 1]],
128
+ "required_state": [
129
+ [EventTypes.Create, ""],
130
+ [EventTypes.RoomHistoryVisibility, ""],
131
+ # This one doesn't exist in the room
132
+ [EventTypes.Tombstone, ""],
133
+ ],
134
+ "timeline_limit": 0,
135
+ }
136
+ }
137
+ }
138
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
139
+
140
+ state_map = self.get_success(
141
+ self.storage_controllers.state.get_current_state(room_id1)
142
+ )
143
+
144
+ self._assertRequiredStateIncludes(
145
+ response_body["rooms"][room_id1]["required_state"],
146
+ {
147
+ state_map[(EventTypes.Create, "")],
148
+ state_map[(EventTypes.RoomHistoryVisibility, "")],
149
+ },
150
+ exact=True,
151
+ )
152
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
153
+
154
+ def test_rooms_required_state_incremental_sync(self) -> None:
155
+ """
156
+ Test `rooms.required_state` returns requested state events in the room during an
157
+ incremental sync.
158
+ """
159
+ user1_id = self.register_user("user1", "pass")
160
+ user1_tok = self.login(user1_id, "pass")
161
+ user2_id = self.register_user("user2", "pass")
162
+ user2_tok = self.login(user2_id, "pass")
163
+
164
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
165
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
166
+
167
+ sync_body = {
168
+ "lists": {
169
+ "foo-list": {
170
+ "ranges": [[0, 1]],
171
+ "required_state": [
172
+ [EventTypes.Create, ""],
173
+ [EventTypes.RoomHistoryVisibility, ""],
174
+ # This one doesn't exist in the room
175
+ [EventTypes.Tombstone, ""],
176
+ ],
177
+ "timeline_limit": 1,
178
+ }
179
+ }
180
+ }
181
+ _, from_token = self.do_sync(sync_body, tok=user1_tok)
182
+
183
+ # Send a message so the room comes down sync.
184
+ self.helper.send(room_id1, "msg", tok=user1_tok)
185
+
186
+ # Make the incremental Sliding Sync request
187
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
188
+
189
+ # We only return updates but only if we've sent the room down the
190
+ # connection before.
191
+ self.assertIsNone(response_body["rooms"][room_id1].get("required_state"))
192
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
193
+
194
+ def test_rooms_incremental_sync_restart(self) -> None:
195
+ """
196
+ Test that after a restart (and so the in memory caches are reset) that
197
+ we correctly return an `M_UNKNOWN_POS`
198
+ """
199
+
200
+ user1_id = self.register_user("user1", "pass")
201
+ user1_tok = self.login(user1_id, "pass")
202
+ user2_id = self.register_user("user2", "pass")
203
+ user2_tok = self.login(user2_id, "pass")
204
+
205
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
206
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
207
+
208
+ sync_body = {
209
+ "lists": {
210
+ "foo-list": {
211
+ "ranges": [[0, 1]],
212
+ "required_state": [
213
+ [EventTypes.Create, ""],
214
+ [EventTypes.RoomHistoryVisibility, ""],
215
+ # This one doesn't exist in the room
216
+ [EventTypes.Tombstone, ""],
217
+ ],
218
+ "timeline_limit": 1,
219
+ }
220
+ }
221
+ }
222
+ _, from_token = self.do_sync(sync_body, tok=user1_tok)
223
+
224
+ # Reset the positions
225
+ self.get_success(
226
+ self.store.db_pool.simple_delete(
227
+ table="sliding_sync_connections",
228
+ keyvalues={"user_id": user1_id},
229
+ desc="clear_sliding_sync_connections_cache",
230
+ )
231
+ )
232
+
233
+ # Make the Sliding Sync request
234
+ channel = self.make_request(
235
+ method="POST",
236
+ path=self.sync_endpoint + f"?pos={from_token}",
237
+ content=sync_body,
238
+ access_token=user1_tok,
239
+ )
240
+ self.assertEqual(channel.code, 400, channel.json_body)
241
+ self.assertEqual(
242
+ channel.json_body["errcode"], "M_UNKNOWN_POS", channel.json_body
243
+ )
244
+
245
+ def test_rooms_required_state_wildcard(self) -> None:
246
+ """
247
+ Test `rooms.required_state` returns all state events when using wildcard `["*", "*"]`.
248
+ """
249
+ user1_id = self.register_user("user1", "pass")
250
+ user1_tok = self.login(user1_id, "pass")
251
+ user2_id = self.register_user("user2", "pass")
252
+ user2_tok = self.login(user2_id, "pass")
253
+
254
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
255
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
256
+
257
+ self.helper.send_state(
258
+ room_id1,
259
+ event_type="org.matrix.foo_state",
260
+ state_key="",
261
+ body={"foo": "bar"},
262
+ tok=user2_tok,
263
+ )
264
+ self.helper.send_state(
265
+ room_id1,
266
+ event_type="org.matrix.foo_state",
267
+ state_key="namespaced",
268
+ body={"foo": "bar"},
269
+ tok=user2_tok,
270
+ )
271
+
272
+ # Make the Sliding Sync request with wildcards for the `event_type` and `state_key`
273
+ sync_body = {
274
+ "lists": {
275
+ "foo-list": {
276
+ "ranges": [[0, 1]],
277
+ "required_state": [
278
+ [StateValues.WILDCARD, StateValues.WILDCARD],
279
+ ],
280
+ "timeline_limit": 0,
281
+ }
282
+ }
283
+ }
284
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
285
+
286
+ state_map = self.get_success(
287
+ self.storage_controllers.state.get_current_state(room_id1)
288
+ )
289
+
290
+ self._assertRequiredStateIncludes(
291
+ response_body["rooms"][room_id1]["required_state"],
292
+ # We should see all the state events in the room
293
+ state_map.values(),
294
+ exact=True,
295
+ )
296
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
297
+
298
+ def test_rooms_required_state_wildcard_event_type(self) -> None:
299
+ """
300
+ Test `rooms.required_state` returns relevant state events when using wildcard in
301
+ the event_type `["*", "foobarbaz"]`.
302
+ """
303
+ user1_id = self.register_user("user1", "pass")
304
+ user1_tok = self.login(user1_id, "pass")
305
+ user2_id = self.register_user("user2", "pass")
306
+ user2_tok = self.login(user2_id, "pass")
307
+
308
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
309
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
310
+
311
+ self.helper.send_state(
312
+ room_id1,
313
+ event_type="org.matrix.foo_state",
314
+ state_key="",
315
+ body={"foo": "bar"},
316
+ tok=user2_tok,
317
+ )
318
+ self.helper.send_state(
319
+ room_id1,
320
+ event_type="org.matrix.foo_state",
321
+ state_key=user2_id,
322
+ body={"foo": "bar"},
323
+ tok=user2_tok,
324
+ )
325
+
326
+ # Make the Sliding Sync request with wildcards for the `event_type`
327
+ sync_body = {
328
+ "lists": {
329
+ "foo-list": {
330
+ "ranges": [[0, 1]],
331
+ "required_state": [
332
+ [StateValues.WILDCARD, user2_id],
333
+ ],
334
+ "timeline_limit": 0,
335
+ }
336
+ }
337
+ }
338
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
339
+
340
+ state_map = self.get_success(
341
+ self.storage_controllers.state.get_current_state(room_id1)
342
+ )
343
+
344
+ # We expect at-least any state event with the `user2_id` as the `state_key`
345
+ self._assertRequiredStateIncludes(
346
+ response_body["rooms"][room_id1]["required_state"],
347
+ {
348
+ state_map[(EventTypes.Member, user2_id)],
349
+ state_map[("org.matrix.foo_state", user2_id)],
350
+ },
351
+ # Ideally, this would be exact but we're currently returning all state
352
+ # events when the `event_type` is a wildcard.
353
+ exact=False,
354
+ )
355
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
356
+
357
+ def test_rooms_required_state_wildcard_state_key(self) -> None:
358
+ """
359
+ Test `rooms.required_state` returns relevant state events when using wildcard in
360
+ the state_key `["foobarbaz","*"]`.
361
+ """
362
+ user1_id = self.register_user("user1", "pass")
363
+ user1_tok = self.login(user1_id, "pass")
364
+ user2_id = self.register_user("user2", "pass")
365
+ user2_tok = self.login(user2_id, "pass")
366
+
367
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
368
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
369
+
370
+ # Make the Sliding Sync request with wildcards for the `state_key`
371
+ sync_body = {
372
+ "lists": {
373
+ "foo-list": {
374
+ "ranges": [[0, 1]],
375
+ "required_state": [
376
+ [EventTypes.Member, StateValues.WILDCARD],
377
+ ],
378
+ "timeline_limit": 0,
379
+ }
380
+ }
381
+ }
382
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
383
+
384
+ state_map = self.get_success(
385
+ self.storage_controllers.state.get_current_state(room_id1)
386
+ )
387
+
388
+ self._assertRequiredStateIncludes(
389
+ response_body["rooms"][room_id1]["required_state"],
390
+ {
391
+ state_map[(EventTypes.Member, user1_id)],
392
+ state_map[(EventTypes.Member, user2_id)],
393
+ },
394
+ exact=True,
395
+ )
396
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
397
+
398
+ def test_rooms_required_state_lazy_loading_room_members_initial_sync(self) -> None:
399
+ """
400
+ On initial sync, test `rooms.required_state` returns people relevant to the
401
+ timeline when lazy-loading room members, `["m.room.member","$LAZY"]`.
402
+ """
403
+ user1_id = self.register_user("user1", "pass")
404
+ user1_tok = self.login(user1_id, "pass")
405
+ user2_id = self.register_user("user2", "pass")
406
+ user2_tok = self.login(user2_id, "pass")
407
+ user3_id = self.register_user("user3", "pass")
408
+ user3_tok = self.login(user3_id, "pass")
409
+
410
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
411
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
412
+ self.helper.join(room_id1, user3_id, tok=user3_tok)
413
+
414
+ self.helper.send(room_id1, "1", tok=user2_tok)
415
+ self.helper.send(room_id1, "2", tok=user3_tok)
416
+ self.helper.send(room_id1, "3", tok=user2_tok)
417
+
418
+ # Make the Sliding Sync request with lazy loading for the room members
419
+ sync_body = {
420
+ "lists": {
421
+ "foo-list": {
422
+ "ranges": [[0, 1]],
423
+ "required_state": [
424
+ [EventTypes.Create, ""],
425
+ [EventTypes.Member, StateValues.LAZY],
426
+ ],
427
+ "timeline_limit": 3,
428
+ }
429
+ }
430
+ }
431
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
432
+
433
+ state_map = self.get_success(
434
+ self.storage_controllers.state.get_current_state(room_id1)
435
+ )
436
+
437
+ # Only user2 and user3 sent events in the 3 events we see in the `timeline`
438
+ self._assertRequiredStateIncludes(
439
+ response_body["rooms"][room_id1]["required_state"],
440
+ {
441
+ state_map[(EventTypes.Create, "")],
442
+ state_map[(EventTypes.Member, user2_id)],
443
+ state_map[(EventTypes.Member, user3_id)],
444
+ },
445
+ exact=True,
446
+ )
447
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
448
+
449
+ def test_rooms_required_state_lazy_loading_room_members_incremental_sync(
450
+ self,
451
+ ) -> None:
452
+ """
453
+ On incremental sync, test `rooms.required_state` returns people relevant to the
454
+ timeline when lazy-loading room members, `["m.room.member","$LAZY"]`.
455
+ """
456
+ user1_id = self.register_user("user1", "pass")
457
+ user1_tok = self.login(user1_id, "pass")
458
+ user2_id = self.register_user("user2", "pass")
459
+ user2_tok = self.login(user2_id, "pass")
460
+ user3_id = self.register_user("user3", "pass")
461
+ user3_tok = self.login(user3_id, "pass")
462
+ user4_id = self.register_user("user4", "pass")
463
+ user4_tok = self.login(user4_id, "pass")
464
+
465
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
466
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
467
+ self.helper.join(room_id1, user3_id, tok=user3_tok)
468
+ self.helper.join(room_id1, user4_id, tok=user4_tok)
469
+
470
+ self.helper.send(room_id1, "1", tok=user2_tok)
471
+ self.helper.send(room_id1, "2", tok=user2_tok)
472
+ self.helper.send(room_id1, "3", tok=user2_tok)
473
+
474
+ # Make the Sliding Sync request with lazy loading for the room members
475
+ sync_body = {
476
+ "lists": {
477
+ "foo-list": {
478
+ "ranges": [[0, 1]],
479
+ "required_state": [
480
+ [EventTypes.Create, ""],
481
+ [EventTypes.Member, StateValues.LAZY],
482
+ ],
483
+ "timeline_limit": 3,
484
+ }
485
+ }
486
+ }
487
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
488
+
489
+ # Send more timeline events into the room
490
+ self.helper.send(room_id1, "4", tok=user2_tok)
491
+ self.helper.send(room_id1, "5", tok=user4_tok)
492
+ self.helper.send(room_id1, "6", tok=user4_tok)
493
+
494
+ # Make an incremental Sliding Sync request
495
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
496
+
497
+ state_map = self.get_success(
498
+ self.storage_controllers.state.get_current_state(room_id1)
499
+ )
500
+
501
+ # Only user2 and user4 sent events in the last 3 events we see in the `timeline`
502
+ # but since we've seen user2 in the last sync (and their membership hasn't
503
+ # changed), we should only see user4 here.
504
+ self._assertRequiredStateIncludes(
505
+ response_body["rooms"][room_id1]["required_state"],
506
+ {
507
+ state_map[(EventTypes.Member, user4_id)],
508
+ },
509
+ exact=True,
510
+ )
511
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
512
+
513
+ @parameterized.expand(
514
+ [
515
+ (MembershipAction.LEAVE,),
516
+ (MembershipAction.INVITE,),
517
+ (MembershipAction.KNOCK,),
518
+ (MembershipAction.JOIN,),
519
+ (MembershipAction.BAN,),
520
+ (MembershipAction.KICK,),
521
+ ]
522
+ )
523
+ def test_rooms_required_state_changed_membership_in_timeline_lazy_loading_room_members_incremental_sync(
524
+ self,
525
+ room_membership_action: str,
526
+ ) -> None:
527
+ """
528
+ On incremental sync, test `rooms.required_state` returns people relevant to the
529
+ timeline when lazy-loading room members, `["m.room.member","$LAZY"]` **including
530
+ changes to membership**.
531
+ """
532
+ user1_id = self.register_user("user1", "pass")
533
+ user1_tok = self.login(user1_id, "pass")
534
+ user2_id = self.register_user("user2", "pass")
535
+ user2_tok = self.login(user2_id, "pass")
536
+ user3_id = self.register_user("user3", "pass")
537
+ user3_tok = self.login(user3_id, "pass")
538
+ user4_id = self.register_user("user4", "pass")
539
+ user4_tok = self.login(user4_id, "pass")
540
+ user5_id = self.register_user("user5", "pass")
541
+ user5_tok = self.login(user5_id, "pass")
542
+
543
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
544
+ # If we're testing knocks, set the room to knock
545
+ if room_membership_action == MembershipAction.KNOCK:
546
+ self.helper.send_state(
547
+ room_id1,
548
+ EventTypes.JoinRules,
549
+ {"join_rule": JoinRules.KNOCK},
550
+ tok=user2_tok,
551
+ )
552
+
553
+ # Join the test users to the room
554
+ self.helper.invite(room_id1, src=user2_id, targ=user1_id, tok=user2_tok)
555
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
556
+ self.helper.invite(room_id1, src=user2_id, targ=user3_id, tok=user2_tok)
557
+ self.helper.join(room_id1, user3_id, tok=user3_tok)
558
+ self.helper.invite(room_id1, src=user2_id, targ=user4_id, tok=user2_tok)
559
+ self.helper.join(room_id1, user4_id, tok=user4_tok)
560
+ if room_membership_action in (
561
+ MembershipAction.LEAVE,
562
+ MembershipAction.BAN,
563
+ MembershipAction.JOIN,
564
+ ):
565
+ self.helper.invite(room_id1, src=user2_id, targ=user5_id, tok=user2_tok)
566
+ self.helper.join(room_id1, user5_id, tok=user5_tok)
567
+
568
+ # Send some messages to fill up the space
569
+ self.helper.send(room_id1, "1", tok=user2_tok)
570
+ self.helper.send(room_id1, "2", tok=user2_tok)
571
+ self.helper.send(room_id1, "3", tok=user2_tok)
572
+
573
+ # Make the Sliding Sync request with lazy loading for the room members
574
+ sync_body = {
575
+ "lists": {
576
+ "foo-list": {
577
+ "ranges": [[0, 1]],
578
+ "required_state": [
579
+ [EventTypes.Create, ""],
580
+ [EventTypes.Member, StateValues.LAZY],
581
+ ],
582
+ "timeline_limit": 3,
583
+ }
584
+ }
585
+ }
586
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
587
+
588
+ # Send more timeline events into the room
589
+ self.helper.send(room_id1, "4", tok=user2_tok)
590
+ self.helper.send(room_id1, "5", tok=user4_tok)
591
+ # The third event will be our membership event concerning user5
592
+ if room_membership_action == MembershipAction.LEAVE:
593
+ # User 5 leaves
594
+ self.helper.leave(room_id1, user5_id, tok=user5_tok)
595
+ elif room_membership_action == MembershipAction.INVITE:
596
+ # User 5 is invited
597
+ self.helper.invite(room_id1, src=user2_id, targ=user5_id, tok=user2_tok)
598
+ elif room_membership_action == MembershipAction.KNOCK:
599
+ # User 5 knocks
600
+ self.helper.knock(room_id1, user5_id, tok=user5_tok)
601
+ # The admin of the room accepts the knock
602
+ self.helper.invite(room_id1, src=user2_id, targ=user5_id, tok=user2_tok)
603
+ elif room_membership_action == MembershipAction.JOIN:
604
+ # Update the display name of user5 (causing a membership change)
605
+ self.helper.send_state(
606
+ room_id1,
607
+ event_type=EventTypes.Member,
608
+ state_key=user5_id,
609
+ body={
610
+ EventContentFields.MEMBERSHIP: Membership.JOIN,
611
+ EventContentFields.MEMBERSHIP_DISPLAYNAME: "quick changer",
612
+ },
613
+ tok=user5_tok,
614
+ )
615
+ elif room_membership_action == MembershipAction.BAN:
616
+ self.helper.ban(room_id1, src=user2_id, targ=user5_id, tok=user2_tok)
617
+ elif room_membership_action == MembershipAction.KICK:
618
+ # Kick user5 from the room
619
+ self.helper.change_membership(
620
+ room=room_id1,
621
+ src=user2_id,
622
+ targ=user5_id,
623
+ tok=user2_tok,
624
+ membership=Membership.LEAVE,
625
+ extra_data={
626
+ "reason": "Bad manners",
627
+ },
628
+ )
629
+ else:
630
+ raise AssertionError(
631
+ f"Unknown room_membership_action: {room_membership_action}"
632
+ )
633
+
634
+ # Make an incremental Sliding Sync request
635
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
636
+
637
+ state_map = self.get_success(
638
+ self.storage_controllers.state.get_current_state(room_id1)
639
+ )
640
+
641
+ # Only user2, user4, and user5 sent events in the last 3 events we see in the
642
+ # `timeline`.
643
+ self._assertRequiredStateIncludes(
644
+ response_body["rooms"][room_id1]["required_state"],
645
+ {
646
+ # Appears because there is a message in the timeline from this user
647
+ state_map[(EventTypes.Member, user4_id)],
648
+ # Appears because there is a membership event in the timeline from this user
649
+ state_map[(EventTypes.Member, user5_id)],
650
+ },
651
+ exact=True,
652
+ )
653
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
654
+
655
+ def test_rooms_required_state_expand_lazy_loading_room_members_incremental_sync(
656
+ self,
657
+ ) -> None:
658
+ """
659
+ Test that when we expand the `required_state` to include lazy-loading room
660
+ members, it returns people relevant to the timeline.
661
+ """
662
+ user1_id = self.register_user("user1", "pass")
663
+ user1_tok = self.login(user1_id, "pass")
664
+ user2_id = self.register_user("user2", "pass")
665
+ user2_tok = self.login(user2_id, "pass")
666
+ user3_id = self.register_user("user3", "pass")
667
+ user3_tok = self.login(user3_id, "pass")
668
+ user4_id = self.register_user("user4", "pass")
669
+ user4_tok = self.login(user4_id, "pass")
670
+
671
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
672
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
673
+ self.helper.join(room_id1, user3_id, tok=user3_tok)
674
+ self.helper.join(room_id1, user4_id, tok=user4_tok)
675
+
676
+ self.helper.send(room_id1, "1", tok=user2_tok)
677
+ self.helper.send(room_id1, "2", tok=user2_tok)
678
+ self.helper.send(room_id1, "3", tok=user2_tok)
679
+
680
+ # Make the Sliding Sync request *without* lazy loading for the room members
681
+ sync_body = {
682
+ "lists": {
683
+ "foo-list": {
684
+ "ranges": [[0, 1]],
685
+ "required_state": [
686
+ [EventTypes.Create, ""],
687
+ ],
688
+ "timeline_limit": 3,
689
+ }
690
+ }
691
+ }
692
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
693
+
694
+ # Send more timeline events into the room
695
+ self.helper.send(room_id1, "4", tok=user2_tok)
696
+ self.helper.send(room_id1, "5", tok=user4_tok)
697
+ self.helper.send(room_id1, "6", tok=user4_tok)
698
+
699
+ # Expand `required_state` and make an incremental Sliding Sync request *with*
700
+ # lazy-loading room members
701
+ sync_body["lists"]["foo-list"]["required_state"] = [
702
+ [EventTypes.Create, ""],
703
+ [EventTypes.Member, StateValues.LAZY],
704
+ ]
705
+ response_body, from_token = self.do_sync(
706
+ sync_body, since=from_token, tok=user1_tok
707
+ )
708
+
709
+ state_map = self.get_success(
710
+ self.storage_controllers.state.get_current_state(room_id1)
711
+ )
712
+
713
+ # Only user2 and user4 sent events in the last 3 events we see in the `timeline`
714
+ # and we haven't seen any membership before this sync so we should see both
715
+ # users.
716
+ self._assertRequiredStateIncludes(
717
+ response_body["rooms"][room_id1]["required_state"],
718
+ {
719
+ state_map[(EventTypes.Member, user2_id)],
720
+ state_map[(EventTypes.Member, user4_id)],
721
+ },
722
+ exact=True,
723
+ )
724
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
725
+
726
+ # Send a message so the room comes down sync.
727
+ self.helper.send(room_id1, "7", tok=user2_tok)
728
+ self.helper.send(room_id1, "8", tok=user4_tok)
729
+ self.helper.send(room_id1, "9", tok=user4_tok)
730
+
731
+ # Make another incremental Sliding Sync request
732
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
733
+
734
+ # Only user2 and user4 sent events in the last 3 events we see in the `timeline`
735
+ # but since we've seen both memberships in the last sync, they shouldn't appear
736
+ # again.
737
+ self._assertRequiredStateIncludes(
738
+ response_body["rooms"][room_id1].get("required_state", []),
739
+ set(),
740
+ exact=True,
741
+ )
742
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
743
+
744
+ def test_rooms_required_state_expand_retract_expand_lazy_loading_room_members_incremental_sync(
745
+ self,
746
+ ) -> None:
747
+ """
748
+ Test that when we expand the `required_state` to include lazy-loading room
749
+ members, it returns people relevant to the timeline.
750
+ """
751
+ user1_id = self.register_user("user1", "pass")
752
+ user1_tok = self.login(user1_id, "pass")
753
+ user2_id = self.register_user("user2", "pass")
754
+ user2_tok = self.login(user2_id, "pass")
755
+ user3_id = self.register_user("user3", "pass")
756
+ user3_tok = self.login(user3_id, "pass")
757
+ user4_id = self.register_user("user4", "pass")
758
+ user4_tok = self.login(user4_id, "pass")
759
+
760
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
761
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
762
+ self.helper.join(room_id1, user3_id, tok=user3_tok)
763
+ self.helper.join(room_id1, user4_id, tok=user4_tok)
764
+
765
+ self.helper.send(room_id1, "1", tok=user2_tok)
766
+ self.helper.send(room_id1, "2", tok=user2_tok)
767
+ self.helper.send(room_id1, "3", tok=user2_tok)
768
+
769
+ # Make the Sliding Sync request *without* lazy loading for the room members
770
+ sync_body = {
771
+ "lists": {
772
+ "foo-list": {
773
+ "ranges": [[0, 1]],
774
+ "required_state": [
775
+ [EventTypes.Create, ""],
776
+ ],
777
+ "timeline_limit": 3,
778
+ }
779
+ }
780
+ }
781
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
782
+
783
+ # Send more timeline events into the room
784
+ self.helper.send(room_id1, "4", tok=user2_tok)
785
+ self.helper.send(room_id1, "5", tok=user4_tok)
786
+ self.helper.send(room_id1, "6", tok=user4_tok)
787
+
788
+ # Expand `required_state` and make an incremental Sliding Sync request *with*
789
+ # lazy-loading room members
790
+ sync_body["lists"]["foo-list"]["required_state"] = [
791
+ [EventTypes.Create, ""],
792
+ [EventTypes.Member, StateValues.LAZY],
793
+ ]
794
+ response_body, from_token = self.do_sync(
795
+ sync_body, since=from_token, tok=user1_tok
796
+ )
797
+
798
+ state_map = self.get_success(
799
+ self.storage_controllers.state.get_current_state(room_id1)
800
+ )
801
+
802
+ # Only user2 and user4 sent events in the last 3 events we see in the `timeline`
803
+ # and we haven't seen any membership before this sync so we should see both
804
+ # users because we're lazy-loading the room members.
805
+ self._assertRequiredStateIncludes(
806
+ response_body["rooms"][room_id1]["required_state"],
807
+ {
808
+ state_map[(EventTypes.Member, user2_id)],
809
+ state_map[(EventTypes.Member, user4_id)],
810
+ },
811
+ exact=True,
812
+ )
813
+
814
+ # Send a message so the room comes down sync.
815
+ self.helper.send(room_id1, "msg", tok=user4_tok)
816
+
817
+ # Retract `required_state` and make an incremental Sliding Sync request
818
+ # requesting a few memberships
819
+ sync_body["lists"]["foo-list"]["required_state"] = [
820
+ [EventTypes.Create, ""],
821
+ [EventTypes.Member, StateValues.ME],
822
+ [EventTypes.Member, user2_id],
823
+ ]
824
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
825
+
826
+ state_map = self.get_success(
827
+ self.storage_controllers.state.get_current_state(room_id1)
828
+ )
829
+
830
+ # We've seen user2's membership in the last sync so we shouldn't see it here
831
+ # even though it's requested. We should only see user1's membership.
832
+ self._assertRequiredStateIncludes(
833
+ response_body["rooms"][room_id1]["required_state"],
834
+ {
835
+ state_map[(EventTypes.Member, user1_id)],
836
+ },
837
+ exact=True,
838
+ )
839
+
840
+ def test_lazy_loading_room_members_limited_sync(self) -> None:
841
+ """Test that when using lazy loading for room members and a limited sync
842
+ missing a membership change, we include the membership change next time
843
+ said user says something.
844
+ """
845
+
846
+ user1_id = self.register_user("user1", "pass")
847
+ user1_tok = self.login(user1_id, "pass")
848
+ user2_id = self.register_user("user2", "pass")
849
+ user2_tok = self.login(user2_id, "pass")
850
+
851
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
852
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
853
+
854
+ # Send a message from each user to the room so that both memberships are sent down.
855
+ self.helper.send(room_id1, "1", tok=user1_tok)
856
+ self.helper.send(room_id1, "2", tok=user2_tok)
857
+
858
+ # Make a first sync with lazy loading for the room members to establish
859
+ # a position
860
+ sync_body = {
861
+ "lists": {
862
+ "foo-list": {
863
+ "ranges": [[0, 1]],
864
+ "required_state": [
865
+ [EventTypes.Member, StateValues.LAZY],
866
+ ],
867
+ "timeline_limit": 2,
868
+ }
869
+ }
870
+ }
871
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
872
+
873
+ # We should see both membership events in required_state
874
+ state_map = self.get_success(
875
+ self.storage_controllers.state.get_current_state(room_id1)
876
+ )
877
+ self._assertRequiredStateIncludes(
878
+ response_body["rooms"][room_id1]["required_state"],
879
+ {
880
+ state_map[(EventTypes.Member, user1_id)],
881
+ state_map[(EventTypes.Member, user2_id)],
882
+ },
883
+ exact=True,
884
+ )
885
+
886
+ # User2 changes their display name (causing a membership change)
887
+ self.helper.send_state(
888
+ room_id1,
889
+ event_type=EventTypes.Member,
890
+ state_key=user2_id,
891
+ body={
892
+ EventContentFields.MEMBERSHIP: Membership.JOIN,
893
+ EventContentFields.MEMBERSHIP_DISPLAYNAME: "New Name",
894
+ },
895
+ tok=user2_tok,
896
+ )
897
+
898
+ # Send a couple of messages to the room to push out the membership change
899
+ self.helper.send(room_id1, "3", tok=user1_tok)
900
+ self.helper.send(room_id1, "4", tok=user1_tok)
901
+
902
+ # Make an incremental Sliding Sync request
903
+ response_body, from_token = self.do_sync(
904
+ sync_body, since=from_token, tok=user1_tok
905
+ )
906
+
907
+ # The membership change should *not* be included yet as user2 doesn't
908
+ # have any events in the timeline.
909
+ self._assertRequiredStateIncludes(
910
+ response_body["rooms"][room_id1].get("required_state", []),
911
+ set(),
912
+ exact=True,
913
+ )
914
+
915
+ # Now user2 sends a message to the room
916
+ self.helper.send(room_id1, "5", tok=user2_tok)
917
+
918
+ # Make another incremental Sliding Sync request
919
+ response_body, from_token = self.do_sync(
920
+ sync_body, since=from_token, tok=user1_tok
921
+ )
922
+
923
+ # The membership change should now be included as user2 has an event
924
+ # in the timeline.
925
+ state_map = self.get_success(
926
+ self.storage_controllers.state.get_current_state(room_id1)
927
+ )
928
+ self._assertRequiredStateIncludes(
929
+ response_body["rooms"][room_id1].get("required_state", []),
930
+ {
931
+ state_map[(EventTypes.Member, user2_id)],
932
+ },
933
+ exact=True,
934
+ )
935
+
936
+ def test_lazy_loading_room_members_across_multiple_rooms(self) -> None:
937
+ """Test that lazy loading room members are tracked per-room correctly."""
938
+
939
+ user1_id = self.register_user("user1", "pass")
940
+ user1_tok = self.login(user1_id, "pass")
941
+ user2_id = self.register_user("user2", "pass")
942
+ user2_tok = self.login(user2_id, "pass")
943
+
944
+ # Create two rooms with both users in them and send a message in each
945
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
946
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
947
+ self.helper.send(room_id1, "room1-msg1", tok=user2_tok)
948
+
949
+ room_id2 = self.helper.create_room_as(user2_id, tok=user2_tok)
950
+ self.helper.join(room_id2, user1_id, tok=user1_tok)
951
+ self.helper.send(room_id2, "room2-msg1", tok=user2_tok)
952
+
953
+ # Make a sync with lazy loading for the room members to establish
954
+ # a position
955
+ sync_body = {
956
+ "lists": {
957
+ "foo-list": {
958
+ "ranges": [[0, 1]],
959
+ "required_state": [
960
+ [EventTypes.Member, StateValues.LAZY],
961
+ ],
962
+ "timeline_limit": 1,
963
+ }
964
+ }
965
+ }
966
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
967
+
968
+ # We expect to see only user2's membership in both rooms
969
+ state_map = self.get_success(
970
+ self.storage_controllers.state.get_current_state(room_id1)
971
+ )
972
+ self._assertRequiredStateIncludes(
973
+ response_body["rooms"][room_id1]["required_state"],
974
+ {
975
+ state_map[(EventTypes.Member, user2_id)],
976
+ },
977
+ exact=True,
978
+ )
979
+
980
+ # Send a message in room1 from user1
981
+ self.helper.send(room_id1, "room1-msg2", tok=user1_tok)
982
+
983
+ # Make an incremental Sliding Sync request and check that we get user1's
984
+ # membership.
985
+ response_body, from_token = self.do_sync(
986
+ sync_body, since=from_token, tok=user1_tok
987
+ )
988
+
989
+ state_map = self.get_success(
990
+ self.storage_controllers.state.get_current_state(room_id1)
991
+ )
992
+ self._assertRequiredStateIncludes(
993
+ response_body["rooms"][room_id1]["required_state"],
994
+ {
995
+ state_map[(EventTypes.Member, user1_id)],
996
+ },
997
+ exact=True,
998
+ )
999
+
1000
+ # Send a message in room2 from user1
1001
+ self.helper.send(room_id2, "room2-msg2", tok=user1_tok)
1002
+
1003
+ # Make an incremental Sliding Sync request and check that we get user1's
1004
+ # membership.
1005
+ response_body, from_token = self.do_sync(
1006
+ sync_body, since=from_token, tok=user1_tok
1007
+ )
1008
+ state_map = self.get_success(
1009
+ self.storage_controllers.state.get_current_state(room_id2)
1010
+ )
1011
+ self._assertRequiredStateIncludes(
1012
+ response_body["rooms"][room_id2]["required_state"],
1013
+ {
1014
+ state_map[(EventTypes.Member, user1_id)],
1015
+ },
1016
+ exact=True,
1017
+ )
1018
+
1019
+ def test_lazy_loading_room_members_across_multiple_connections(self) -> None:
1020
+ """Test that lazy loading room members are tracked per-connection
1021
+ correctly.
1022
+
1023
+ This catches bugs where if a membership got sent down one connection,
1024
+ it would incorrectly assume it was sent down another connection.
1025
+ """
1026
+
1027
+ user1_id = self.register_user("user1", "pass")
1028
+ user1_tok = self.login(user1_id, "pass")
1029
+ user2_id = self.register_user("user2", "pass")
1030
+ user2_tok = self.login(user2_id, "pass")
1031
+
1032
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
1033
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
1034
+
1035
+ self.helper.send(room_id1, "1", tok=user2_tok)
1036
+
1037
+ # Make a sync with lazy loading for the room members to establish
1038
+ # a position
1039
+ sync_body1 = {
1040
+ "conn_id": "first-connection",
1041
+ "lists": {
1042
+ "foo-list": {
1043
+ "ranges": [[0, 1]],
1044
+ "required_state": [
1045
+ [EventTypes.Member, StateValues.LAZY],
1046
+ ],
1047
+ "timeline_limit": 1,
1048
+ }
1049
+ },
1050
+ }
1051
+ response_body, from_token1 = self.do_sync(sync_body1, tok=user1_tok)
1052
+
1053
+ # We expect to see only user2's membership in the room
1054
+ state_map = self.get_success(
1055
+ self.storage_controllers.state.get_current_state(room_id1)
1056
+ )
1057
+ self._assertRequiredStateIncludes(
1058
+ response_body["rooms"][room_id1]["required_state"],
1059
+ {
1060
+ state_map[(EventTypes.Member, user2_id)],
1061
+ },
1062
+ exact=True,
1063
+ )
1064
+
1065
+ # Now make a new connection
1066
+ sync_body2 = {
1067
+ "conn_id": "second-connection",
1068
+ "lists": {
1069
+ "foo-list": {
1070
+ "ranges": [[0, 1]],
1071
+ "required_state": [
1072
+ [EventTypes.Member, StateValues.LAZY],
1073
+ ],
1074
+ "timeline_limit": 1,
1075
+ }
1076
+ },
1077
+ }
1078
+ response_body, from_token2 = self.do_sync(sync_body2, tok=user1_tok)
1079
+
1080
+ # We should see user2's membership as this is a new connection
1081
+ self._assertRequiredStateIncludes(
1082
+ response_body["rooms"][room_id1]["required_state"],
1083
+ {
1084
+ state_map[(EventTypes.Member, user2_id)],
1085
+ },
1086
+ exact=True,
1087
+ )
1088
+
1089
+ # If we send a message from user1 and sync again on the first connection,
1090
+ # we should get user1's membership
1091
+ self.helper.send(room_id1, "2", tok=user1_tok)
1092
+ response_body, from_token1 = self.do_sync(
1093
+ sync_body1, since=from_token1, tok=user1_tok
1094
+ )
1095
+ self._assertRequiredStateIncludes(
1096
+ response_body["rooms"][room_id1]["required_state"],
1097
+ {
1098
+ state_map[(EventTypes.Member, user1_id)],
1099
+ },
1100
+ exact=True,
1101
+ )
1102
+
1103
+ # We sync again on the first connection to "ack" the position. This
1104
+ # triggers the `sliding_sync_connection_lazy_members` to set its
1105
+ # connection_position to null.
1106
+ self.do_sync(sync_body1, since=from_token1, tok=user1_tok)
1107
+
1108
+ # If we sync again on the second connection, we should also get user1's
1109
+ # membership
1110
+ response_body, _ = self.do_sync(sync_body2, since=from_token2, tok=user1_tok)
1111
+ self._assertRequiredStateIncludes(
1112
+ response_body["rooms"][room_id1]["required_state"],
1113
+ {
1114
+ state_map[(EventTypes.Member, user1_id)],
1115
+ },
1116
+ exact=True,
1117
+ )
1118
+
1119
+ def test_lazy_loading_room_members_forked_position(self) -> None:
1120
+ """Test that lazy loading room members are tracked correctly when a
1121
+ connection position is reused"""
1122
+
1123
+ user1_id = self.register_user("user1", "pass")
1124
+ user1_tok = self.login(user1_id, "pass")
1125
+ user2_id = self.register_user("user2", "pass")
1126
+ user2_tok = self.login(user2_id, "pass")
1127
+
1128
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
1129
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
1130
+
1131
+ self.helper.send(room_id1, "1", tok=user2_tok)
1132
+
1133
+ # Make a sync with lazy loading for the room members to establish
1134
+ # a position
1135
+ sync_body = {
1136
+ "lists": {
1137
+ "foo-list": {
1138
+ "ranges": [[0, 1]],
1139
+ "required_state": [
1140
+ [EventTypes.Member, StateValues.LAZY],
1141
+ ],
1142
+ "timeline_limit": 1,
1143
+ }
1144
+ }
1145
+ }
1146
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
1147
+
1148
+ # We expect to see only user2's membership in the room
1149
+ state_map = self.get_success(
1150
+ self.storage_controllers.state.get_current_state(room_id1)
1151
+ )
1152
+ self._assertRequiredStateIncludes(
1153
+ response_body["rooms"][room_id1]["required_state"],
1154
+ {
1155
+ state_map[(EventTypes.Member, user2_id)],
1156
+ },
1157
+ exact=True,
1158
+ )
1159
+
1160
+ # Send a message in room1 from user1
1161
+ self.helper.send(room_id1, "2", tok=user1_tok)
1162
+
1163
+ # Make an incremental Sliding Sync request and check that we get user1's
1164
+ # membership.
1165
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
1166
+ state_map = self.get_success(
1167
+ self.storage_controllers.state.get_current_state(room_id1)
1168
+ )
1169
+ self._assertRequiredStateIncludes(
1170
+ response_body["rooms"][room_id1]["required_state"],
1171
+ {
1172
+ state_map[(EventTypes.Member, user1_id)],
1173
+ },
1174
+ exact=True,
1175
+ )
1176
+
1177
+ # Now, reuse the original position and check we still get user1's
1178
+ # membership.
1179
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
1180
+ state_map = self.get_success(
1181
+ self.storage_controllers.state.get_current_state(room_id1)
1182
+ )
1183
+ self._assertRequiredStateIncludes(
1184
+ response_body["rooms"][room_id1]["required_state"],
1185
+ {
1186
+ state_map[(EventTypes.Member, user1_id)],
1187
+ },
1188
+ exact=True,
1189
+ )
1190
+
1191
+ def test_lazy_loading_room_members_explicit_membership_removed(self) -> None:
1192
+ """Test the case where we requested explicit memberships and then later
1193
+ changed to lazy loading."""
1194
+
1195
+ user1_id = self.register_user("user1", "pass")
1196
+ user1_tok = self.login(user1_id, "pass")
1197
+ user2_id = self.register_user("user2", "pass")
1198
+ user2_tok = self.login(user2_id, "pass")
1199
+
1200
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
1201
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
1202
+
1203
+ self.helper.send(room_id1, "1", tok=user2_tok)
1204
+
1205
+ # Make a sync with lazy loading for the room members to establish
1206
+ # a position
1207
+ sync_body = {
1208
+ "lists": {
1209
+ "foo-list": {
1210
+ "ranges": [[0, 1]],
1211
+ "required_state": [
1212
+ [EventTypes.Member, StateValues.ME],
1213
+ ],
1214
+ "timeline_limit": 1,
1215
+ }
1216
+ }
1217
+ }
1218
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
1219
+
1220
+ # We expect to see only user1's membership in the room
1221
+ state_map = self.get_success(
1222
+ self.storage_controllers.state.get_current_state(room_id1)
1223
+ )
1224
+ self._assertRequiredStateIncludes(
1225
+ response_body["rooms"][room_id1]["required_state"],
1226
+ {
1227
+ state_map[(EventTypes.Member, user1_id)],
1228
+ },
1229
+ exact=True,
1230
+ )
1231
+
1232
+ # Now change to lazy loading...
1233
+ sync_body["lists"]["foo-list"]["required_state"] = [
1234
+ [EventTypes.Member, StateValues.LAZY],
1235
+ ]
1236
+
1237
+ # Send a message in room1 from user2
1238
+ self.helper.send(room_id1, "2", tok=user2_tok)
1239
+ response_body, from_token = self.do_sync(
1240
+ sync_body, since=from_token, tok=user1_tok
1241
+ )
1242
+
1243
+ # We should see user2's membership as it's in the timeline
1244
+ state_map = self.get_success(
1245
+ self.storage_controllers.state.get_current_state(room_id1)
1246
+ )
1247
+ self._assertRequiredStateIncludes(
1248
+ response_body["rooms"][room_id1]["required_state"],
1249
+ {
1250
+ state_map[(EventTypes.Member, user2_id)],
1251
+ },
1252
+ exact=True,
1253
+ )
1254
+
1255
+ # Now send a message in room1 from user1
1256
+ self.helper.send(room_id1, "3", tok=user1_tok)
1257
+
1258
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
1259
+
1260
+ # We should not see any memberships as we've already seen user1's
1261
+ # membership.
1262
+ state_map = self.get_success(
1263
+ self.storage_controllers.state.get_current_state(room_id1)
1264
+ )
1265
+ self._assertRequiredStateIncludes(
1266
+ response_body["rooms"][room_id1].get("required_state", []),
1267
+ [],
1268
+ exact=True,
1269
+ )
1270
+
1271
+ def test_rooms_required_state_me(self) -> None:
1272
+ """
1273
+ Test `rooms.required_state` correctly handles $ME.
1274
+ """
1275
+ user1_id = self.register_user("user1", "pass")
1276
+ user1_tok = self.login(user1_id, "pass")
1277
+ user2_id = self.register_user("user2", "pass")
1278
+ user2_tok = self.login(user2_id, "pass")
1279
+
1280
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
1281
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
1282
+
1283
+ self.helper.send(room_id1, "1", tok=user2_tok)
1284
+
1285
+ # Also send normal state events with state keys of the users, first
1286
+ # change the power levels to allow this.
1287
+ self.helper.send_state(
1288
+ room_id1,
1289
+ event_type=EventTypes.PowerLevels,
1290
+ body={"users": {user1_id: 50, user2_id: 100}},
1291
+ tok=user2_tok,
1292
+ )
1293
+ self.helper.send_state(
1294
+ room_id1,
1295
+ event_type="org.matrix.foo",
1296
+ state_key=user1_id,
1297
+ body={},
1298
+ tok=user1_tok,
1299
+ )
1300
+ self.helper.send_state(
1301
+ room_id1,
1302
+ event_type="org.matrix.foo",
1303
+ state_key=user2_id,
1304
+ body={},
1305
+ tok=user2_tok,
1306
+ )
1307
+
1308
+ # Make the Sliding Sync request with a request for '$ME'.
1309
+ sync_body = {
1310
+ "lists": {
1311
+ "foo-list": {
1312
+ "ranges": [[0, 1]],
1313
+ "required_state": [
1314
+ [EventTypes.Create, ""],
1315
+ [EventTypes.Member, StateValues.ME],
1316
+ ["org.matrix.foo", StateValues.ME],
1317
+ ],
1318
+ "timeline_limit": 3,
1319
+ }
1320
+ }
1321
+ }
1322
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
1323
+
1324
+ state_map = self.get_success(
1325
+ self.storage_controllers.state.get_current_state(room_id1)
1326
+ )
1327
+
1328
+ # Only user2 and user3 sent events in the 3 events we see in the `timeline`
1329
+ self._assertRequiredStateIncludes(
1330
+ response_body["rooms"][room_id1]["required_state"],
1331
+ {
1332
+ state_map[(EventTypes.Create, "")],
1333
+ state_map[(EventTypes.Member, user1_id)],
1334
+ state_map[("org.matrix.foo", user1_id)],
1335
+ },
1336
+ exact=True,
1337
+ )
1338
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
1339
+
1340
+ @parameterized.expand([(Membership.LEAVE,), (Membership.BAN,)])
1341
+ def test_rooms_required_state_leave_ban_initial(self, stop_membership: str) -> None:
1342
+ """
1343
+ Test `rooms.required_state` should not return state past a leave/ban event when
1344
+ it's the first "initial" time the room is being sent down the connection.
1345
+ """
1346
+ user1_id = self.register_user("user1", "pass")
1347
+ user1_tok = self.login(user1_id, "pass")
1348
+ user2_id = self.register_user("user2", "pass")
1349
+ user2_tok = self.login(user2_id, "pass")
1350
+ user3_id = self.register_user("user3", "pass")
1351
+ user3_tok = self.login(user3_id, "pass")
1352
+
1353
+ sync_body = {
1354
+ "lists": {
1355
+ "foo-list": {
1356
+ "ranges": [[0, 1]],
1357
+ "required_state": [
1358
+ [EventTypes.Create, ""],
1359
+ [EventTypes.Member, "*"],
1360
+ ["org.matrix.foo_state", ""],
1361
+ ],
1362
+ "timeline_limit": 3,
1363
+ }
1364
+ }
1365
+ }
1366
+ _, from_token = self.do_sync(sync_body, tok=user1_tok)
1367
+
1368
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
1369
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
1370
+ self.helper.join(room_id1, user3_id, tok=user3_tok)
1371
+
1372
+ self.helper.send_state(
1373
+ room_id1,
1374
+ event_type="org.matrix.foo_state",
1375
+ state_key="",
1376
+ body={"foo": "bar"},
1377
+ tok=user2_tok,
1378
+ )
1379
+ self.helper.send_state(
1380
+ room_id1,
1381
+ event_type="org.matrix.bar_state",
1382
+ state_key="",
1383
+ body={"bar": "bar"},
1384
+ tok=user2_tok,
1385
+ )
1386
+
1387
+ if stop_membership == Membership.LEAVE:
1388
+ # User 1 leaves
1389
+ self.helper.leave(room_id1, user1_id, tok=user1_tok)
1390
+ elif stop_membership == Membership.BAN:
1391
+ # User 1 is banned
1392
+ self.helper.ban(room_id1, src=user2_id, targ=user1_id, tok=user2_tok)
1393
+
1394
+ # Get the state_map before we change the state as this is the final state we
1395
+ # expect User1 to be able to see
1396
+ state_map = self.get_success(
1397
+ self.storage_controllers.state.get_current_state(room_id1)
1398
+ )
1399
+
1400
+ # Change the state after user 1 leaves
1401
+ self.helper.send_state(
1402
+ room_id1,
1403
+ event_type="org.matrix.foo_state",
1404
+ state_key="",
1405
+ body={"foo": "qux"},
1406
+ tok=user2_tok,
1407
+ )
1408
+ self.helper.send_state(
1409
+ room_id1,
1410
+ event_type="org.matrix.bar_state",
1411
+ state_key="",
1412
+ body={"bar": "qux"},
1413
+ tok=user2_tok,
1414
+ )
1415
+ self.helper.leave(room_id1, user3_id, tok=user3_tok)
1416
+
1417
+ # Make an incremental Sliding Sync request
1418
+ #
1419
+ # Also expand the required state to include the `org.matrix.bar_state` event.
1420
+ # This is just an extra complication of the test.
1421
+ sync_body = {
1422
+ "lists": {
1423
+ "foo-list": {
1424
+ "ranges": [[0, 1]],
1425
+ "required_state": [
1426
+ [EventTypes.Create, ""],
1427
+ [EventTypes.Member, "*"],
1428
+ ["org.matrix.foo_state", ""],
1429
+ ["org.matrix.bar_state", ""],
1430
+ ],
1431
+ "timeline_limit": 3,
1432
+ }
1433
+ }
1434
+ }
1435
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
1436
+
1437
+ # We should only see the state up to the leave/ban event
1438
+ self._assertRequiredStateIncludes(
1439
+ response_body["rooms"][room_id1]["required_state"],
1440
+ {
1441
+ state_map[(EventTypes.Create, "")],
1442
+ state_map[(EventTypes.Member, user1_id)],
1443
+ state_map[(EventTypes.Member, user2_id)],
1444
+ state_map[(EventTypes.Member, user3_id)],
1445
+ state_map[("org.matrix.foo_state", "")],
1446
+ state_map[("org.matrix.bar_state", "")],
1447
+ },
1448
+ exact=True,
1449
+ )
1450
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
1451
+
1452
+ @parameterized.expand([(Membership.LEAVE,), (Membership.BAN,)])
1453
+ def test_rooms_required_state_leave_ban_incremental(
1454
+ self, stop_membership: str
1455
+ ) -> None:
1456
+ """
1457
+ Test `rooms.required_state` should not return state past a leave/ban event on
1458
+ incremental sync.
1459
+ """
1460
+ user1_id = self.register_user("user1", "pass")
1461
+ user1_tok = self.login(user1_id, "pass")
1462
+ user2_id = self.register_user("user2", "pass")
1463
+ user2_tok = self.login(user2_id, "pass")
1464
+ user3_id = self.register_user("user3", "pass")
1465
+ user3_tok = self.login(user3_id, "pass")
1466
+
1467
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
1468
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
1469
+ self.helper.join(room_id1, user3_id, tok=user3_tok)
1470
+
1471
+ self.helper.send_state(
1472
+ room_id1,
1473
+ event_type="org.matrix.foo_state",
1474
+ state_key="",
1475
+ body={"foo": "bar"},
1476
+ tok=user2_tok,
1477
+ )
1478
+ self.helper.send_state(
1479
+ room_id1,
1480
+ event_type="org.matrix.bar_state",
1481
+ state_key="",
1482
+ body={"bar": "bar"},
1483
+ tok=user2_tok,
1484
+ )
1485
+
1486
+ sync_body = {
1487
+ "lists": {
1488
+ "foo-list": {
1489
+ "ranges": [[0, 1]],
1490
+ "required_state": [
1491
+ [EventTypes.Create, ""],
1492
+ [EventTypes.Member, "*"],
1493
+ ["org.matrix.foo_state", ""],
1494
+ ],
1495
+ "timeline_limit": 3,
1496
+ }
1497
+ }
1498
+ }
1499
+ _, from_token = self.do_sync(sync_body, tok=user1_tok)
1500
+
1501
+ if stop_membership == Membership.LEAVE:
1502
+ # User 1 leaves
1503
+ self.helper.leave(room_id1, user1_id, tok=user1_tok)
1504
+ elif stop_membership == Membership.BAN:
1505
+ # User 1 is banned
1506
+ self.helper.ban(room_id1, src=user2_id, targ=user1_id, tok=user2_tok)
1507
+
1508
+ # Get the state_map before we change the state as this is the final state we
1509
+ # expect User1 to be able to see
1510
+ state_map = self.get_success(
1511
+ self.storage_controllers.state.get_current_state(room_id1)
1512
+ )
1513
+
1514
+ # Change the state after user 1 leaves
1515
+ self.helper.send_state(
1516
+ room_id1,
1517
+ event_type="org.matrix.foo_state",
1518
+ state_key="",
1519
+ body={"foo": "qux"},
1520
+ tok=user2_tok,
1521
+ )
1522
+ self.helper.send_state(
1523
+ room_id1,
1524
+ event_type="org.matrix.bar_state",
1525
+ state_key="",
1526
+ body={"bar": "qux"},
1527
+ tok=user2_tok,
1528
+ )
1529
+ self.helper.leave(room_id1, user3_id, tok=user3_tok)
1530
+
1531
+ # Make an incremental Sliding Sync request
1532
+ #
1533
+ # Also expand the required state to include the `org.matrix.bar_state` event.
1534
+ # This is just an extra complication of the test.
1535
+ sync_body = {
1536
+ "lists": {
1537
+ "foo-list": {
1538
+ "ranges": [[0, 1]],
1539
+ "required_state": [
1540
+ [EventTypes.Create, ""],
1541
+ [EventTypes.Member, "*"],
1542
+ ["org.matrix.foo_state", ""],
1543
+ ["org.matrix.bar_state", ""],
1544
+ ],
1545
+ "timeline_limit": 3,
1546
+ }
1547
+ }
1548
+ }
1549
+ response_body, _ = self.do_sync(sync_body, since=from_token, tok=user1_tok)
1550
+
1551
+ # User1 should only see the state up to the leave/ban event
1552
+ self._assertRequiredStateIncludes(
1553
+ response_body["rooms"][room_id1]["required_state"],
1554
+ {
1555
+ # User1 should see their leave/ban membership
1556
+ state_map[(EventTypes.Member, user1_id)],
1557
+ state_map[("org.matrix.bar_state", "")],
1558
+ # The commented out state events were already returned in the initial
1559
+ # sync so we shouldn't see them again on the incremental sync. And we
1560
+ # shouldn't see the state events that changed after the leave/ban event.
1561
+ #
1562
+ # state_map[(EventTypes.Create, "")],
1563
+ # state_map[(EventTypes.Member, user2_id)],
1564
+ # state_map[(EventTypes.Member, user3_id)],
1565
+ # state_map[("org.matrix.foo_state", "")],
1566
+ },
1567
+ exact=True,
1568
+ )
1569
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
1570
+
1571
+ def test_rooms_required_state_combine_superset(self) -> None:
1572
+ """
1573
+ Test `rooms.required_state` is combined across lists and room subscriptions.
1574
+ """
1575
+ user1_id = self.register_user("user1", "pass")
1576
+ user1_tok = self.login(user1_id, "pass")
1577
+ user2_id = self.register_user("user2", "pass")
1578
+ user2_tok = self.login(user2_id, "pass")
1579
+
1580
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
1581
+ self.helper.join(room_id1, user1_id, tok=user1_tok)
1582
+
1583
+ self.helper.send_state(
1584
+ room_id1,
1585
+ event_type="org.matrix.foo_state",
1586
+ state_key="",
1587
+ body={"foo": "bar"},
1588
+ tok=user2_tok,
1589
+ )
1590
+ self.helper.send_state(
1591
+ room_id1,
1592
+ event_type="org.matrix.bar_state",
1593
+ state_key="",
1594
+ body={"bar": "qux"},
1595
+ tok=user2_tok,
1596
+ )
1597
+
1598
+ # Make the Sliding Sync request with wildcards for the `state_key`
1599
+ sync_body = {
1600
+ "lists": {
1601
+ "foo-list": {
1602
+ "ranges": [[0, 1]],
1603
+ "required_state": [
1604
+ [EventTypes.Create, ""],
1605
+ [EventTypes.Member, user1_id],
1606
+ ],
1607
+ "timeline_limit": 0,
1608
+ },
1609
+ "bar-list": {
1610
+ "ranges": [[0, 1]],
1611
+ "required_state": [
1612
+ [EventTypes.Member, StateValues.WILDCARD],
1613
+ ["org.matrix.foo_state", ""],
1614
+ ],
1615
+ "timeline_limit": 0,
1616
+ },
1617
+ },
1618
+ "room_subscriptions": {
1619
+ room_id1: {
1620
+ "required_state": [["org.matrix.bar_state", ""]],
1621
+ "timeline_limit": 0,
1622
+ }
1623
+ },
1624
+ }
1625
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
1626
+
1627
+ state_map = self.get_success(
1628
+ self.storage_controllers.state.get_current_state(room_id1)
1629
+ )
1630
+
1631
+ self._assertRequiredStateIncludes(
1632
+ response_body["rooms"][room_id1]["required_state"],
1633
+ {
1634
+ state_map[(EventTypes.Create, "")],
1635
+ state_map[(EventTypes.Member, user1_id)],
1636
+ state_map[(EventTypes.Member, user2_id)],
1637
+ state_map[("org.matrix.foo_state", "")],
1638
+ state_map[("org.matrix.bar_state", "")],
1639
+ },
1640
+ exact=True,
1641
+ )
1642
+ self.assertIsNone(response_body["rooms"][room_id1].get("invite_state"))
1643
+
1644
+ def test_rooms_required_state_partial_state(self) -> None:
1645
+ """
1646
+ Test partially-stated room are excluded if they require full state.
1647
+ """
1648
+ user1_id = self.register_user("user1", "pass")
1649
+ user1_tok = self.login(user1_id, "pass")
1650
+ user2_id = self.register_user("user2", "pass")
1651
+ user2_tok = self.login(user2_id, "pass")
1652
+
1653
+ room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
1654
+ room_id2 = self.helper.create_room_as(user2_id, tok=user2_tok)
1655
+ _join_response1 = self.helper.join(room_id1, user1_id, tok=user1_tok)
1656
+ join_response2 = self.helper.join(room_id2, user1_id, tok=user1_tok)
1657
+
1658
+ # Mark room2 as partial state
1659
+ self.get_success(
1660
+ mark_event_as_partial_state(self.hs, join_response2["event_id"], room_id2)
1661
+ )
1662
+
1663
+ # Make the Sliding Sync request with examples where `must_await_full_state()` is
1664
+ # `False`
1665
+ sync_body = {
1666
+ "lists": {
1667
+ "no-state-list": {
1668
+ "ranges": [[0, 1]],
1669
+ "required_state": [],
1670
+ "timeline_limit": 0,
1671
+ },
1672
+ "other-state-list": {
1673
+ "ranges": [[0, 1]],
1674
+ "required_state": [
1675
+ [EventTypes.Create, ""],
1676
+ ],
1677
+ "timeline_limit": 0,
1678
+ },
1679
+ "lazy-load-list": {
1680
+ "ranges": [[0, 1]],
1681
+ "required_state": [
1682
+ [EventTypes.Create, ""],
1683
+ # Lazy-load room members
1684
+ [EventTypes.Member, StateValues.LAZY],
1685
+ # Local member
1686
+ [EventTypes.Member, user2_id],
1687
+ ],
1688
+ "timeline_limit": 0,
1689
+ },
1690
+ "local-members-only-list": {
1691
+ "ranges": [[0, 1]],
1692
+ "required_state": [
1693
+ # Own user ID
1694
+ [EventTypes.Member, user1_id],
1695
+ # Local member
1696
+ [EventTypes.Member, user2_id],
1697
+ ],
1698
+ "timeline_limit": 0,
1699
+ },
1700
+ "me-list": {
1701
+ "ranges": [[0, 1]],
1702
+ "required_state": [
1703
+ # Own user ID
1704
+ [EventTypes.Member, StateValues.ME],
1705
+ # Local member
1706
+ [EventTypes.Member, user2_id],
1707
+ ],
1708
+ "timeline_limit": 0,
1709
+ },
1710
+ "wildcard-type-local-state-key-list": {
1711
+ "ranges": [[0, 1]],
1712
+ "required_state": [
1713
+ ["*", user1_id],
1714
+ # Not a user ID
1715
+ ["*", "foobarbaz"],
1716
+ # Not a user ID
1717
+ ["*", "foo.bar.baz"],
1718
+ # Not a user ID
1719
+ ["*", "@foo"],
1720
+ ],
1721
+ "timeline_limit": 0,
1722
+ },
1723
+ }
1724
+ }
1725
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
1726
+
1727
+ # The list should include both rooms now because we don't need full state
1728
+ for list_key in response_body["lists"].keys():
1729
+ self.assertIncludes(
1730
+ set(response_body["lists"][list_key]["ops"][0]["room_ids"]),
1731
+ {room_id2, room_id1},
1732
+ exact=True,
1733
+ message=f"Expected all rooms to show up for list_key={list_key}. Response "
1734
+ + str(response_body["lists"][list_key]),
1735
+ )
1736
+
1737
+ # Take each of the list variants and apply them to room subscriptions to make
1738
+ # sure the same rules apply
1739
+ for list_key in sync_body["lists"].keys():
1740
+ sync_body_for_subscriptions = {
1741
+ "room_subscriptions": {
1742
+ room_id1: {
1743
+ "required_state": sync_body["lists"][list_key][
1744
+ "required_state"
1745
+ ],
1746
+ "timeline_limit": 0,
1747
+ },
1748
+ room_id2: {
1749
+ "required_state": sync_body["lists"][list_key][
1750
+ "required_state"
1751
+ ],
1752
+ "timeline_limit": 0,
1753
+ },
1754
+ }
1755
+ }
1756
+ response_body, _ = self.do_sync(sync_body_for_subscriptions, tok=user1_tok)
1757
+
1758
+ self.assertIncludes(
1759
+ set(response_body["rooms"].keys()),
1760
+ {room_id2, room_id1},
1761
+ exact=True,
1762
+ message=f"Expected all rooms to show up for test_key={list_key}.",
1763
+ )
1764
+
1765
+ # =====================================================================
1766
+
1767
+ # Make the Sliding Sync request with examples where `must_await_full_state()` is
1768
+ # `True`
1769
+ sync_body = {
1770
+ "lists": {
1771
+ "wildcard-list": {
1772
+ "ranges": [[0, 1]],
1773
+ "required_state": [
1774
+ ["*", "*"],
1775
+ ],
1776
+ "timeline_limit": 0,
1777
+ },
1778
+ "wildcard-type-remote-state-key-list": {
1779
+ "ranges": [[0, 1]],
1780
+ "required_state": [
1781
+ ["*", "@some:remote"],
1782
+ # Not a user ID
1783
+ ["*", "foobarbaz"],
1784
+ # Not a user ID
1785
+ ["*", "foo.bar.baz"],
1786
+ # Not a user ID
1787
+ ["*", "@foo"],
1788
+ ],
1789
+ "timeline_limit": 0,
1790
+ },
1791
+ "remote-member-list": {
1792
+ "ranges": [[0, 1]],
1793
+ "required_state": [
1794
+ # Own user ID
1795
+ [EventTypes.Member, user1_id],
1796
+ # Remote member
1797
+ [EventTypes.Member, "@some:remote"],
1798
+ # Local member
1799
+ [EventTypes.Member, user2_id],
1800
+ ],
1801
+ "timeline_limit": 0,
1802
+ },
1803
+ "lazy-but-remote-member-list": {
1804
+ "ranges": [[0, 1]],
1805
+ "required_state": [
1806
+ # Lazy-load room members
1807
+ [EventTypes.Member, StateValues.LAZY],
1808
+ # Remote member
1809
+ [EventTypes.Member, "@some:remote"],
1810
+ ],
1811
+ "timeline_limit": 0,
1812
+ },
1813
+ }
1814
+ }
1815
+ response_body, _ = self.do_sync(sync_body, tok=user1_tok)
1816
+
1817
+ # Make sure the list includes room1 but room2 is excluded because it's still
1818
+ # partially-stated
1819
+ for list_key in response_body["lists"].keys():
1820
+ self.assertIncludes(
1821
+ set(response_body["lists"][list_key]["ops"][0]["room_ids"]),
1822
+ {room_id1},
1823
+ exact=True,
1824
+ message=f"Expected only fully-stated rooms to show up for list_key={list_key}. Response "
1825
+ + str(response_body["lists"][list_key]),
1826
+ )
1827
+
1828
+ # Take each of the list variants and apply them to room subscriptions to make
1829
+ # sure the same rules apply
1830
+ for list_key in sync_body["lists"].keys():
1831
+ sync_body_for_subscriptions = {
1832
+ "room_subscriptions": {
1833
+ room_id1: {
1834
+ "required_state": sync_body["lists"][list_key][
1835
+ "required_state"
1836
+ ],
1837
+ "timeline_limit": 0,
1838
+ },
1839
+ room_id2: {
1840
+ "required_state": sync_body["lists"][list_key][
1841
+ "required_state"
1842
+ ],
1843
+ "timeline_limit": 0,
1844
+ },
1845
+ }
1846
+ }
1847
+ response_body, _ = self.do_sync(sync_body_for_subscriptions, tok=user1_tok)
1848
+
1849
+ self.assertIncludes(
1850
+ set(response_body["rooms"].keys()),
1851
+ {room_id1},
1852
+ exact=True,
1853
+ message=f"Expected only fully-stated rooms to show up for test_key={list_key}.",
1854
+ )
1855
+
1856
+ def test_rooms_required_state_expand(self) -> None:
1857
+ """Test that when we expand the required state argument we get the
1858
+ expanded state, and not just the changes to the new expanded."""
1859
+
1860
+ user1_id = self.register_user("user1", "pass")
1861
+ user1_tok = self.login(user1_id, "pass")
1862
+
1863
+ # Create a room with a room name.
1864
+ room_id1 = self.helper.create_room_as(
1865
+ user1_id, tok=user1_tok, extra_content={"name": "Foo"}
1866
+ )
1867
+
1868
+ # Only request the state event to begin with
1869
+ sync_body = {
1870
+ "lists": {
1871
+ "foo-list": {
1872
+ "ranges": [[0, 1]],
1873
+ "required_state": [
1874
+ [EventTypes.Create, ""],
1875
+ ],
1876
+ "timeline_limit": 1,
1877
+ }
1878
+ }
1879
+ }
1880
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
1881
+
1882
+ state_map = self.get_success(
1883
+ self.storage_controllers.state.get_current_state(room_id1)
1884
+ )
1885
+
1886
+ self._assertRequiredStateIncludes(
1887
+ response_body["rooms"][room_id1]["required_state"],
1888
+ {
1889
+ state_map[(EventTypes.Create, "")],
1890
+ },
1891
+ exact=True,
1892
+ )
1893
+
1894
+ # Send a message so the room comes down sync.
1895
+ self.helper.send(room_id1, "msg", tok=user1_tok)
1896
+
1897
+ # Update the sliding sync requests to include the room name
1898
+ sync_body["lists"]["foo-list"]["required_state"] = [
1899
+ [EventTypes.Create, ""],
1900
+ [EventTypes.Name, ""],
1901
+ ]
1902
+ response_body, from_token = self.do_sync(
1903
+ sync_body, since=from_token, tok=user1_tok
1904
+ )
1905
+
1906
+ # We should see the room name, even though there haven't been any
1907
+ # changes.
1908
+ self._assertRequiredStateIncludes(
1909
+ response_body["rooms"][room_id1]["required_state"],
1910
+ {
1911
+ state_map[(EventTypes.Name, "")],
1912
+ },
1913
+ exact=True,
1914
+ )
1915
+
1916
+ # Send a message so the room comes down sync.
1917
+ self.helper.send(room_id1, "msg", tok=user1_tok)
1918
+
1919
+ # We should not see any state changes.
1920
+ response_body, from_token = self.do_sync(
1921
+ sync_body, since=from_token, tok=user1_tok
1922
+ )
1923
+ self.assertIsNone(response_body["rooms"][room_id1].get("required_state"))
1924
+
1925
+ def test_rooms_required_state_expand_retract_expand(self) -> None:
1926
+ """Test that when expanding, retracting and then expanding the required
1927
+ state, we get the changes that happened."""
1928
+
1929
+ user1_id = self.register_user("user1", "pass")
1930
+ user1_tok = self.login(user1_id, "pass")
1931
+
1932
+ # Create a room with a room name.
1933
+ room_id1 = self.helper.create_room_as(
1934
+ user1_id, tok=user1_tok, extra_content={"name": "Foo"}
1935
+ )
1936
+
1937
+ # Only request the state event to begin with
1938
+ sync_body = {
1939
+ "lists": {
1940
+ "foo-list": {
1941
+ "ranges": [[0, 1]],
1942
+ "required_state": [
1943
+ [EventTypes.Create, ""],
1944
+ ],
1945
+ "timeline_limit": 1,
1946
+ }
1947
+ }
1948
+ }
1949
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
1950
+
1951
+ state_map = self.get_success(
1952
+ self.storage_controllers.state.get_current_state(room_id1)
1953
+ )
1954
+
1955
+ self._assertRequiredStateIncludes(
1956
+ response_body["rooms"][room_id1]["required_state"],
1957
+ {
1958
+ state_map[(EventTypes.Create, "")],
1959
+ },
1960
+ exact=True,
1961
+ )
1962
+
1963
+ # Send a message so the room comes down sync.
1964
+ self.helper.send(room_id1, "msg", tok=user1_tok)
1965
+
1966
+ # Update the sliding sync requests to include the room name
1967
+ sync_body["lists"]["foo-list"]["required_state"] = [
1968
+ [EventTypes.Create, ""],
1969
+ [EventTypes.Name, ""],
1970
+ ]
1971
+ response_body, from_token = self.do_sync(
1972
+ sync_body, since=from_token, tok=user1_tok
1973
+ )
1974
+
1975
+ # We should see the room name, even though there haven't been any
1976
+ # changes.
1977
+ self._assertRequiredStateIncludes(
1978
+ response_body["rooms"][room_id1]["required_state"],
1979
+ {
1980
+ state_map[(EventTypes.Name, "")],
1981
+ },
1982
+ exact=True,
1983
+ )
1984
+
1985
+ # Update the room name
1986
+ self.helper.send_state(
1987
+ room_id1, EventTypes.Name, {"name": "Bar"}, state_key="", tok=user1_tok
1988
+ )
1989
+
1990
+ # Update the sliding sync requests to exclude the room name again
1991
+ sync_body["lists"]["foo-list"]["required_state"] = [
1992
+ [EventTypes.Create, ""],
1993
+ ]
1994
+ response_body, from_token = self.do_sync(
1995
+ sync_body, since=from_token, tok=user1_tok
1996
+ )
1997
+
1998
+ # We should not see the updated room name in state (though it will be in
1999
+ # the timeline).
2000
+ self.assertIsNone(response_body["rooms"][room_id1].get("required_state"))
2001
+
2002
+ # Send a message so the room comes down sync.
2003
+ self.helper.send(room_id1, "msg", tok=user1_tok)
2004
+
2005
+ # Update the sliding sync requests to include the room name again
2006
+ sync_body["lists"]["foo-list"]["required_state"] = [
2007
+ [EventTypes.Create, ""],
2008
+ [EventTypes.Name, ""],
2009
+ ]
2010
+ response_body, from_token = self.do_sync(
2011
+ sync_body, since=from_token, tok=user1_tok
2012
+ )
2013
+
2014
+ # We should see the *new* room name, even though there haven't been any
2015
+ # changes.
2016
+ state_map = self.get_success(
2017
+ self.storage_controllers.state.get_current_state(room_id1)
2018
+ )
2019
+ self._assertRequiredStateIncludes(
2020
+ response_body["rooms"][room_id1]["required_state"],
2021
+ {
2022
+ state_map[(EventTypes.Name, "")],
2023
+ },
2024
+ exact=True,
2025
+ )
2026
+
2027
+ def test_rooms_required_state_expand_deduplicate(self) -> None:
2028
+ """Test that when expanding, retracting and then expanding the required
2029
+ state, we don't get the state down again if it hasn't changed"""
2030
+
2031
+ user1_id = self.register_user("user1", "pass")
2032
+ user1_tok = self.login(user1_id, "pass")
2033
+
2034
+ # Create a room with a room name.
2035
+ room_id1 = self.helper.create_room_as(
2036
+ user1_id, tok=user1_tok, extra_content={"name": "Foo"}
2037
+ )
2038
+
2039
+ # Only request the state event to begin with
2040
+ sync_body = {
2041
+ "lists": {
2042
+ "foo-list": {
2043
+ "ranges": [[0, 1]],
2044
+ "required_state": [
2045
+ [EventTypes.Create, ""],
2046
+ ],
2047
+ "timeline_limit": 1,
2048
+ }
2049
+ }
2050
+ }
2051
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
2052
+
2053
+ state_map = self.get_success(
2054
+ self.storage_controllers.state.get_current_state(room_id1)
2055
+ )
2056
+
2057
+ self._assertRequiredStateIncludes(
2058
+ response_body["rooms"][room_id1]["required_state"],
2059
+ {
2060
+ state_map[(EventTypes.Create, "")],
2061
+ },
2062
+ exact=True,
2063
+ )
2064
+
2065
+ # Send a message so the room comes down sync.
2066
+ self.helper.send(room_id1, "msg", tok=user1_tok)
2067
+
2068
+ # Update the sliding sync requests to include the room name
2069
+ sync_body["lists"]["foo-list"]["required_state"] = [
2070
+ [EventTypes.Create, ""],
2071
+ [EventTypes.Name, ""],
2072
+ ]
2073
+ response_body, from_token = self.do_sync(
2074
+ sync_body, since=from_token, tok=user1_tok
2075
+ )
2076
+
2077
+ # We should see the room name, even though there haven't been any
2078
+ # changes.
2079
+ self._assertRequiredStateIncludes(
2080
+ response_body["rooms"][room_id1]["required_state"],
2081
+ {
2082
+ state_map[(EventTypes.Name, "")],
2083
+ },
2084
+ exact=True,
2085
+ )
2086
+
2087
+ # Send a message so the room comes down sync.
2088
+ self.helper.send(room_id1, "msg", tok=user1_tok)
2089
+
2090
+ # Update the sliding sync requests to exclude the room name again
2091
+ sync_body["lists"]["foo-list"]["required_state"] = [
2092
+ [EventTypes.Create, ""],
2093
+ ]
2094
+ response_body, from_token = self.do_sync(
2095
+ sync_body, since=from_token, tok=user1_tok
2096
+ )
2097
+
2098
+ # We should not see any state updates
2099
+ self.assertIsNone(response_body["rooms"][room_id1].get("required_state"))
2100
+
2101
+ # Send a message so the room comes down sync.
2102
+ self.helper.send(room_id1, "msg", tok=user1_tok)
2103
+
2104
+ # Update the sliding sync requests to include the room name again
2105
+ sync_body["lists"]["foo-list"]["required_state"] = [
2106
+ [EventTypes.Create, ""],
2107
+ [EventTypes.Name, ""],
2108
+ ]
2109
+ response_body, from_token = self.do_sync(
2110
+ sync_body, since=from_token, tok=user1_tok
2111
+ )
2112
+
2113
+ # We should not see the room name again, as we have already sent that
2114
+ # down.
2115
+ self.assertIsNone(response_body["rooms"][room_id1].get("required_state"))
2116
+
2117
+ def test_lazy_loading_room_members_state_reset_non_limited_timeline(self) -> None:
2118
+ """Test that when using lazy-loaded members, if a membership state is
2119
+ reset to a previous state and the sync is not limited, then we send down
2120
+ the state reset.
2121
+
2122
+ Regression test as previously we only returned membership relevant to
2123
+ the timeline and so did not tell clients about state resets for
2124
+ users who did not send any timeline events.
2125
+ """
2126
+
2127
+ user1_id = self.register_user("user1", "pass")
2128
+ user1_tok = self.login(user1_id, "pass")
2129
+ user2_id = self.register_user("user2", "pass")
2130
+ user2_tok = self.login(user2_id, "pass")
2131
+
2132
+ room_id = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
2133
+ content = self.helper.join(room_id, user1_id, tok=user1_tok)
2134
+ first_event_id = content["event_id"]
2135
+
2136
+ # Send a message so that the user1 membership comes down sync (because we're lazy-loading room members)
2137
+ self.helper.send(room_id, "msg", tok=user1_tok)
2138
+
2139
+ sync_body = {
2140
+ "lists": {
2141
+ "foo-list": {
2142
+ "ranges": [[0, 1]],
2143
+ "required_state": [
2144
+ [EventTypes.Member, StateValues.LAZY],
2145
+ ],
2146
+ "timeline_limit": 1,
2147
+ }
2148
+ }
2149
+ }
2150
+ response_body, from_token = self.do_sync(sync_body, tok=user1_tok)
2151
+
2152
+ # Check that user1 is returned
2153
+ state_map = self.get_success(
2154
+ self.storage_controllers.state.get_current_state(room_id)
2155
+ )
2156
+ self._assertRequiredStateIncludes(
2157
+ response_body["rooms"][room_id]["required_state"],
2158
+ {
2159
+ state_map[(EventTypes.Member, user1_id)],
2160
+ },
2161
+ exact=True,
2162
+ )
2163
+
2164
+ # user1 changes their display name
2165
+ content = self.helper.send_state(
2166
+ room_id,
2167
+ EventTypes.Member,
2168
+ body={"membership": "join", "displayname": "New display name"},
2169
+ state_key=user1_id,
2170
+ tok=user1_tok,
2171
+ )
2172
+ second_event_id = content["event_id"]
2173
+
2174
+ response_body, from_token = self.do_sync(
2175
+ sync_body, since=from_token, tok=user1_tok
2176
+ )
2177
+
2178
+ # We should see the updated membership state
2179
+ state_map = self.get_success(
2180
+ self.storage_controllers.state.get_current_state(room_id)
2181
+ )
2182
+ self._assertRequiredStateIncludes(
2183
+ response_body["rooms"][room_id]["required_state"],
2184
+ {
2185
+ state_map[(EventTypes.Member, user1_id)],
2186
+ },
2187
+ exact=True,
2188
+ )
2189
+ self.assertEqual(
2190
+ response_body["rooms"][room_id]["required_state"][0]["event_id"],
2191
+ second_event_id,
2192
+ )
2193
+
2194
+ # Now, fake a reset the membership state to the first event
2195
+ persist_event_store = self.hs.get_datastores().persist_events
2196
+ assert persist_event_store is not None
2197
+
2198
+ self.get_success(
2199
+ persist_event_store.update_current_state(
2200
+ room_id,
2201
+ DeltaState(
2202
+ to_insert={(EventTypes.Member, user1_id): first_event_id},
2203
+ to_delete=[],
2204
+ ),
2205
+ # We don't need to worry about sliding sync changes for this test
2206
+ SlidingSyncTableChanges(
2207
+ room_id=room_id,
2208
+ joined_room_bump_stamp_to_fully_insert=None,
2209
+ joined_room_updates={},
2210
+ membership_snapshot_shared_insert_values={},
2211
+ to_insert_membership_snapshots=[],
2212
+ to_delete_membership_snapshots=[],
2213
+ ),
2214
+ )
2215
+ )
2216
+
2217
+ # Send a message from *user2* so that user1 wouldn't normally get
2218
+ # synced.
2219
+ self.helper.send(room_id, "msg2", tok=user2_tok)
2220
+
2221
+ response_body, from_token = self.do_sync(
2222
+ sync_body, since=from_token, tok=user1_tok
2223
+ )
2224
+
2225
+ # This should be a non-limited sync as there is only one timeline event
2226
+ # (<= `timeline_limit). This is important as we're specifically testing the non-`limited`
2227
+ # timeline scenario. And for reference, we don't send down state resets
2228
+ # on limited timelines when using lazy loaded memberships.
2229
+ self.assertFalse(
2230
+ response_body["rooms"][room_id].get("limited", False),
2231
+ "Expected a non-limited timeline",
2232
+ )
2233
+
2234
+ # We should see the reset membership state of user1
2235
+ state_map = self.get_success(
2236
+ self.storage_controllers.state.get_current_state(room_id)
2237
+ )
2238
+ self._assertRequiredStateIncludes(
2239
+ response_body["rooms"][room_id]["required_state"],
2240
+ {
2241
+ state_map[(EventTypes.Member, user1_id)],
2242
+ },
2243
+ )
2244
+ self.assertEqual(
2245
+ response_body["rooms"][room_id]["required_state"][0]["event_id"],
2246
+ first_event_id,
2247
+ )