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,1763 @@
1
+ #
2
+ # This file is licensed under the Affero General Public License (AGPL) version 3.
3
+ #
4
+ # Copyright 2014-2016 OpenMarket Ltd
5
+ # Copyright (C) 2023-2024 New Vector, Ltd
6
+ #
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Affero General Public License as
9
+ # published by the Free Software Foundation, either version 3 of the
10
+ # License, or (at your option) any later version.
11
+ #
12
+ # See the GNU Affero General Public License for more details:
13
+ # <https://www.gnu.org/licenses/agpl-3.0.html>.
14
+ #
15
+ # Originally licensed under the Apache License, Version 2.0:
16
+ # <http://www.apache.org/licenses/LICENSE-2.0>.
17
+ #
18
+ # [This file includes modifications made by New Vector Limited]
19
+ #
20
+ #
21
+
22
+ """This module contains REST servlets to do with rooms: /rooms/<paths>"""
23
+
24
+ import logging
25
+ import re
26
+ from enum import Enum
27
+ from http import HTTPStatus
28
+ from typing import TYPE_CHECKING, Awaitable
29
+ from urllib import parse as urlparse
30
+
31
+ import attr
32
+ from prometheus_client.core import Histogram
33
+
34
+ from twisted.web.server import Request
35
+
36
+ from synapse import event_auth
37
+ from synapse.api.constants import Direction, EventTypes, Membership
38
+ from synapse.api.errors import (
39
+ AuthError,
40
+ Codes,
41
+ InvalidClientCredentialsError,
42
+ MissingClientTokenError,
43
+ ShadowBanError,
44
+ SynapseError,
45
+ UnredactedContentDeletedError,
46
+ )
47
+ from synapse.api.filtering import Filter
48
+ from synapse.events.utils import (
49
+ EventClientSerializer,
50
+ SerializeEventConfig,
51
+ format_event_for_client_v2,
52
+ serialize_event,
53
+ )
54
+ from synapse.handlers.pagination import GetMessagesResult
55
+ from synapse.http.server import HttpServer
56
+ from synapse.http.servlet import (
57
+ ResolveRoomIdMixin,
58
+ RestServlet,
59
+ assert_params_in_dict,
60
+ parse_boolean,
61
+ parse_enum,
62
+ parse_integer,
63
+ parse_json,
64
+ parse_json_object_from_request,
65
+ parse_string,
66
+ parse_strings_from_args,
67
+ )
68
+ from synapse.http.site import SynapseRequest
69
+ from synapse.logging.context import make_deferred_yieldable, run_in_background
70
+ from synapse.logging.opentracing import set_tag, trace
71
+ from synapse.metrics import SERVER_NAME_LABEL
72
+ from synapse.rest.client._base import client_patterns
73
+ from synapse.rest.client.transactions import HttpTransactionCache
74
+ from synapse.state import CREATE_KEY, POWER_KEY
75
+ from synapse.storage.databases.main import DataStore
76
+ from synapse.streams.config import PaginationConfig
77
+ from synapse.types import JsonDict, Requester, StreamToken, ThirdPartyInstanceID, UserID
78
+ from synapse.types.state import StateFilter
79
+ from synapse.util.cancellation import cancellable
80
+ from synapse.util.clock import Clock
81
+ from synapse.util.events import generate_fake_event_id
82
+ from synapse.util.stringutils import parse_and_validate_server_name
83
+
84
+ if TYPE_CHECKING:
85
+ from synapse.server import HomeServer
86
+
87
+ logger = logging.getLogger(__name__)
88
+
89
+
90
+ class _RoomSize(Enum):
91
+ """
92
+ Enum to differentiate sizes of rooms. This is a pretty good approximation
93
+ about how hard it will be to get events in the room. We could also look at
94
+ room "complexity".
95
+ """
96
+
97
+ # This doesn't necessarily mean the room is a DM, just that there is a DM
98
+ # amount of people there.
99
+ DM_SIZE = "direct_message_size"
100
+ SMALL = "small"
101
+ SUBSTANTIAL = "substantial"
102
+ LARGE = "large"
103
+
104
+ @staticmethod
105
+ def from_member_count(member_count: int) -> "_RoomSize":
106
+ if member_count <= 2:
107
+ return _RoomSize.DM_SIZE
108
+ elif member_count < 100:
109
+ return _RoomSize.SMALL
110
+ elif member_count < 1000:
111
+ return _RoomSize.SUBSTANTIAL
112
+ else:
113
+ return _RoomSize.LARGE
114
+
115
+
116
+ # This is an extra metric on top of `synapse_http_server_response_time_seconds`
117
+ # which times the same sort of thing but this one allows us to see values
118
+ # greater than 10s. We use a separate dedicated histogram with its own buckets
119
+ # so that we don't increase the cardinality of the general one because it's
120
+ # multiplied across hundreds of servlets.
121
+ messsages_response_timer = Histogram(
122
+ "synapse_room_message_list_rest_servlet_response_time_seconds",
123
+ "sec",
124
+ # We have a label for room size so we can try to see a more realistic
125
+ # picture of /messages response time for bigger rooms. We don't want the
126
+ # tiny rooms that can always respond fast skewing our results when we're trying
127
+ # to optimize the bigger cases.
128
+ labelnames=["room_size", SERVER_NAME_LABEL],
129
+ buckets=(
130
+ 0.005,
131
+ 0.01,
132
+ 0.025,
133
+ 0.05,
134
+ 0.1,
135
+ 0.25,
136
+ 0.5,
137
+ 1.0,
138
+ 2.5,
139
+ 5.0,
140
+ 10.0,
141
+ 20.0,
142
+ 30.0,
143
+ 60.0,
144
+ 80.0,
145
+ 100.0,
146
+ 120.0,
147
+ 150.0,
148
+ 180.0,
149
+ "+Inf",
150
+ ),
151
+ )
152
+
153
+
154
+ class TransactionRestServlet(RestServlet):
155
+ def __init__(self, hs: "HomeServer"):
156
+ super().__init__()
157
+ self.txns = HttpTransactionCache(hs)
158
+
159
+
160
+ class RoomCreateRestServlet(TransactionRestServlet):
161
+ CATEGORY = "Client API requests"
162
+
163
+ def __init__(self, hs: "HomeServer"):
164
+ super().__init__(hs)
165
+ self._room_creation_handler = hs.get_room_creation_handler()
166
+ self.auth = hs.get_auth()
167
+
168
+ def register(self, http_server: HttpServer) -> None:
169
+ PATTERNS = "/createRoom"
170
+ register_txn_path(self, PATTERNS, http_server)
171
+
172
+ async def on_PUT(
173
+ self, request: SynapseRequest, txn_id: str
174
+ ) -> tuple[int, JsonDict]:
175
+ requester = await self.auth.get_user_by_req(request)
176
+ set_tag("txn_id", txn_id)
177
+ return await self.txns.fetch_or_execute_request(
178
+ request, requester, self._do, request, requester
179
+ )
180
+
181
+ async def on_POST(self, request: SynapseRequest) -> tuple[int, JsonDict]:
182
+ requester = await self.auth.get_user_by_req(request)
183
+ return await self._do(request, requester)
184
+
185
+ async def _do(
186
+ self, request: SynapseRequest, requester: Requester
187
+ ) -> tuple[int, JsonDict]:
188
+ room_id, _, _ = await self._room_creation_handler.create_room(
189
+ requester, self.get_room_config(request)
190
+ )
191
+
192
+ return 200, {"room_id": room_id}
193
+
194
+ def get_room_config(self, request: Request) -> JsonDict:
195
+ user_supplied_config = parse_json_object_from_request(request)
196
+ return user_supplied_config
197
+
198
+
199
+ # TODO: Needs unit testing for generic events
200
+ class RoomStateEventRestServlet(RestServlet):
201
+ CATEGORY = "Event sending requests"
202
+
203
+ def __init__(self, hs: "HomeServer"):
204
+ super().__init__()
205
+ self.event_creation_handler = hs.get_event_creation_handler()
206
+ self.room_member_handler = hs.get_room_member_handler()
207
+ self.message_handler = hs.get_message_handler()
208
+ self.delayed_events_handler = hs.get_delayed_events_handler()
209
+ self.auth = hs.get_auth()
210
+ self.clock = hs.get_clock()
211
+ self._max_event_delay_ms = hs.config.server.max_event_delay_ms
212
+ self._spam_checker_module_callbacks = hs.get_module_api_callbacks().spam_checker
213
+
214
+ def register(self, http_server: HttpServer) -> None:
215
+ # /rooms/$roomid/state/$eventtype
216
+ no_state_key = "/rooms/(?P<room_id>[^/]*)/state/(?P<event_type>[^/]*)$"
217
+
218
+ # /rooms/$roomid/state/$eventtype/$statekey
219
+ state_key = (
220
+ "/rooms/(?P<room_id>[^/]*)/state/"
221
+ "(?P<event_type>[^/]*)/(?P<state_key>[^/]*)$"
222
+ )
223
+
224
+ http_server.register_paths(
225
+ "GET",
226
+ client_patterns(state_key, v1=True),
227
+ self.on_GET,
228
+ self.__class__.__name__,
229
+ )
230
+ http_server.register_paths(
231
+ "PUT",
232
+ client_patterns(state_key, v1=True),
233
+ self.on_PUT,
234
+ self.__class__.__name__,
235
+ )
236
+ http_server.register_paths(
237
+ "GET",
238
+ client_patterns(no_state_key, v1=True),
239
+ self.on_GET_no_state_key,
240
+ self.__class__.__name__,
241
+ )
242
+ http_server.register_paths(
243
+ "PUT",
244
+ client_patterns(no_state_key, v1=True),
245
+ self.on_PUT_no_state_key,
246
+ self.__class__.__name__,
247
+ )
248
+
249
+ @cancellable
250
+ def on_GET_no_state_key(
251
+ self, request: SynapseRequest, room_id: str, event_type: str
252
+ ) -> Awaitable[tuple[int, JsonDict]]:
253
+ return self.on_GET(request, room_id, event_type, "")
254
+
255
+ def on_PUT_no_state_key(
256
+ self, request: SynapseRequest, room_id: str, event_type: str
257
+ ) -> Awaitable[tuple[int, JsonDict]]:
258
+ return self.on_PUT(request, room_id, event_type, "")
259
+
260
+ @cancellable
261
+ async def on_GET(
262
+ self, request: SynapseRequest, room_id: str, event_type: str, state_key: str
263
+ ) -> tuple[int, JsonDict]:
264
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
265
+ format = parse_string(
266
+ request, "format", default="content", allowed_values=["content", "event"]
267
+ )
268
+
269
+ msg_handler = self.message_handler
270
+ data = await msg_handler.get_room_data(
271
+ requester=requester,
272
+ room_id=room_id,
273
+ event_type=event_type,
274
+ state_key=state_key,
275
+ )
276
+
277
+ if not data:
278
+ raise SynapseError(404, "Event not found.", errcode=Codes.NOT_FOUND)
279
+
280
+ if format == "event":
281
+ event = serialize_event(
282
+ data,
283
+ self.clock.time_msec(),
284
+ config=SerializeEventConfig(
285
+ event_format=format_event_for_client_v2,
286
+ requester=requester,
287
+ ),
288
+ )
289
+ return 200, event
290
+ elif format == "content":
291
+ return 200, data.get_dict()["content"]
292
+
293
+ # Format must be event or content, per the parse_string call above.
294
+ raise RuntimeError(f"Unknown format: {format:r}.")
295
+
296
+ async def on_PUT(
297
+ self,
298
+ request: SynapseRequest,
299
+ room_id: str,
300
+ event_type: str,
301
+ state_key: str,
302
+ txn_id: str | None = None,
303
+ ) -> tuple[int, JsonDict]:
304
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
305
+
306
+ if txn_id:
307
+ set_tag("txn_id", txn_id)
308
+
309
+ content = parse_json_object_from_request(request)
310
+
311
+ is_requester_admin = await self.auth.is_server_admin(requester)
312
+ if not is_requester_admin:
313
+ spam_check = (
314
+ await self._spam_checker_module_callbacks.user_may_send_state_event(
315
+ user_id=requester.user.to_string(),
316
+ room_id=room_id,
317
+ event_type=event_type,
318
+ state_key=state_key,
319
+ content=content,
320
+ )
321
+ )
322
+ if spam_check != self._spam_checker_module_callbacks.NOT_SPAM:
323
+ raise SynapseError(
324
+ 403,
325
+ "You are not permitted to send the state event",
326
+ errcode=spam_check[0],
327
+ additional_fields=spam_check[1],
328
+ )
329
+
330
+ origin_server_ts = None
331
+ if requester.app_service:
332
+ origin_server_ts = parse_integer(request, "ts")
333
+
334
+ delay = _parse_request_delay(request, self._max_event_delay_ms)
335
+ if delay is not None:
336
+ delay_id = await self.delayed_events_handler.add(
337
+ requester,
338
+ room_id=room_id,
339
+ event_type=event_type,
340
+ state_key=state_key,
341
+ origin_server_ts=origin_server_ts,
342
+ content=content,
343
+ delay=delay,
344
+ )
345
+
346
+ set_tag("delay_id", delay_id)
347
+ ret = {"delay_id": delay_id}
348
+ return 200, ret
349
+
350
+ try:
351
+ if event_type == EventTypes.Member:
352
+ membership = content.get("membership", None)
353
+ if not isinstance(membership, str):
354
+ raise SynapseError(400, "Invalid membership (must be a string)")
355
+
356
+ event_id, _ = await self.room_member_handler.update_membership(
357
+ requester,
358
+ target=UserID.from_string(state_key),
359
+ room_id=room_id,
360
+ action=membership,
361
+ content=content,
362
+ origin_server_ts=origin_server_ts,
363
+ )
364
+ else:
365
+ event_dict: JsonDict = {
366
+ "type": event_type,
367
+ "content": content,
368
+ "room_id": room_id,
369
+ "sender": requester.user.to_string(),
370
+ }
371
+
372
+ if state_key is not None:
373
+ event_dict["state_key"] = state_key
374
+
375
+ if origin_server_ts is not None:
376
+ event_dict["origin_server_ts"] = origin_server_ts
377
+
378
+ (
379
+ event,
380
+ _,
381
+ ) = await self.event_creation_handler.create_and_send_nonmember_event(
382
+ requester, event_dict, txn_id=txn_id
383
+ )
384
+ event_id = event.event_id
385
+ except ShadowBanError:
386
+ event_id = generate_fake_event_id()
387
+
388
+ set_tag("event_id", event_id)
389
+ ret = {"event_id": event_id}
390
+ return 200, ret
391
+
392
+
393
+ # TODO: Needs unit testing for generic events + feedback
394
+ class RoomSendEventRestServlet(TransactionRestServlet):
395
+ CATEGORY = "Event sending requests"
396
+
397
+ def __init__(self, hs: "HomeServer"):
398
+ super().__init__(hs)
399
+ self.event_creation_handler = hs.get_event_creation_handler()
400
+ self.delayed_events_handler = hs.get_delayed_events_handler()
401
+ self.auth = hs.get_auth()
402
+ self._max_event_delay_ms = hs.config.server.max_event_delay_ms
403
+
404
+ def register(self, http_server: HttpServer) -> None:
405
+ # /rooms/$roomid/send/$event_type[/$txn_id]
406
+ PATTERNS = "/rooms/(?P<room_id>[^/]*)/send/(?P<event_type>[^/]*)"
407
+ register_txn_path(self, PATTERNS, http_server)
408
+
409
+ async def _do(
410
+ self,
411
+ request: SynapseRequest,
412
+ requester: Requester,
413
+ room_id: str,
414
+ event_type: str,
415
+ txn_id: str | None,
416
+ ) -> tuple[int, JsonDict]:
417
+ content = parse_json_object_from_request(request)
418
+
419
+ origin_server_ts = None
420
+ if requester.app_service:
421
+ origin_server_ts = parse_integer(request, "ts")
422
+
423
+ delay = _parse_request_delay(request, self._max_event_delay_ms)
424
+ if delay is not None:
425
+ delay_id = await self.delayed_events_handler.add(
426
+ requester,
427
+ room_id=room_id,
428
+ event_type=event_type,
429
+ state_key=None,
430
+ origin_server_ts=origin_server_ts,
431
+ content=content,
432
+ delay=delay,
433
+ )
434
+
435
+ set_tag("delay_id", delay_id)
436
+ ret = {"delay_id": delay_id}
437
+ return 200, ret
438
+
439
+ event_dict: JsonDict = {
440
+ "type": event_type,
441
+ "content": content,
442
+ "room_id": room_id,
443
+ "sender": requester.user.to_string(),
444
+ }
445
+
446
+ if origin_server_ts is not None:
447
+ event_dict["origin_server_ts"] = origin_server_ts
448
+
449
+ try:
450
+ (
451
+ event,
452
+ _,
453
+ ) = await self.event_creation_handler.create_and_send_nonmember_event(
454
+ requester, event_dict, txn_id=txn_id
455
+ )
456
+ event_id = event.event_id
457
+ except ShadowBanError:
458
+ event_id = generate_fake_event_id()
459
+
460
+ set_tag("event_id", event_id)
461
+ return 200, {"event_id": event_id}
462
+
463
+ async def on_POST(
464
+ self,
465
+ request: SynapseRequest,
466
+ room_id: str,
467
+ event_type: str,
468
+ ) -> tuple[int, JsonDict]:
469
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
470
+ return await self._do(request, requester, room_id, event_type, None)
471
+
472
+ async def on_PUT(
473
+ self, request: SynapseRequest, room_id: str, event_type: str, txn_id: str
474
+ ) -> tuple[int, JsonDict]:
475
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
476
+ set_tag("txn_id", txn_id)
477
+
478
+ return await self.txns.fetch_or_execute_request(
479
+ request,
480
+ requester,
481
+ self._do,
482
+ request,
483
+ requester,
484
+ room_id,
485
+ event_type,
486
+ txn_id,
487
+ )
488
+
489
+
490
+ def _parse_request_delay(
491
+ request: SynapseRequest,
492
+ max_delay: int | None,
493
+ ) -> int | None:
494
+ """Parses from the request string the delay parameter for
495
+ delayed event requests, and checks it for correctness.
496
+
497
+ Args:
498
+ request: the twisted HTTP request.
499
+ max_delay: the maximum allowed value of the delay parameter,
500
+ or None if no delay parameter is allowed.
501
+ Returns:
502
+ The value of the requested delay, or None if it was absent.
503
+
504
+ Raises:
505
+ SynapseError: if the delay parameter is present and forbidden,
506
+ or if it exceeds the maximum allowed value.
507
+ """
508
+ delay = parse_integer(request, "org.matrix.msc4140.delay")
509
+ if delay is None:
510
+ return None
511
+ if max_delay is None:
512
+ raise SynapseError(
513
+ HTTPStatus.BAD_REQUEST,
514
+ "Delayed events are not supported on this server",
515
+ Codes.UNKNOWN,
516
+ {
517
+ "org.matrix.msc4140.errcode": "M_MAX_DELAY_UNSUPPORTED",
518
+ },
519
+ )
520
+ if delay > max_delay:
521
+ raise SynapseError(
522
+ HTTPStatus.BAD_REQUEST,
523
+ "The requested delay exceeds the allowed maximum.",
524
+ Codes.UNKNOWN,
525
+ {
526
+ "org.matrix.msc4140.errcode": "M_MAX_DELAY_EXCEEDED",
527
+ "org.matrix.msc4140.max_delay": max_delay,
528
+ },
529
+ )
530
+ return delay
531
+
532
+
533
+ # TODO: Needs unit testing for room ID + alias joins
534
+ class JoinRoomAliasServlet(ResolveRoomIdMixin, TransactionRestServlet):
535
+ CATEGORY = "Event sending requests"
536
+
537
+ def __init__(self, hs: "HomeServer"):
538
+ super().__init__(hs)
539
+ super(ResolveRoomIdMixin, self).__init__(hs) # ensure the Mixin is set up
540
+ self.auth = hs.get_auth()
541
+
542
+ def register(self, http_server: HttpServer) -> None:
543
+ # /join/$room_identifier[/$txn_id]
544
+ PATTERNS = "/join/(?P<room_identifier>[^/]*)"
545
+ register_txn_path(self, PATTERNS, http_server)
546
+
547
+ async def _do(
548
+ self,
549
+ request: SynapseRequest,
550
+ requester: Requester,
551
+ room_identifier: str,
552
+ txn_id: str | None,
553
+ ) -> tuple[int, JsonDict]:
554
+ content = parse_json_object_from_request(request, allow_empty_body=True)
555
+
556
+ # twisted.web.server.Request.args is incorrectly defined as Any | None
557
+ args: dict[bytes, list[bytes]] = request.args # type: ignore
558
+ # Prefer via over server_name (deprecated with MSC4156)
559
+ remote_room_hosts = parse_strings_from_args(args, "via", required=False)
560
+ if remote_room_hosts is None:
561
+ remote_room_hosts = parse_strings_from_args(
562
+ args, "server_name", required=False
563
+ )
564
+ room_id, remote_room_hosts = await self.resolve_room_id(
565
+ room_identifier,
566
+ remote_room_hosts,
567
+ )
568
+
569
+ await self.room_member_handler.update_membership(
570
+ requester=requester,
571
+ target=requester.user,
572
+ room_id=room_id,
573
+ action="join",
574
+ txn_id=txn_id,
575
+ remote_room_hosts=remote_room_hosts,
576
+ content=content,
577
+ third_party_signed=content.get("third_party_signed", None),
578
+ )
579
+
580
+ return 200, {"room_id": room_id}
581
+
582
+ async def on_POST(
583
+ self,
584
+ request: SynapseRequest,
585
+ room_identifier: str,
586
+ ) -> tuple[int, JsonDict]:
587
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
588
+ return await self._do(request, requester, room_identifier, None)
589
+
590
+ async def on_PUT(
591
+ self, request: SynapseRequest, room_identifier: str, txn_id: str
592
+ ) -> tuple[int, JsonDict]:
593
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
594
+ set_tag("txn_id", txn_id)
595
+
596
+ return await self.txns.fetch_or_execute_request(
597
+ request, requester, self._do, request, requester, room_identifier, txn_id
598
+ )
599
+
600
+
601
+ # TODO: Needs unit testing
602
+ class PublicRoomListRestServlet(RestServlet):
603
+ PATTERNS = client_patterns("/publicRooms$", v1=True)
604
+ CATEGORY = "Client API requests"
605
+
606
+ def __init__(self, hs: "HomeServer"):
607
+ super().__init__()
608
+ self.hs = hs
609
+ self.auth = hs.get_auth()
610
+
611
+ async def on_GET(self, request: SynapseRequest) -> tuple[int, JsonDict]:
612
+ server = parse_string(request, "server")
613
+
614
+ try:
615
+ await self.auth.get_user_by_req(request, allow_guest=True)
616
+ except InvalidClientCredentialsError as e:
617
+ # Option to allow servers to require auth when accessing
618
+ # /publicRooms via CS API. This is especially helpful in private
619
+ # federations.
620
+ if not self.hs.config.server.allow_public_rooms_without_auth:
621
+ raise
622
+
623
+ # We allow people to not be authed if they're just looking at our
624
+ # room list, but require auth when we proxy the request.
625
+ # In both cases we call the auth function, as that has the side
626
+ # effect of logging who issued this request if an access token was
627
+ # provided.
628
+ if server:
629
+ raise e
630
+
631
+ limit: int | None = parse_integer(request, "limit", 0)
632
+ since_token = parse_string(request, "since")
633
+
634
+ if limit == 0:
635
+ # zero is a special value which corresponds to no limit.
636
+ limit = None
637
+
638
+ handler = self.hs.get_room_list_handler()
639
+ if server and not self.hs.is_mine_server_name(server):
640
+ # Ensure the server is valid.
641
+ try:
642
+ parse_and_validate_server_name(server)
643
+ except ValueError:
644
+ raise SynapseError(
645
+ 400,
646
+ "Invalid server name: %s" % (server,),
647
+ Codes.INVALID_PARAM,
648
+ )
649
+
650
+ data = await handler.get_remote_public_room_list(
651
+ server, limit=limit, since_token=since_token
652
+ )
653
+ else:
654
+ data = await handler.get_local_public_room_list(
655
+ limit=limit, since_token=since_token
656
+ )
657
+
658
+ return 200, data
659
+
660
+ async def on_POST(self, request: SynapseRequest) -> tuple[int, JsonDict]:
661
+ await self.auth.get_user_by_req(request, allow_guest=True)
662
+
663
+ server = parse_string(request, "server")
664
+ content = parse_json_object_from_request(request)
665
+
666
+ limit: int | None = int(content.get("limit", 100))
667
+ since_token = content.get("since", None)
668
+ search_filter = content.get("filter", None)
669
+
670
+ include_all_networks = content.get("include_all_networks", False)
671
+ third_party_instance_id = content.get("third_party_instance_id", None)
672
+
673
+ if include_all_networks:
674
+ network_tuple = None
675
+ if third_party_instance_id is not None:
676
+ raise SynapseError(
677
+ 400, "Can't use include_all_networks with an explicit network"
678
+ )
679
+ elif third_party_instance_id is None:
680
+ network_tuple = ThirdPartyInstanceID(None, None)
681
+ else:
682
+ network_tuple = ThirdPartyInstanceID.from_string(third_party_instance_id)
683
+
684
+ if limit == 0:
685
+ # zero is a special value which corresponds to no limit.
686
+ limit = None
687
+
688
+ handler = self.hs.get_room_list_handler()
689
+ if server and not self.hs.is_mine_server_name(server):
690
+ # Ensure the server is valid.
691
+ try:
692
+ parse_and_validate_server_name(server)
693
+ except ValueError:
694
+ raise SynapseError(
695
+ 400,
696
+ "Invalid server name: %s" % (server,),
697
+ Codes.INVALID_PARAM,
698
+ )
699
+
700
+ data = await handler.get_remote_public_room_list(
701
+ server,
702
+ limit=limit,
703
+ since_token=since_token,
704
+ search_filter=search_filter,
705
+ include_all_networks=include_all_networks,
706
+ third_party_instance_id=third_party_instance_id,
707
+ )
708
+
709
+ else:
710
+ data = await handler.get_local_public_room_list(
711
+ limit=limit,
712
+ since_token=since_token,
713
+ search_filter=search_filter,
714
+ network_tuple=network_tuple,
715
+ )
716
+
717
+ return 200, data
718
+
719
+
720
+ # TODO: Needs unit testing
721
+ class RoomMemberListRestServlet(RestServlet):
722
+ PATTERNS = client_patterns("/rooms/(?P<room_id>[^/]*)/members$", v1=True)
723
+ CATEGORY = "Client API requests"
724
+
725
+ def __init__(self, hs: "HomeServer"):
726
+ super().__init__()
727
+ self.message_handler = hs.get_message_handler()
728
+ self.auth = hs.get_auth()
729
+ self.store = hs.get_datastores().main
730
+
731
+ @cancellable
732
+ async def on_GET(
733
+ self, request: SynapseRequest, room_id: str
734
+ ) -> tuple[int, JsonDict]:
735
+ # TODO support Pagination stream API (limit/tokens)
736
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
737
+ handler = self.message_handler
738
+
739
+ # request the state as of a given event, as identified by a stream token,
740
+ # for consistency with /messages etc.
741
+ # useful for getting the membership in retrospect as of a given /sync
742
+ # response.
743
+ at_token_string = parse_string(request, "at")
744
+ if at_token_string is None:
745
+ at_token = None
746
+ else:
747
+ at_token = await StreamToken.from_string(self.store, at_token_string)
748
+
749
+ # let you filter down on particular memberships.
750
+ # XXX: this may not be the best shape for this API - we could pass in a filter
751
+ # instead, except filters aren't currently aware of memberships.
752
+ # See https://github.com/matrix-org/matrix-doc/issues/1337 for more details.
753
+ membership = parse_string(request, "membership")
754
+ not_membership = parse_string(request, "not_membership")
755
+
756
+ events = await handler.get_state_events(
757
+ room_id=room_id,
758
+ requester=requester,
759
+ at_token=at_token,
760
+ state_filter=StateFilter.from_types([(EventTypes.Member, None)]),
761
+ )
762
+
763
+ chunk = []
764
+
765
+ for event in events:
766
+ if (membership and event["content"].get("membership") != membership) or (
767
+ not_membership and event["content"].get("membership") == not_membership
768
+ ):
769
+ continue
770
+ chunk.append(event)
771
+
772
+ return 200, {"chunk": chunk}
773
+
774
+
775
+ # deprecated in favour of /members?membership=join?
776
+ # except it does custom AS logic and has a simpler return format
777
+ class JoinedRoomMemberListRestServlet(RestServlet):
778
+ PATTERNS = client_patterns("/rooms/(?P<room_id>[^/]*)/joined_members$", v1=True)
779
+ CATEGORY = "Client API requests"
780
+
781
+ def __init__(self, hs: "HomeServer"):
782
+ super().__init__()
783
+ self.message_handler = hs.get_message_handler()
784
+ self.auth = hs.get_auth()
785
+
786
+ async def on_GET(
787
+ self, request: SynapseRequest, room_id: str
788
+ ) -> tuple[int, JsonDict]:
789
+ requester = await self.auth.get_user_by_req(request)
790
+
791
+ users_with_profile = await self.message_handler.get_joined_members(
792
+ requester, room_id
793
+ )
794
+
795
+ return 200, {"joined": users_with_profile}
796
+
797
+
798
+ @attr.s(slots=True, frozen=True, auto_attribs=True)
799
+ class SerializeMessagesDeps:
800
+ clock: Clock
801
+ event_serializer: EventClientSerializer
802
+ store: DataStore
803
+
804
+
805
+ @trace
806
+ async def encode_messages_response(
807
+ *,
808
+ get_messages_result: GetMessagesResult,
809
+ serialize_options: SerializeEventConfig,
810
+ serialize_deps: SerializeMessagesDeps,
811
+ ) -> JsonDict:
812
+ """
813
+ Serialize a `GetMessagesResult` into the JSON response format for the `/messages`
814
+ endpoint.
815
+
816
+ This logic is shared between the client API and Synapse admin API.
817
+ """
818
+
819
+ time_now = serialize_deps.clock.time_msec()
820
+
821
+ serialized_result = {
822
+ "chunk": (
823
+ await serialize_deps.event_serializer.serialize_events(
824
+ get_messages_result.messages_chunk,
825
+ time_now,
826
+ config=serialize_options,
827
+ bundle_aggregations=get_messages_result.bundled_aggregations,
828
+ )
829
+ ),
830
+ "start": await get_messages_result.start_token.to_string(serialize_deps.store),
831
+ }
832
+
833
+ if get_messages_result.end_token is not None:
834
+ serialized_result["end"] = await get_messages_result.end_token.to_string(
835
+ serialize_deps.store
836
+ )
837
+
838
+ if get_messages_result.state is not None:
839
+ serialized_result[
840
+ "state"
841
+ ] = await serialize_deps.event_serializer.serialize_events(
842
+ get_messages_result.state, time_now, config=serialize_options
843
+ )
844
+
845
+ return serialized_result
846
+
847
+
848
+ # TODO: Needs better unit testing
849
+ class RoomMessageListRestServlet(RestServlet):
850
+ PATTERNS = client_patterns("/rooms/(?P<room_id>[^/]*)/messages$", v1=True)
851
+ # TODO The routing information should be exposed programatically.
852
+ # I want to do this but for now I felt bad about leaving this without
853
+ # at least a visible warning on it.
854
+ CATEGORY = "Client API requests (ALL FOR SAME ROOM MUST GO TO SAME WORKER)"
855
+
856
+ def __init__(self, hs: "HomeServer"):
857
+ super().__init__()
858
+ self._hs = hs
859
+ self.server_name = hs.hostname
860
+ self.clock = hs.get_clock()
861
+ self.pagination_handler = hs.get_pagination_handler()
862
+ self.auth = hs.get_auth()
863
+ self.store = hs.get_datastores().main
864
+ self.event_serializer = hs.get_event_client_serializer()
865
+
866
+ async def on_GET(
867
+ self, request: SynapseRequest, room_id: str
868
+ ) -> tuple[int, JsonDict]:
869
+ processing_start_time = self.clock.time_msec()
870
+ # Fire off and hope that we get a result by the end.
871
+ #
872
+ # We're using the mypy type ignore comment because the `@cached`
873
+ # decorator on `get_number_joined_users_in_room` doesn't play well with
874
+ # the type system. Maybe in the future, it can use some ParamSpec
875
+ # wizardry to fix it up.
876
+ room_member_count_deferred = run_in_background( # type: ignore[call-overload]
877
+ self.store.get_number_joined_users_in_room,
878
+ room_id,
879
+ )
880
+
881
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
882
+ pagination_config = await PaginationConfig.from_request(
883
+ self.store, request, default_limit=10
884
+ )
885
+ # Twisted will have processed the args by now.
886
+ assert request.args is not None
887
+
888
+ filter_json = parse_json(request, "filter", encoding="utf-8")
889
+ event_filter = Filter(self._hs, filter_json) if filter_json else None
890
+
891
+ as_client_event = b"raw" not in request.args
892
+ if (
893
+ event_filter
894
+ and event_filter.filter_json.get("event_format", "client") == "federation"
895
+ ):
896
+ as_client_event = False
897
+
898
+ serialize_options = SerializeEventConfig(
899
+ as_client_event=as_client_event, requester=requester
900
+ )
901
+
902
+ get_messages_result = await self.pagination_handler.get_messages(
903
+ room_id=room_id,
904
+ requester=requester,
905
+ pagin_config=pagination_config,
906
+ as_client_event=as_client_event,
907
+ event_filter=event_filter,
908
+ )
909
+
910
+ # Useful for debugging timeline/pagination issues. For example, if a client
911
+ # isn't seeing the full history, we can check the homeserver logs to see if the
912
+ # client just never made the next request with the given `end` token.
913
+ logger.info(
914
+ "Responding to `/messages` request: {%s} %s %s -> %d messages with end_token=%s",
915
+ requester.user.to_string(),
916
+ request.get_method(),
917
+ request.get_redacted_uri(),
918
+ len(get_messages_result.messages_chunk),
919
+ (await get_messages_result.end_token.to_string(self.store))
920
+ if get_messages_result.end_token
921
+ else None,
922
+ )
923
+
924
+ response_content = await self.encode_response(
925
+ get_messages_result, serialize_options
926
+ )
927
+
928
+ processing_end_time = self.clock.time_msec()
929
+ room_member_count = await make_deferred_yieldable(room_member_count_deferred)
930
+ messsages_response_timer.labels(
931
+ room_size=_RoomSize.from_member_count(room_member_count),
932
+ **{SERVER_NAME_LABEL: self.server_name},
933
+ ).observe((processing_end_time - processing_start_time) / 1000)
934
+
935
+ return 200, response_content
936
+
937
+ @trace
938
+ async def encode_response(
939
+ self,
940
+ get_messages_result: GetMessagesResult,
941
+ serialize_options: SerializeEventConfig,
942
+ ) -> JsonDict:
943
+ return await encode_messages_response(
944
+ get_messages_result=get_messages_result,
945
+ serialize_options=serialize_options,
946
+ serialize_deps=SerializeMessagesDeps(
947
+ clock=self.clock,
948
+ event_serializer=self.event_serializer,
949
+ store=self.store,
950
+ ),
951
+ )
952
+
953
+
954
+ # TODO: Needs unit testing
955
+ class RoomStateRestServlet(RestServlet):
956
+ PATTERNS = client_patterns("/rooms/(?P<room_id>[^/]*)/state$", v1=True)
957
+ CATEGORY = "Client API requests"
958
+
959
+ def __init__(self, hs: "HomeServer"):
960
+ super().__init__()
961
+ self.message_handler = hs.get_message_handler()
962
+ self.auth = hs.get_auth()
963
+
964
+ @cancellable
965
+ async def on_GET(
966
+ self, request: SynapseRequest, room_id: str
967
+ ) -> tuple[int, list[JsonDict]]:
968
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
969
+ # Get all the current state for this room
970
+ events = await self.message_handler.get_state_events(
971
+ room_id=room_id,
972
+ requester=requester,
973
+ )
974
+ return 200, events
975
+
976
+
977
+ # TODO: Needs unit testing
978
+ class RoomInitialSyncRestServlet(RestServlet):
979
+ PATTERNS = client_patterns("/rooms/(?P<room_id>[^/]*)/initialSync$", v1=True)
980
+ CATEGORY = "Sync requests"
981
+
982
+ def __init__(self, hs: "HomeServer"):
983
+ super().__init__()
984
+ self.initial_sync_handler = hs.get_initial_sync_handler()
985
+ self.auth = hs.get_auth()
986
+ self.store = hs.get_datastores().main
987
+
988
+ async def on_GET(
989
+ self, request: SynapseRequest, room_id: str
990
+ ) -> tuple[int, JsonDict]:
991
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
992
+ pagination_config = await PaginationConfig.from_request(
993
+ self.store, request, default_limit=10
994
+ )
995
+ content = await self.initial_sync_handler.room_initial_sync(
996
+ room_id=room_id, requester=requester, pagin_config=pagination_config
997
+ )
998
+ return 200, content
999
+
1000
+
1001
+ class RoomEventServlet(RestServlet):
1002
+ PATTERNS = client_patterns(
1003
+ "/rooms/(?P<room_id>[^/]*)/event/(?P<event_id>[^/]*)$", v1=True
1004
+ )
1005
+ CATEGORY = "Client API requests"
1006
+
1007
+ def __init__(self, hs: "HomeServer"):
1008
+ super().__init__()
1009
+ self.clock = hs.get_clock()
1010
+ self._store = hs.get_datastores().main
1011
+ self._state = hs.get_state_handler()
1012
+ self._storage_controllers = hs.get_storage_controllers()
1013
+ self.event_handler = hs.get_event_handler()
1014
+ self._event_serializer = hs.get_event_client_serializer()
1015
+ self._relations_handler = hs.get_relations_handler()
1016
+ self.auth = hs.get_auth()
1017
+ self.content_keep_ms = hs.config.server.redaction_retention_period
1018
+ self.msc2815_enabled = hs.config.experimental.msc2815_enabled
1019
+
1020
+ async def on_GET(
1021
+ self, request: SynapseRequest, room_id: str, event_id: str
1022
+ ) -> tuple[int, JsonDict]:
1023
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
1024
+
1025
+ include_unredacted_content = self.msc2815_enabled and (
1026
+ parse_string(
1027
+ request,
1028
+ "fi.mau.msc2815.include_unredacted_content",
1029
+ allowed_values=("true", "false"),
1030
+ )
1031
+ == "true"
1032
+ )
1033
+ if include_unredacted_content and not await self.auth.is_server_admin(
1034
+ requester
1035
+ ):
1036
+ auth_events = await self._storage_controllers.state.get_current_state(
1037
+ room_id,
1038
+ StateFilter.from_types(
1039
+ [
1040
+ POWER_KEY,
1041
+ CREATE_KEY,
1042
+ ]
1043
+ ),
1044
+ )
1045
+
1046
+ redact_level = event_auth.get_named_level(auth_events, "redact", 50)
1047
+ user_level = event_auth.get_user_power_level(
1048
+ requester.user.to_string(), auth_events
1049
+ )
1050
+ if user_level < redact_level:
1051
+ raise SynapseError(
1052
+ 403,
1053
+ "You don't have permission to view redacted events in this room.",
1054
+ errcode=Codes.FORBIDDEN,
1055
+ )
1056
+
1057
+ try:
1058
+ event = await self.event_handler.get_event(
1059
+ requester.user,
1060
+ room_id,
1061
+ event_id,
1062
+ show_redacted=include_unredacted_content,
1063
+ )
1064
+ except AuthError:
1065
+ # This endpoint is supposed to return a 404 when the requester does
1066
+ # not have permission to access the event
1067
+ # https://matrix.org/docs/spec/client_server/r0.5.0#get-matrix-client-r0-rooms-roomid-event-eventid
1068
+ raise SynapseError(404, "Event not found.", errcode=Codes.NOT_FOUND)
1069
+
1070
+ if event:
1071
+ if include_unredacted_content and await self._store.have_censored_event(
1072
+ event_id
1073
+ ):
1074
+ raise UnredactedContentDeletedError(self.content_keep_ms)
1075
+
1076
+ # Ensure there are bundled aggregations available.
1077
+ aggregations = await self._relations_handler.get_bundled_aggregations(
1078
+ [event], requester.user.to_string()
1079
+ )
1080
+
1081
+ # per MSC2676, /rooms/{roomId}/event/{eventId}, should return the
1082
+ # *original* event, rather than the edited version
1083
+ event_dict = await self._event_serializer.serialize_event(
1084
+ event,
1085
+ self.clock.time_msec(),
1086
+ bundle_aggregations=aggregations,
1087
+ config=SerializeEventConfig(requester=requester),
1088
+ )
1089
+ return 200, event_dict
1090
+
1091
+ raise SynapseError(404, "Event not found.", errcode=Codes.NOT_FOUND)
1092
+
1093
+
1094
+ class RoomEventContextServlet(RestServlet):
1095
+ PATTERNS = client_patterns(
1096
+ "/rooms/(?P<room_id>[^/]*)/context/(?P<event_id>[^/]*)$", v1=True
1097
+ )
1098
+ CATEGORY = "Client API requests"
1099
+
1100
+ def __init__(self, hs: "HomeServer"):
1101
+ super().__init__()
1102
+ self._hs = hs
1103
+ self.clock = hs.get_clock()
1104
+ self.room_context_handler = hs.get_room_context_handler()
1105
+ self._event_serializer = hs.get_event_client_serializer()
1106
+ self.auth = hs.get_auth()
1107
+
1108
+ async def on_GET(
1109
+ self, request: SynapseRequest, room_id: str, event_id: str
1110
+ ) -> tuple[int, JsonDict]:
1111
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
1112
+
1113
+ limit = parse_integer(request, "limit", default=10)
1114
+
1115
+ # picking the API shape for symmetry with /messages
1116
+ filter_json = parse_json(request, "filter", encoding="utf-8")
1117
+ event_filter = Filter(self._hs, filter_json) if filter_json else None
1118
+
1119
+ event_context = await self.room_context_handler.get_event_context(
1120
+ requester, room_id, event_id, limit, event_filter
1121
+ )
1122
+
1123
+ if not event_context:
1124
+ raise SynapseError(404, "Event not found.", errcode=Codes.NOT_FOUND)
1125
+
1126
+ time_now = self.clock.time_msec()
1127
+ serializer_options = SerializeEventConfig(requester=requester)
1128
+ results = {
1129
+ "events_before": await self._event_serializer.serialize_events(
1130
+ event_context.events_before,
1131
+ time_now,
1132
+ bundle_aggregations=event_context.aggregations,
1133
+ config=serializer_options,
1134
+ ),
1135
+ "event": await self._event_serializer.serialize_event(
1136
+ event_context.event,
1137
+ time_now,
1138
+ bundle_aggregations=event_context.aggregations,
1139
+ config=serializer_options,
1140
+ ),
1141
+ "events_after": await self._event_serializer.serialize_events(
1142
+ event_context.events_after,
1143
+ time_now,
1144
+ bundle_aggregations=event_context.aggregations,
1145
+ config=serializer_options,
1146
+ ),
1147
+ "state": await self._event_serializer.serialize_events(
1148
+ event_context.state,
1149
+ time_now,
1150
+ config=serializer_options,
1151
+ ),
1152
+ "start": event_context.start,
1153
+ "end": event_context.end,
1154
+ }
1155
+
1156
+ return 200, results
1157
+
1158
+
1159
+ class RoomForgetRestServlet(TransactionRestServlet):
1160
+ def __init__(self, hs: "HomeServer"):
1161
+ super().__init__(hs)
1162
+ self.room_member_handler = hs.get_room_member_handler()
1163
+ self.auth = hs.get_auth()
1164
+
1165
+ def register(self, http_server: HttpServer) -> None:
1166
+ PATTERNS = "/rooms/(?P<room_id>[^/]*)/forget"
1167
+ register_txn_path(self, PATTERNS, http_server)
1168
+
1169
+ async def _do(self, requester: Requester, room_id: str) -> tuple[int, JsonDict]:
1170
+ await self.room_member_handler.forget(user=requester.user, room_id=room_id)
1171
+
1172
+ return 200, {}
1173
+
1174
+ async def on_POST(
1175
+ self, request: SynapseRequest, room_id: str
1176
+ ) -> tuple[int, JsonDict]:
1177
+ requester = await self.auth.get_user_by_req(request, allow_guest=False)
1178
+ return await self._do(requester, room_id)
1179
+
1180
+ async def on_PUT(
1181
+ self, request: SynapseRequest, room_id: str, txn_id: str
1182
+ ) -> tuple[int, JsonDict]:
1183
+ requester = await self.auth.get_user_by_req(request, allow_guest=False)
1184
+ set_tag("txn_id", txn_id)
1185
+
1186
+ return await self.txns.fetch_or_execute_request(
1187
+ request, requester, self._do, requester, room_id
1188
+ )
1189
+
1190
+
1191
+ # TODO: Needs unit testing
1192
+ class RoomMembershipRestServlet(TransactionRestServlet):
1193
+ CATEGORY = "Event sending requests"
1194
+
1195
+ def __init__(self, hs: "HomeServer"):
1196
+ super().__init__(hs)
1197
+ self.room_member_handler = hs.get_room_member_handler()
1198
+ self.auth = hs.get_auth()
1199
+ self.config = hs.config
1200
+
1201
+ def register(self, http_server: HttpServer) -> None:
1202
+ # /rooms/$roomid/[join|invite|leave|ban|unban|kick]
1203
+ PATTERNS = (
1204
+ "/rooms/(?P<room_id>[^/]*)/"
1205
+ "(?P<membership_action>join|invite|leave|ban|unban|kick)"
1206
+ )
1207
+ register_txn_path(self, PATTERNS, http_server)
1208
+
1209
+ async def _do(
1210
+ self,
1211
+ request: SynapseRequest,
1212
+ requester: Requester,
1213
+ room_id: str,
1214
+ membership_action: str,
1215
+ txn_id: str | None,
1216
+ ) -> tuple[int, JsonDict]:
1217
+ if requester.is_guest and membership_action not in {
1218
+ Membership.JOIN,
1219
+ Membership.LEAVE,
1220
+ }:
1221
+ raise AuthError(403, "Guest access not allowed")
1222
+
1223
+ request_body = parse_json_object_from_request(request, allow_empty_body=True)
1224
+
1225
+ if membership_action == "invite" and all(
1226
+ key in request_body for key in ("medium", "address")
1227
+ ):
1228
+ if not all(key in request_body for key in ("id_server", "id_access_token")):
1229
+ raise SynapseError(
1230
+ HTTPStatus.BAD_REQUEST,
1231
+ "`id_server` and `id_access_token` are required when doing 3pid invite",
1232
+ Codes.MISSING_PARAM,
1233
+ )
1234
+
1235
+ try:
1236
+ await self.room_member_handler.do_3pid_invite(
1237
+ room_id,
1238
+ requester.user,
1239
+ request_body["medium"],
1240
+ request_body["address"],
1241
+ request_body["id_server"],
1242
+ requester,
1243
+ txn_id,
1244
+ request_body["id_access_token"],
1245
+ )
1246
+ except ShadowBanError:
1247
+ # Pretend the request succeeded.
1248
+ pass
1249
+ return 200, {}
1250
+
1251
+ target = requester.user
1252
+ if membership_action in ["invite", "ban", "unban", "kick"]:
1253
+ assert_params_in_dict(request_body, ["user_id"])
1254
+ target = UserID.from_string(request_body["user_id"])
1255
+
1256
+ event_content = None
1257
+ if "reason" in request_body:
1258
+ event_content = {"reason": request_body["reason"]}
1259
+ if self.config.experimental.msc4293_enabled:
1260
+ if "org.matrix.msc4293.redact_events" in request_body:
1261
+ if event_content is None:
1262
+ event_content = {}
1263
+ event_content["org.matrix.msc4293.redact_events"] = request_body[
1264
+ "org.matrix.msc4293.redact_events"
1265
+ ]
1266
+
1267
+ try:
1268
+ await self.room_member_handler.update_membership(
1269
+ requester=requester,
1270
+ target=target,
1271
+ room_id=room_id,
1272
+ action=membership_action,
1273
+ txn_id=txn_id,
1274
+ third_party_signed=request_body.get("third_party_signed", None),
1275
+ content=event_content,
1276
+ )
1277
+ except ShadowBanError:
1278
+ # Pretend the request succeeded.
1279
+ pass
1280
+
1281
+ return_value = {}
1282
+
1283
+ if membership_action == "join":
1284
+ return_value["room_id"] = room_id
1285
+
1286
+ return 200, return_value
1287
+
1288
+ async def on_POST(
1289
+ self,
1290
+ request: SynapseRequest,
1291
+ room_id: str,
1292
+ membership_action: str,
1293
+ ) -> tuple[int, JsonDict]:
1294
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
1295
+ return await self._do(request, requester, room_id, membership_action, None)
1296
+
1297
+ async def on_PUT(
1298
+ self, request: SynapseRequest, room_id: str, membership_action: str, txn_id: str
1299
+ ) -> tuple[int, JsonDict]:
1300
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
1301
+ set_tag("txn_id", txn_id)
1302
+
1303
+ return await self.txns.fetch_or_execute_request(
1304
+ request,
1305
+ requester,
1306
+ self._do,
1307
+ request,
1308
+ requester,
1309
+ room_id,
1310
+ membership_action,
1311
+ txn_id,
1312
+ )
1313
+
1314
+
1315
+ class RoomRedactEventRestServlet(TransactionRestServlet):
1316
+ CATEGORY = "Event sending requests"
1317
+
1318
+ def __init__(self, hs: "HomeServer"):
1319
+ super().__init__(hs)
1320
+ self.server_name = hs.hostname
1321
+ self.hs = hs
1322
+ self.event_creation_handler = hs.get_event_creation_handler()
1323
+ self.auth = hs.get_auth()
1324
+ self._store = hs.get_datastores().main
1325
+ self._relation_handler = hs.get_relations_handler()
1326
+ self._msc3912_enabled = hs.config.experimental.msc3912_enabled
1327
+
1328
+ def register(self, http_server: HttpServer) -> None:
1329
+ PATTERNS = "/rooms/(?P<room_id>[^/]*)/redact/(?P<event_id>[^/]*)"
1330
+ register_txn_path(self, PATTERNS, http_server)
1331
+
1332
+ async def _do(
1333
+ self,
1334
+ request: SynapseRequest,
1335
+ requester: Requester,
1336
+ room_id: str,
1337
+ event_id: str,
1338
+ txn_id: str | None,
1339
+ ) -> tuple[int, JsonDict]:
1340
+ content = parse_json_object_from_request(request)
1341
+
1342
+ requester_suspended = await self._store.get_user_suspended_status(
1343
+ requester.user.to_string()
1344
+ )
1345
+
1346
+ if requester_suspended:
1347
+ event = await self._store.get_event(event_id, allow_none=True)
1348
+ if event:
1349
+ if event.sender != requester.user.to_string():
1350
+ raise SynapseError(
1351
+ 403,
1352
+ "You can only redact your own events while account is suspended.",
1353
+ Codes.USER_ACCOUNT_SUSPENDED,
1354
+ )
1355
+
1356
+ # Ensure the redacts property in the content matches the one provided in
1357
+ # the URL.
1358
+ room_version = await self._store.get_room_version(room_id)
1359
+ if room_version.updated_redaction_rules:
1360
+ if "redacts" in content and content["redacts"] != event_id:
1361
+ raise SynapseError(
1362
+ 400,
1363
+ "Cannot provide a redacts value incoherent with the event_id of the URL parameter",
1364
+ Codes.INVALID_PARAM,
1365
+ )
1366
+ else:
1367
+ content["redacts"] = event_id
1368
+
1369
+ try:
1370
+ with_relations = None
1371
+ if self._msc3912_enabled and "org.matrix.msc3912.with_relations" in content:
1372
+ with_relations = content["org.matrix.msc3912.with_relations"]
1373
+ del content["org.matrix.msc3912.with_relations"]
1374
+
1375
+ # Check if there's an existing event for this transaction now (even though
1376
+ # create_and_send_nonmember_event also does it) because, if there's one,
1377
+ # then we want to skip the call to redact_events_related_to.
1378
+ event = None
1379
+ if txn_id:
1380
+ event = await self.event_creation_handler.get_event_from_transaction(
1381
+ requester, txn_id, room_id
1382
+ )
1383
+
1384
+ # Event is not yet redacted, create a new event to redact it.
1385
+ if event is None:
1386
+ event_dict = {
1387
+ "type": EventTypes.Redaction,
1388
+ "content": content,
1389
+ "room_id": room_id,
1390
+ "sender": requester.user.to_string(),
1391
+ }
1392
+ # Earlier room versions had a top-level redacts property.
1393
+ if not room_version.updated_redaction_rules:
1394
+ event_dict["redacts"] = event_id
1395
+
1396
+ (
1397
+ event,
1398
+ _,
1399
+ ) = await self.event_creation_handler.create_and_send_nonmember_event(
1400
+ requester, event_dict, txn_id=txn_id
1401
+ )
1402
+
1403
+ if with_relations:
1404
+ self.hs.run_as_background_process(
1405
+ "redact_related_events",
1406
+ self._relation_handler.redact_events_related_to,
1407
+ requester=requester,
1408
+ event_id=event_id,
1409
+ initial_redaction_event=event,
1410
+ relation_types=with_relations,
1411
+ )
1412
+
1413
+ event_id = event.event_id
1414
+ except ShadowBanError:
1415
+ event_id = generate_fake_event_id()
1416
+
1417
+ set_tag("event_id", event_id)
1418
+ return 200, {"event_id": event_id}
1419
+
1420
+ async def on_POST(
1421
+ self,
1422
+ request: SynapseRequest,
1423
+ room_id: str,
1424
+ event_id: str,
1425
+ ) -> tuple[int, JsonDict]:
1426
+ requester = await self.auth.get_user_by_req(request)
1427
+ return await self._do(request, requester, room_id, event_id, None)
1428
+
1429
+ async def on_PUT(
1430
+ self, request: SynapseRequest, room_id: str, event_id: str, txn_id: str
1431
+ ) -> tuple[int, JsonDict]:
1432
+ requester = await self.auth.get_user_by_req(request)
1433
+ set_tag("txn_id", txn_id)
1434
+
1435
+ return await self.txns.fetch_or_execute_request(
1436
+ request, requester, self._do, request, requester, room_id, event_id, txn_id
1437
+ )
1438
+
1439
+
1440
+ class RoomTypingRestServlet(RestServlet):
1441
+ PATTERNS = client_patterns(
1442
+ "/rooms/(?P<room_id>[^/]*)/typing/(?P<user_id>[^/]*)$", v1=True
1443
+ )
1444
+ CATEGORY = "The typing stream"
1445
+
1446
+ def __init__(self, hs: "HomeServer"):
1447
+ super().__init__()
1448
+ self.hs = hs
1449
+ self.presence_handler = hs.get_presence_handler()
1450
+ self.auth = hs.get_auth()
1451
+
1452
+ # If we're not on the typing writer instance we should scream if we get
1453
+ # requests.
1454
+ self._is_typing_writer = (
1455
+ hs.get_instance_name() in hs.config.worker.writers.typing
1456
+ )
1457
+
1458
+ async def on_PUT(
1459
+ self, request: SynapseRequest, room_id: str, user_id: str
1460
+ ) -> tuple[int, JsonDict]:
1461
+ requester = await self.auth.get_user_by_req(request)
1462
+
1463
+ if not self._is_typing_writer:
1464
+ raise Exception("Got /typing request on instance that is not typing writer")
1465
+
1466
+ room_id = urlparse.unquote(room_id)
1467
+ target_user = UserID.from_string(urlparse.unquote(user_id))
1468
+
1469
+ content = parse_json_object_from_request(request)
1470
+
1471
+ await self.presence_handler.bump_presence_active_time(
1472
+ requester.user, requester.device_id
1473
+ )
1474
+
1475
+ # Limit timeout to stop people from setting silly typing timeouts.
1476
+ timeout = min(content.get("timeout", 30000), 120000)
1477
+
1478
+ # Defer getting the typing handler since it will raise on WORKER_PATTERNS.
1479
+ typing_handler = self.hs.get_typing_writer_handler()
1480
+
1481
+ try:
1482
+ if content["typing"]:
1483
+ await typing_handler.started_typing(
1484
+ target_user=target_user,
1485
+ requester=requester,
1486
+ room_id=room_id,
1487
+ timeout=timeout,
1488
+ )
1489
+ else:
1490
+ await typing_handler.stopped_typing(
1491
+ target_user=target_user, requester=requester, room_id=room_id
1492
+ )
1493
+ except ShadowBanError:
1494
+ # Pretend this worked without error.
1495
+ pass
1496
+
1497
+ return 200, {}
1498
+
1499
+
1500
+ class RoomAliasListServlet(RestServlet):
1501
+ PATTERNS = [
1502
+ re.compile(
1503
+ r"^/_matrix/client/unstable/org\.matrix\.msc2432"
1504
+ r"/rooms/(?P<room_id>[^/]*)/aliases"
1505
+ ),
1506
+ ] + list(client_patterns("/rooms/(?P<room_id>[^/]*)/aliases$", unstable=False))
1507
+ CATEGORY = "Client API requests"
1508
+
1509
+ def __init__(self, hs: "HomeServer"):
1510
+ super().__init__()
1511
+ self.auth = hs.get_auth()
1512
+ self.directory_handler = hs.get_directory_handler()
1513
+
1514
+ async def on_GET(
1515
+ self, request: SynapseRequest, room_id: str
1516
+ ) -> tuple[int, JsonDict]:
1517
+ requester = await self.auth.get_user_by_req(request)
1518
+
1519
+ alias_list = await self.directory_handler.get_aliases_for_room(
1520
+ requester, room_id
1521
+ )
1522
+
1523
+ return 200, {"aliases": alias_list}
1524
+
1525
+
1526
+ class SearchRestServlet(RestServlet):
1527
+ PATTERNS = client_patterns("/search$", v1=True)
1528
+ CATEGORY = "Client API requests"
1529
+
1530
+ def __init__(self, hs: "HomeServer"):
1531
+ super().__init__()
1532
+ self.search_handler = hs.get_search_handler()
1533
+ self.auth = hs.get_auth()
1534
+
1535
+ async def on_POST(self, request: SynapseRequest) -> tuple[int, JsonDict]:
1536
+ requester = await self.auth.get_user_by_req(request)
1537
+
1538
+ content = parse_json_object_from_request(request)
1539
+
1540
+ batch = parse_string(request, "next_batch")
1541
+ results = await self.search_handler.search(requester, content, batch)
1542
+
1543
+ return 200, results
1544
+
1545
+
1546
+ class JoinedRoomsRestServlet(RestServlet):
1547
+ PATTERNS = client_patterns("/joined_rooms$", v1=True)
1548
+ CATEGORY = "Client API requests"
1549
+
1550
+ def __init__(self, hs: "HomeServer"):
1551
+ super().__init__()
1552
+ self.store = hs.get_datastores().main
1553
+ self.auth = hs.get_auth()
1554
+
1555
+ async def on_GET(self, request: SynapseRequest) -> tuple[int, JsonDict]:
1556
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
1557
+
1558
+ room_ids = await self.store.get_rooms_for_user(requester.user.to_string())
1559
+ return 200, {"joined_rooms": list(room_ids)}
1560
+
1561
+
1562
+ def register_txn_path(
1563
+ servlet: RestServlet,
1564
+ regex_string: str,
1565
+ http_server: HttpServer,
1566
+ ) -> None:
1567
+ """Registers a transaction-based path.
1568
+
1569
+ This registers two paths:
1570
+ PUT regex_string/$txnid
1571
+ POST regex_string
1572
+
1573
+ Args:
1574
+ regex_string: The regex string to register. Must NOT have a
1575
+ trailing $ as this string will be appended to.
1576
+ http_server: The http_server to register paths with.
1577
+ """
1578
+ on_POST = getattr(servlet, "on_POST", None)
1579
+ on_PUT = getattr(servlet, "on_PUT", None)
1580
+ if on_POST is None or on_PUT is None:
1581
+ raise RuntimeError("on_POST and on_PUT must exist when using register_txn_path")
1582
+ http_server.register_paths(
1583
+ "POST",
1584
+ client_patterns(regex_string + "$", v1=True),
1585
+ on_POST,
1586
+ servlet.__class__.__name__,
1587
+ )
1588
+ http_server.register_paths(
1589
+ "PUT",
1590
+ client_patterns(regex_string + "/(?P<txn_id>[^/]*)$", v1=True),
1591
+ on_PUT,
1592
+ servlet.__class__.__name__,
1593
+ )
1594
+
1595
+
1596
+ class TimestampLookupRestServlet(RestServlet):
1597
+ """
1598
+ API endpoint to fetch the `event_id` of the closest event to the given
1599
+ timestamp (`ts` query parameter) in the given direction (`dir` query
1600
+ parameter).
1601
+
1602
+ Useful for cases like jump to date so you can start paginating messages from
1603
+ a given date in the archive.
1604
+
1605
+ `ts` is a timestamp in milliseconds where we will find the closest event in
1606
+ the given direction.
1607
+
1608
+ `dir` can be `f` or `b` to indicate forwards and backwards in time from the
1609
+ given timestamp.
1610
+
1611
+ GET /_matrix/client/v1/rooms/<roomID>/timestamp_to_event?ts=<timestamp>&dir=<direction>
1612
+ {
1613
+ "event_id": ...
1614
+ }
1615
+ """
1616
+
1617
+ PATTERNS = (
1618
+ re.compile("^/_matrix/client/v1/rooms/(?P<room_id>[^/]*)/timestamp_to_event$"),
1619
+ )
1620
+ CATEGORY = "Client API requests"
1621
+
1622
+ def __init__(self, hs: "HomeServer"):
1623
+ super().__init__()
1624
+ self._auth = hs.get_auth()
1625
+ self._store = hs.get_datastores().main
1626
+ self.timestamp_lookup_handler = hs.get_timestamp_lookup_handler()
1627
+
1628
+ async def on_GET(
1629
+ self, request: SynapseRequest, room_id: str
1630
+ ) -> tuple[int, JsonDict]:
1631
+ requester = await self._auth.get_user_by_req(request)
1632
+ await self._auth.check_user_in_room_or_world_readable(room_id, requester)
1633
+
1634
+ timestamp = parse_integer(request, "ts", required=True)
1635
+ direction = parse_enum(request, "dir", Direction, default=Direction.FORWARDS)
1636
+
1637
+ (
1638
+ event_id,
1639
+ origin_server_ts,
1640
+ ) = await self.timestamp_lookup_handler.get_event_for_timestamp(
1641
+ requester, room_id, timestamp, direction
1642
+ )
1643
+
1644
+ return 200, {
1645
+ "event_id": event_id,
1646
+ "origin_server_ts": origin_server_ts,
1647
+ }
1648
+
1649
+
1650
+ class RoomHierarchyRestServlet(RestServlet):
1651
+ PATTERNS = (re.compile("^/_matrix/client/v1/rooms/(?P<room_id>[^/]*)/hierarchy$"),)
1652
+ WORKERS = PATTERNS
1653
+ CATEGORY = "Client API requests"
1654
+
1655
+ def __init__(self, hs: "HomeServer"):
1656
+ super().__init__()
1657
+ self._auth = hs.get_auth()
1658
+ self._room_summary_handler = hs.get_room_summary_handler()
1659
+ self.msc4235_enabled = hs.config.experimental.msc4235_enabled
1660
+
1661
+ async def on_GET(
1662
+ self, request: SynapseRequest, room_id: str
1663
+ ) -> tuple[int, JsonDict]:
1664
+ requester = await self._auth.get_user_by_req(request, allow_guest=True)
1665
+
1666
+ max_depth = parse_integer(request, "max_depth")
1667
+ limit = parse_integer(request, "limit")
1668
+
1669
+ # twisted.web.server.Request.args is incorrectly defined as Any | None
1670
+ remote_room_hosts = None
1671
+ if self.msc4235_enabled:
1672
+ args: dict[bytes, list[bytes]] = request.args # type: ignore
1673
+ via_param = parse_strings_from_args(
1674
+ args, "org.matrix.msc4235.via", required=False
1675
+ )
1676
+ remote_room_hosts = tuple(via_param or [])
1677
+
1678
+ return 200, await self._room_summary_handler.get_room_hierarchy(
1679
+ requester,
1680
+ room_id,
1681
+ suggested_only=parse_boolean(request, "suggested_only", default=False),
1682
+ max_depth=max_depth,
1683
+ limit=limit,
1684
+ from_token=parse_string(request, "from"),
1685
+ remote_room_hosts=remote_room_hosts,
1686
+ )
1687
+
1688
+
1689
+ class RoomSummaryRestServlet(ResolveRoomIdMixin, RestServlet):
1690
+ PATTERNS = (
1691
+ # deprecated endpoint, to be removed
1692
+ re.compile(
1693
+ "^/_matrix/client/unstable/im.nheko.summary"
1694
+ "/rooms/(?P<room_identifier>[^/]*)/summary$"
1695
+ ),
1696
+ # recommended endpoint
1697
+ re.compile(
1698
+ "^/_matrix/client/unstable/im.nheko.summary"
1699
+ "/summary/(?P<room_identifier>[^/]*)$"
1700
+ ),
1701
+ )
1702
+ CATEGORY = "Client API requests"
1703
+
1704
+ def __init__(self, hs: "HomeServer"):
1705
+ super().__init__(hs)
1706
+ self._auth = hs.get_auth()
1707
+ self._room_summary_handler = hs.get_room_summary_handler()
1708
+
1709
+ async def on_GET(
1710
+ self, request: SynapseRequest, room_identifier: str
1711
+ ) -> tuple[int, JsonDict]:
1712
+ try:
1713
+ requester = await self._auth.get_user_by_req(request, allow_guest=True)
1714
+ requester_user_id: str | None = requester.user.to_string()
1715
+ except MissingClientTokenError:
1716
+ # auth is optional
1717
+ requester_user_id = None
1718
+
1719
+ # twisted.web.server.Request.args is incorrectly defined as Any | None
1720
+ args: dict[bytes, list[bytes]] = request.args # type: ignore
1721
+ remote_room_hosts = parse_strings_from_args(args, "via", required=False)
1722
+ room_id, remote_room_hosts = await self.resolve_room_id(
1723
+ room_identifier,
1724
+ remote_room_hosts,
1725
+ )
1726
+
1727
+ return 200, await self._room_summary_handler.get_room_summary(
1728
+ requester_user_id,
1729
+ room_id,
1730
+ remote_room_hosts,
1731
+ )
1732
+
1733
+
1734
+ def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
1735
+ RoomStateEventRestServlet(hs).register(http_server)
1736
+ RoomMemberListRestServlet(hs).register(http_server)
1737
+ JoinedRoomMemberListRestServlet(hs).register(http_server)
1738
+ RoomMessageListRestServlet(hs).register(http_server)
1739
+ JoinRoomAliasServlet(hs).register(http_server)
1740
+ RoomMembershipRestServlet(hs).register(http_server)
1741
+ RoomSendEventRestServlet(hs).register(http_server)
1742
+ PublicRoomListRestServlet(hs).register(http_server)
1743
+ RoomStateRestServlet(hs).register(http_server)
1744
+ RoomRedactEventRestServlet(hs).register(http_server)
1745
+ RoomTypingRestServlet(hs).register(http_server)
1746
+ RoomEventContextServlet(hs).register(http_server)
1747
+ RoomHierarchyRestServlet(hs).register(http_server)
1748
+ if hs.config.experimental.msc3266_enabled:
1749
+ RoomSummaryRestServlet(hs).register(http_server)
1750
+ RoomEventServlet(hs).register(http_server)
1751
+ JoinedRoomsRestServlet(hs).register(http_server)
1752
+ RoomAliasListServlet(hs).register(http_server)
1753
+ SearchRestServlet(hs).register(http_server)
1754
+ RoomCreateRestServlet(hs).register(http_server)
1755
+ TimestampLookupRestServlet(hs).register(http_server)
1756
+
1757
+ # Some servlets only get registered for the main process.
1758
+ if hs.config.worker.worker_app is None:
1759
+ RoomForgetRestServlet(hs).register(http_server)
1760
+
1761
+
1762
+ def register_deprecated_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
1763
+ RoomInitialSyncRestServlet(hs).register(http_server)