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,1874 @@
1
+ #
2
+ # This file is licensed under the Affero General Public License (AGPL) version 3.
3
+ #
4
+ # Copyright 2014-2021 The Matrix.org Foundation C.I.C.
5
+ # Copyright (C) 2023 New Vector, Ltd
6
+ #
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Affero General Public License as
9
+ # published by the Free Software Foundation, either version 3 of the
10
+ # License, or (at your option) any later version.
11
+ #
12
+ # See the GNU Affero General Public License for more details:
13
+ # <https://www.gnu.org/licenses/agpl-3.0.html>.
14
+ #
15
+ # Originally licensed under the Apache License, Version 2.0:
16
+ # <http://www.apache.org/licenses/LICENSE-2.0>.
17
+ #
18
+ # [This file includes modifications made by New Vector Limited]
19
+ #
20
+ #
21
+ import abc
22
+ import codecs
23
+ import logging
24
+ import random
25
+ import sys
26
+ import urllib.parse
27
+ from http import HTTPStatus
28
+ from io import BytesIO, StringIO
29
+ from typing import (
30
+ TYPE_CHECKING,
31
+ Any,
32
+ BinaryIO,
33
+ Callable,
34
+ Generic,
35
+ Literal,
36
+ Optional,
37
+ TextIO,
38
+ TypeVar,
39
+ cast,
40
+ overload,
41
+ )
42
+
43
+ import attr
44
+ import treq
45
+ from canonicaljson import encode_canonical_json
46
+ from prometheus_client import Counter
47
+ from signedjson.sign import sign_json
48
+
49
+ from twisted.internet import defer
50
+ from twisted.internet.error import DNSLookupError
51
+ from twisted.internet.interfaces import IReactorTime
52
+ from twisted.internet.task import Cooperator
53
+ from twisted.web.client import ResponseFailed
54
+ from twisted.web.http_headers import Headers
55
+ from twisted.web.iweb import UNKNOWN_LENGTH, IAgent, IBodyProducer, IResponse
56
+
57
+ import synapse.metrics
58
+ import synapse.util.retryutils
59
+ from synapse.api.errors import (
60
+ Codes,
61
+ FederationDeniedError,
62
+ HttpResponseException,
63
+ RequestSendFailed,
64
+ SynapseError,
65
+ )
66
+ from synapse.api.ratelimiting import Ratelimiter
67
+ from synapse.crypto.context_factory import FederationPolicyForHTTPS
68
+ from synapse.http import QuieterFileBodyProducer
69
+ from synapse.http.client import (
70
+ BlocklistingAgentWrapper,
71
+ BodyExceededMaxSize,
72
+ ByteWriteable,
73
+ SimpleHttpClient,
74
+ _make_scheduler,
75
+ encode_query_args,
76
+ read_body_with_max_size,
77
+ read_multipart_response,
78
+ )
79
+ from synapse.http.connectproxyclient import BearerProxyCredentials
80
+ from synapse.http.federation.matrix_federation_agent import MatrixFederationAgent
81
+ from synapse.http.proxyagent import ProxyAgent
82
+ from synapse.http.types import QueryParams
83
+ from synapse.logging import opentracing
84
+ from synapse.logging.context import make_deferred_yieldable, run_in_background
85
+ from synapse.logging.opentracing import set_tag, start_active_span, tags
86
+ from synapse.metrics import SERVER_NAME_LABEL
87
+ from synapse.types import JsonDict
88
+ from synapse.util.async_helpers import AwakenableSleeper, Linearizer, timeout_deferred
89
+ from synapse.util.clock import Clock
90
+ from synapse.util.json import json_decoder
91
+ from synapse.util.metrics import Measure
92
+ from synapse.util.stringutils import parse_and_validate_server_name
93
+
94
+ if TYPE_CHECKING:
95
+ from synapse.server import HomeServer
96
+
97
+ logger = logging.getLogger(__name__)
98
+
99
+ outgoing_requests_counter = Counter(
100
+ "synapse_http_matrixfederationclient_requests",
101
+ "",
102
+ labelnames=["method", SERVER_NAME_LABEL],
103
+ )
104
+ incoming_responses_counter = Counter(
105
+ "synapse_http_matrixfederationclient_responses",
106
+ "",
107
+ labelnames=["method", "code", SERVER_NAME_LABEL],
108
+ )
109
+
110
+
111
+ MAXINT = sys.maxsize
112
+
113
+
114
+ _next_id = 1
115
+
116
+ T = TypeVar("T")
117
+
118
+
119
+ class ByteParser(ByteWriteable, Generic[T], abc.ABC):
120
+ """A `ByteWriteable` that has an additional `finish` function that returns
121
+ the parsed data.
122
+ """
123
+
124
+ CONTENT_TYPE: str = abc.abstractproperty() # type: ignore
125
+ """The expected content type of the response, e.g. `application/json`. If
126
+ the content type doesn't match we fail the request.
127
+ """
128
+
129
+ # a federation response can be rather large (eg a big state_ids is 50M or so), so we
130
+ # need a generous limit here.
131
+ MAX_RESPONSE_SIZE: int = 100 * 1024 * 1024
132
+ """The largest response this parser will accept."""
133
+
134
+ @abc.abstractmethod
135
+ def finish(self) -> T:
136
+ """Called when response has finished streaming and the parser should
137
+ return the final result (or error).
138
+ """
139
+
140
+
141
+ @attr.s(slots=True, frozen=True, auto_attribs=True)
142
+ class MatrixFederationRequest:
143
+ method: str
144
+ """HTTP method
145
+ """
146
+
147
+ path: str
148
+ """HTTP path
149
+ """
150
+
151
+ destination: str
152
+ """The remote server to send the HTTP request to.
153
+ """
154
+
155
+ json: JsonDict | None = None
156
+ """JSON to send in the body.
157
+ """
158
+
159
+ json_callback: Callable[[], JsonDict] | None = None
160
+ """A callback to generate the JSON.
161
+ """
162
+
163
+ query: QueryParams | None = None
164
+ """Query arguments.
165
+ """
166
+
167
+ txn_id: str = attr.ib(init=False)
168
+ """Unique ID for this request (for logging), this is autogenerated.
169
+ """
170
+
171
+ uri: bytes = b""
172
+ """The URI of this request, usually generated from the above information.
173
+ """
174
+
175
+ _generate_uri: bool = True
176
+ """True to automatically generate the uri field based on the above information.
177
+
178
+ Set to False if manually configuring the URI.
179
+ """
180
+
181
+ def __attrs_post_init__(self) -> None:
182
+ global _next_id
183
+ txn_id = "%s-O-%s" % (self.method, _next_id)
184
+ _next_id = (_next_id + 1) % (MAXINT - 1)
185
+
186
+ object.__setattr__(self, "txn_id", txn_id)
187
+
188
+ if self._generate_uri:
189
+ destination_bytes = self.destination.encode("ascii")
190
+ path_bytes = self.path.encode("ascii")
191
+ query_bytes = encode_query_args(self.query)
192
+
193
+ # The object is frozen so we can pre-compute this.
194
+ uri = urllib.parse.urlunparse(
195
+ (
196
+ b"matrix-federation",
197
+ destination_bytes,
198
+ path_bytes,
199
+ None,
200
+ query_bytes,
201
+ b"",
202
+ )
203
+ )
204
+ object.__setattr__(self, "uri", uri)
205
+
206
+ def get_json(self) -> JsonDict | None:
207
+ if self.json_callback:
208
+ return self.json_callback()
209
+ return self.json
210
+
211
+
212
+ class _BaseJsonParser(ByteParser[T]):
213
+ """A parser that buffers the response and tries to parse it as JSON."""
214
+
215
+ CONTENT_TYPE = "application/json"
216
+
217
+ def __init__(
218
+ self, validator: Callable[[object | None], bool] | None = None
219
+ ) -> None:
220
+ """
221
+ Args:
222
+ validator: A callable which takes the parsed JSON value and returns
223
+ true if the value is valid.
224
+ """
225
+ self._buffer = StringIO()
226
+ self._binary_wrapper = BinaryIOWrapper(self._buffer)
227
+ self._validator = validator
228
+
229
+ def write(self, data: bytes) -> int:
230
+ return self._binary_wrapper.write(data)
231
+
232
+ def finish(self) -> T:
233
+ result = json_decoder.decode(self._buffer.getvalue())
234
+ if self._validator is not None and not self._validator(result):
235
+ raise ValueError(
236
+ f"Received incorrect JSON value: {result.__class__.__name__}"
237
+ )
238
+ return result
239
+
240
+
241
+ class JsonParser(_BaseJsonParser[JsonDict]):
242
+ """A parser that buffers the response and tries to parse it as a JSON object."""
243
+
244
+ def __init__(self) -> None:
245
+ super().__init__(self._validate)
246
+
247
+ @staticmethod
248
+ def _validate(v: Any) -> bool:
249
+ return isinstance(v, dict)
250
+
251
+
252
+ class LegacyJsonSendParser(_BaseJsonParser[tuple[int, JsonDict]]):
253
+ """Ensure the legacy responses of /send_join & /send_leave are correct."""
254
+
255
+ def __init__(self) -> None:
256
+ super().__init__(self._validate)
257
+
258
+ @staticmethod
259
+ def _validate(v: Any) -> bool:
260
+ # Match [integer, JSON dict]
261
+ return (
262
+ isinstance(v, list)
263
+ and len(v) == 2
264
+ and type(v[0]) == int # noqa: E721
265
+ and isinstance(v[1], dict)
266
+ )
267
+
268
+
269
+ async def _handle_response(
270
+ clock: Clock,
271
+ reactor: IReactorTime,
272
+ timeout_sec: float,
273
+ request: MatrixFederationRequest,
274
+ response: IResponse,
275
+ start_ms: int,
276
+ parser: ByteParser[T],
277
+ ) -> T:
278
+ """
279
+ Reads the body of a response with a timeout and sends it to a parser
280
+
281
+ Args:
282
+ reactor: twisted reactor, for the timeout
283
+ timeout_sec: number of seconds to wait for response to complete
284
+ request: the request that triggered the response
285
+ response: response to the request
286
+ start_ms: Timestamp when request was made
287
+ parser: The parser for the response
288
+
289
+ Returns:
290
+ The parsed response
291
+ """
292
+
293
+ max_response_size = parser.MAX_RESPONSE_SIZE
294
+
295
+ finished = False
296
+ try:
297
+ check_content_type_is(response.headers, parser.CONTENT_TYPE)
298
+
299
+ d = read_body_with_max_size(response, parser, max_response_size)
300
+ d = timeout_deferred(
301
+ deferred=d,
302
+ timeout=timeout_sec,
303
+ clock=clock,
304
+ )
305
+
306
+ length = await make_deferred_yieldable(d)
307
+
308
+ finished = True
309
+ value = parser.finish()
310
+ except BodyExceededMaxSize as e:
311
+ # The response was too big.
312
+ logger.warning(
313
+ "{%s} [%s] JSON response exceeded max size %i - %s %s",
314
+ request.txn_id,
315
+ request.destination,
316
+ max_response_size,
317
+ request.method,
318
+ request.uri.decode("ascii"),
319
+ )
320
+ raise RequestSendFailed(e, can_retry=False) from e
321
+ except ValueError as e:
322
+ # The content was invalid.
323
+ logger.warning(
324
+ "{%s} [%s] Failed to parse response - %s %s",
325
+ request.txn_id,
326
+ request.destination,
327
+ request.method,
328
+ request.uri.decode("ascii"),
329
+ )
330
+ raise RequestSendFailed(e, can_retry=False) from e
331
+ except defer.TimeoutError as e:
332
+ logger.warning(
333
+ "{%s} [%s] Timed out reading response - %s %s",
334
+ request.txn_id,
335
+ request.destination,
336
+ request.method,
337
+ request.uri.decode("ascii"),
338
+ )
339
+ raise RequestSendFailed(e, can_retry=True) from e
340
+ except ResponseFailed as e:
341
+ logger.warning(
342
+ "{%s} [%s] Failed to read response - %s %s",
343
+ request.txn_id,
344
+ request.destination,
345
+ request.method,
346
+ request.uri.decode("ascii"),
347
+ )
348
+ raise RequestSendFailed(e, can_retry=True) from e
349
+ except Exception as e:
350
+ logger.warning(
351
+ "{%s} [%s] Error reading response %s %s: %s",
352
+ request.txn_id,
353
+ request.destination,
354
+ request.method,
355
+ request.uri.decode("ascii"),
356
+ e,
357
+ )
358
+ raise
359
+ finally:
360
+ if not finished:
361
+ # There was an exception and we didn't `finish()` the parse.
362
+ # Let the parser know that it can free up any resources.
363
+ try:
364
+ parser.finish()
365
+ except Exception:
366
+ # Ignore any additional exceptions.
367
+ pass
368
+
369
+ time_taken_secs = reactor.seconds() - start_ms / 1000
370
+
371
+ logger.info(
372
+ "{%s} [%s] Completed request: %d %s in %.2f secs, got %d bytes - %s %s",
373
+ request.txn_id,
374
+ request.destination,
375
+ response.code,
376
+ response.phrase.decode("ascii", errors="replace"),
377
+ time_taken_secs,
378
+ length,
379
+ request.method,
380
+ request.uri.decode("ascii"),
381
+ )
382
+ return value
383
+
384
+
385
+ class BinaryIOWrapper:
386
+ """A wrapper for a TextIO which converts from bytes on the fly."""
387
+
388
+ def __init__(self, file: TextIO, encoding: str = "utf-8", errors: str = "strict"):
389
+ self.decoder = codecs.getincrementaldecoder(encoding)(errors)
390
+ self.file = file
391
+
392
+ def write(self, b: bytes | bytearray) -> int:
393
+ self.file.write(self.decoder.decode(b))
394
+ return len(b)
395
+
396
+
397
+ class MatrixFederationHttpClient:
398
+ """HTTP client used to talk to other homeservers over the federation
399
+ protocol. Send client certificates and signs requests.
400
+
401
+ Attributes:
402
+ agent (twisted.web.client.Agent): The twisted Agent used to send the
403
+ requests.
404
+ """
405
+
406
+ def __init__(
407
+ self,
408
+ hs: "HomeServer",
409
+ tls_client_options_factory: FederationPolicyForHTTPS | None,
410
+ ):
411
+ self.hs = hs
412
+ self.signing_key = hs.signing_key
413
+ self.server_name = hs.hostname
414
+
415
+ self.reactor = hs.get_reactor()
416
+ self.clock = hs.get_clock()
417
+
418
+ user_agent = hs.version_string
419
+ if hs.config.server.user_agent_suffix:
420
+ user_agent = "%s %s" % (user_agent, hs.config.server.user_agent_suffix)
421
+
422
+ outbound_federation_restricted_to = (
423
+ hs.config.worker.outbound_federation_restricted_to
424
+ )
425
+ if hs.get_instance_name() in outbound_federation_restricted_to:
426
+ # Talk to federation directly
427
+ federation_agent: IAgent = MatrixFederationAgent(
428
+ server_name=self.server_name,
429
+ reactor=self.reactor,
430
+ clock=self.clock,
431
+ tls_client_options_factory=tls_client_options_factory,
432
+ user_agent=user_agent.encode("ascii"),
433
+ ip_allowlist=hs.config.server.federation_ip_range_allowlist,
434
+ ip_blocklist=hs.config.server.federation_ip_range_blocklist,
435
+ proxy_config=hs.config.server.proxy_config,
436
+ )
437
+ else:
438
+ proxy_authorization_secret = hs.config.worker.worker_replication_secret
439
+ assert proxy_authorization_secret is not None, (
440
+ "`worker_replication_secret` must be set when using `outbound_federation_restricted_to` (used to authenticate requests across workers)"
441
+ )
442
+ federation_proxy_credentials = BearerProxyCredentials(
443
+ proxy_authorization_secret.encode("ascii")
444
+ )
445
+
446
+ # We need to talk to federation via the proxy via one of the configured
447
+ # locations
448
+ federation_proxy_locations = outbound_federation_restricted_to.locations
449
+ federation_agent = ProxyAgent(
450
+ reactor=self.reactor,
451
+ proxy_reactor=self.reactor,
452
+ contextFactory=tls_client_options_factory,
453
+ federation_proxy_locations=federation_proxy_locations,
454
+ federation_proxy_credentials=federation_proxy_credentials,
455
+ )
456
+
457
+ # Use a BlocklistingAgentWrapper to prevent circumventing the IP
458
+ # blocking via IP literals in server names
459
+ self.agent: IAgent = BlocklistingAgentWrapper(
460
+ federation_agent,
461
+ ip_blocklist=hs.config.server.federation_ip_range_blocklist,
462
+ )
463
+
464
+ self._store = hs.get_datastores().main
465
+ self.version_string_bytes = hs.version_string.encode("ascii")
466
+ self.default_timeout_seconds = hs.config.federation.client_timeout_ms / 1000
467
+ self.max_long_retry_delay_seconds = (
468
+ hs.config.federation.max_long_retry_delay_ms / 1000
469
+ )
470
+ self.max_short_retry_delay_seconds = (
471
+ hs.config.federation.max_short_retry_delay_ms / 1000
472
+ )
473
+ self.max_long_retries = hs.config.federation.max_long_retries
474
+ self.max_short_retries = hs.config.federation.max_short_retries
475
+
476
+ self._cooperator = Cooperator(scheduler=_make_scheduler(self.clock))
477
+
478
+ self._sleeper = AwakenableSleeper(self.clock)
479
+
480
+ self._simple_http_client = SimpleHttpClient(
481
+ hs,
482
+ ip_blocklist=hs.config.server.federation_ip_range_blocklist,
483
+ ip_allowlist=hs.config.server.federation_ip_range_allowlist,
484
+ use_proxy=True,
485
+ )
486
+
487
+ self.remote_download_linearizer = Linearizer(
488
+ name="remote_download_linearizer", max_count=6, clock=self.clock
489
+ )
490
+ self._is_shutdown = False
491
+
492
+ def shutdown(self) -> None:
493
+ self._is_shutdown = True
494
+
495
+ def wake_destination(self, destination: str) -> None:
496
+ """Called when the remote server may have come back online."""
497
+
498
+ self._sleeper.wake(destination)
499
+
500
+ async def _send_request_with_optional_trailing_slash(
501
+ self,
502
+ request: MatrixFederationRequest,
503
+ try_trailing_slash_on_400: bool = False,
504
+ **send_request_args: Any,
505
+ ) -> IResponse:
506
+ """Wrapper for _send_request which can optionally retry the request
507
+ upon receiving a combination of a 400 HTTP response code and a
508
+ 'M_UNRECOGNIZED' errcode. This is a workaround for Synapse <= v0.99.3
509
+ due to https://github.com/matrix-org/synapse/issues/3622.
510
+
511
+ Args:
512
+ request: details of request to be sent
513
+ try_trailing_slash_on_400: Whether on receiving a 400
514
+ 'M_UNRECOGNIZED' from the server to retry the request with a
515
+ trailing slash appended to the request path.
516
+ send_request_args: A dictionary of arguments to pass to `_send_request()`.
517
+
518
+ Raises:
519
+ HttpResponseException: If we get an HTTP response code >= 300
520
+ (except 429).
521
+
522
+ Returns:
523
+ Parsed JSON response body.
524
+ """
525
+ try:
526
+ response = await self._send_request(request, **send_request_args)
527
+ except HttpResponseException as e:
528
+ # Received an HTTP error > 300. Check if it meets the requirements
529
+ # to retry with a trailing slash
530
+ if not try_trailing_slash_on_400:
531
+ raise
532
+
533
+ if e.code != 400 or e.to_synapse_error().errcode != "M_UNRECOGNIZED":
534
+ raise
535
+
536
+ # Retry with a trailing slash if we received a 400 with
537
+ # 'M_UNRECOGNIZED' which some endpoints can return when omitting a
538
+ # trailing slash on Synapse <= v0.99.3.
539
+ logger.info("Retrying request with trailing slash")
540
+
541
+ # Request is frozen so we create a new instance
542
+ request = attr.evolve(request, path=request.path + "/")
543
+
544
+ response = await self._send_request(request, **send_request_args)
545
+
546
+ return response
547
+
548
+ async def _send_request(
549
+ self,
550
+ request: MatrixFederationRequest,
551
+ retry_on_dns_fail: bool = True,
552
+ timeout: int | None = None,
553
+ long_retries: bool = False,
554
+ ignore_backoff: bool = False,
555
+ backoff_on_404: bool = False,
556
+ backoff_on_all_error_codes: bool = False,
557
+ follow_redirects: bool = False,
558
+ ) -> IResponse:
559
+ """
560
+ Sends a request to the given server.
561
+
562
+ Args:
563
+ request: details of request to be sent
564
+
565
+ retry_on_dns_fail: true if the request should be retried on DNS failures
566
+
567
+ timeout: number of milliseconds to wait for the response headers
568
+ (including connecting to the server), *for each attempt*.
569
+ 60s by default.
570
+
571
+ long_retries: whether to use the long retry algorithm.
572
+
573
+ The regular retry algorithm makes 4 attempts, with intervals
574
+ [0.5s, 1s, 2s].
575
+
576
+ The long retry algorithm makes 11 attempts, with intervals
577
+ [4s, 16s, 60s, 60s, ...]
578
+
579
+ Both algorithms add -20%/+40% jitter to the retry intervals.
580
+
581
+ Note that the above intervals are *in addition* to the time spent
582
+ waiting for the request to complete (up to `timeout` ms).
583
+
584
+ NB: the long retry algorithm takes over 20 minutes to complete, with a
585
+ default timeout of 60s! It's best not to use the `long_retries` option
586
+ for something that is blocking a client so we don't make them wait for
587
+ aaaaages, whereas some things like sending transactions (server to
588
+ server) we can be a lot more lenient but its very fuzzy / hand-wavey.
589
+
590
+ In the future, we could be more intelligent about doing this sort of
591
+ thing by looking at things with the bigger picture in mind,
592
+ https://github.com/matrix-org/synapse/issues/8917
593
+
594
+ ignore_backoff: true to ignore the historical backoff data
595
+ and try the request anyway.
596
+
597
+ backoff_on_404: Back off if we get a 404
598
+ backoff_on_all_error_codes: Back off if we get any error response
599
+
600
+ follow_redirects: True to follow the Location header of 307/308 redirect
601
+ responses. This does not recurse.
602
+
603
+ Returns:
604
+ Resolves with the HTTP response object on success.
605
+
606
+ Raises:
607
+ HttpResponseException: If we get an HTTP response code >= 300
608
+ (except 429).
609
+ NotRetryingDestination: If we are not yet ready to retry this
610
+ server.
611
+ FederationDeniedError: If this destination is not on our
612
+ federation whitelist
613
+ RequestSendFailed: If there were problems connecting to the
614
+ remote, due to e.g. DNS failures, connection timeouts etc.
615
+ """
616
+ # Validate server name and log if it is an invalid destination, this is
617
+ # partially to help track down code paths where we haven't validated before here
618
+ try:
619
+ parse_and_validate_server_name(request.destination)
620
+ except ValueError:
621
+ logger.exception("Invalid destination: %s.", request.destination)
622
+ raise FederationDeniedError(request.destination)
623
+
624
+ if timeout is not None:
625
+ _sec_timeout = timeout / 1000
626
+ else:
627
+ _sec_timeout = self.default_timeout_seconds
628
+
629
+ if (
630
+ self.hs.config.federation.federation_domain_whitelist is not None
631
+ and request.destination
632
+ not in self.hs.config.federation.federation_domain_whitelist
633
+ ):
634
+ raise FederationDeniedError(request.destination)
635
+
636
+ limiter = await synapse.util.retryutils.get_retry_limiter(
637
+ destination=request.destination,
638
+ our_server_name=self.server_name,
639
+ hs=self.hs,
640
+ clock=self.clock,
641
+ store=self._store,
642
+ backoff_on_404=backoff_on_404,
643
+ ignore_backoff=ignore_backoff,
644
+ notifier=self.hs.get_notifier(),
645
+ replication_client=self.hs.get_replication_command_handler(),
646
+ backoff_on_all_error_codes=backoff_on_all_error_codes,
647
+ )
648
+
649
+ method_bytes = request.method.encode("ascii")
650
+ destination_bytes = request.destination.encode("ascii")
651
+ path_bytes = request.path.encode("ascii")
652
+ query_bytes = encode_query_args(request.query)
653
+
654
+ scope = start_active_span(
655
+ "outgoing-federation-request",
656
+ tags={
657
+ tags.SPAN_KIND: tags.SPAN_KIND_RPC_CLIENT,
658
+ tags.PEER_ADDRESS: request.destination,
659
+ tags.HTTP_METHOD: request.method,
660
+ tags.HTTP_URL: request.path,
661
+ },
662
+ finish_on_close=True,
663
+ )
664
+
665
+ # Inject the span into the headers
666
+ headers_dict: dict[bytes, list[bytes]] = {}
667
+ opentracing.inject_header_dict(headers_dict, request.destination)
668
+
669
+ headers_dict[b"User-Agent"] = [self.version_string_bytes]
670
+
671
+ with limiter, scope:
672
+ # XXX: Would be much nicer to retry only at the transaction-layer
673
+ # (once we have reliable transactions in place)
674
+ if long_retries:
675
+ retries_left = self.max_long_retries
676
+ else:
677
+ retries_left = self.max_short_retries
678
+
679
+ url_bytes = request.uri
680
+ url_str = url_bytes.decode("ascii")
681
+
682
+ url_to_sign_bytes = urllib.parse.urlunparse(
683
+ (b"", b"", path_bytes, None, query_bytes, b"")
684
+ )
685
+
686
+ while not self._is_shutdown:
687
+ try:
688
+ json = request.get_json()
689
+ if json:
690
+ headers_dict[b"Content-Type"] = [b"application/json"]
691
+ auth_headers = self.build_auth_headers(
692
+ destination_bytes, method_bytes, url_to_sign_bytes, json
693
+ )
694
+ data = encode_canonical_json(json)
695
+ producer: Optional[IBodyProducer] = QuieterFileBodyProducer(
696
+ BytesIO(data), cooperator=self._cooperator
697
+ )
698
+ else:
699
+ producer = None
700
+ auth_headers = self.build_auth_headers(
701
+ destination_bytes, method_bytes, url_to_sign_bytes
702
+ )
703
+
704
+ headers_dict[b"Authorization"] = auth_headers
705
+
706
+ logger.debug(
707
+ "{%s} [%s] Sending request: %s %s; timeout %fs",
708
+ request.txn_id,
709
+ request.destination,
710
+ request.method,
711
+ url_str,
712
+ _sec_timeout,
713
+ )
714
+
715
+ outgoing_requests_counter.labels(
716
+ method=request.method, **{SERVER_NAME_LABEL: self.server_name}
717
+ ).inc()
718
+
719
+ try:
720
+ with Measure(
721
+ self.clock,
722
+ name="outbound_request",
723
+ server_name=self.server_name,
724
+ ):
725
+ # we don't want all the fancy cookie and redirect handling
726
+ # that treq.request gives: just use the raw Agent.
727
+
728
+ # To preserve the logging context, the timeout is treated
729
+ # in a similar way to `defer.gatherResults`:
730
+ # * Each logging context-preserving fork is wrapped in
731
+ # `run_in_background`. In this case there is only one,
732
+ # since the timeout fork is not logging-context aware.
733
+ # * The `Deferred` that joins the forks back together is
734
+ # wrapped in `make_deferred_yieldable` to restore the
735
+ # logging context regardless of the path taken.
736
+ request_deferred = run_in_background(
737
+ self.agent.request,
738
+ method_bytes,
739
+ url_bytes,
740
+ headers=Headers(headers_dict),
741
+ bodyProducer=producer,
742
+ )
743
+ request_deferred = timeout_deferred(
744
+ deferred=request_deferred,
745
+ timeout=_sec_timeout,
746
+ clock=self.clock,
747
+ )
748
+
749
+ response = await make_deferred_yieldable(request_deferred)
750
+ except DNSLookupError as e:
751
+ raise RequestSendFailed(e, can_retry=retry_on_dns_fail) from e
752
+ except Exception as e:
753
+ raise RequestSendFailed(e, can_retry=True) from e
754
+
755
+ incoming_responses_counter.labels(
756
+ method=request.method,
757
+ code=response.code,
758
+ **{SERVER_NAME_LABEL: self.server_name},
759
+ ).inc()
760
+
761
+ set_tag(tags.HTTP_STATUS_CODE, response.code)
762
+ response_phrase = response.phrase.decode("ascii", errors="replace")
763
+
764
+ if 200 <= response.code < 300:
765
+ logger.debug(
766
+ "{%s} [%s] Got response headers: %d %s",
767
+ request.txn_id,
768
+ request.destination,
769
+ response.code,
770
+ response_phrase,
771
+ )
772
+ elif (
773
+ response.code in (307, 308)
774
+ and follow_redirects
775
+ and response.headers.hasHeader("Location")
776
+ ):
777
+ # The Location header *might* be relative so resolve it.
778
+ location = response.headers.getRawHeaders(b"Location")[0]
779
+ new_uri = urllib.parse.urljoin(request.uri, location)
780
+
781
+ return await self._send_request(
782
+ attr.evolve(request, uri=new_uri, generate_uri=False),
783
+ retry_on_dns_fail,
784
+ timeout,
785
+ long_retries,
786
+ ignore_backoff,
787
+ backoff_on_404,
788
+ backoff_on_all_error_codes,
789
+ # Do not continue following redirects.
790
+ follow_redirects=False,
791
+ )
792
+ else:
793
+ logger.info(
794
+ "{%s} [%s] Got response headers: %d %s",
795
+ request.txn_id,
796
+ request.destination,
797
+ response.code,
798
+ response_phrase,
799
+ )
800
+ # :'(
801
+ # Update transactions table?
802
+ d = treq.content(response)
803
+ d = timeout_deferred(
804
+ deferred=d,
805
+ timeout=_sec_timeout,
806
+ clock=self.clock,
807
+ )
808
+
809
+ try:
810
+ body = await make_deferred_yieldable(d)
811
+ except Exception as e:
812
+ # Eh, we're already going to raise an exception so lets
813
+ # ignore if this fails.
814
+ logger.warning(
815
+ "{%s} [%s] Failed to get error response: %s %s: %s",
816
+ request.txn_id,
817
+ request.destination,
818
+ request.method,
819
+ url_str,
820
+ _flatten_response_never_received(e),
821
+ )
822
+ body = b""
823
+
824
+ exc = HttpResponseException(
825
+ response.code, response_phrase, body
826
+ )
827
+
828
+ # Retry if the error is a 5xx or a 429 (Too Many
829
+ # Requests), otherwise just raise a standard
830
+ # `HttpResponseException`
831
+ if 500 <= response.code < 600 or response.code == 429:
832
+ raise RequestSendFailed(exc, can_retry=True) from exc
833
+ else:
834
+ raise exc
835
+
836
+ break
837
+ except RequestSendFailed as e:
838
+ logger.info(
839
+ "{%s} [%s] Request failed: %s %s: %s",
840
+ request.txn_id,
841
+ request.destination,
842
+ request.method,
843
+ url_str,
844
+ _flatten_response_never_received(e.inner_exception),
845
+ )
846
+
847
+ if not e.can_retry:
848
+ raise
849
+
850
+ if retries_left and not timeout:
851
+ if long_retries:
852
+ delay_seconds = 4 ** (
853
+ self.max_long_retries + 1 - retries_left
854
+ )
855
+ delay_seconds = min(
856
+ delay_seconds, self.max_long_retry_delay_seconds
857
+ )
858
+ delay_seconds *= random.uniform(0.8, 1.4)
859
+ else:
860
+ delay_seconds = 0.5 * 2 ** (
861
+ self.max_short_retries - retries_left
862
+ )
863
+ delay_seconds = min(
864
+ delay_seconds, self.max_short_retry_delay_seconds
865
+ )
866
+ delay_seconds *= random.uniform(0.8, 1.4)
867
+
868
+ logger.debug(
869
+ "{%s} [%s] Waiting %ss before re-sending...",
870
+ request.txn_id,
871
+ request.destination,
872
+ delay_seconds,
873
+ )
874
+
875
+ if self._is_shutdown:
876
+ # Immediately fail sending the request instead of starting a
877
+ # potentially long sleep after the server has requested
878
+ # shutdown.
879
+ # This is the code path followed when the
880
+ # `federation_transaction_transmission_loop` has been
881
+ # cancelled.
882
+ raise
883
+
884
+ # Sleep for the calculated delay, or wake up immediately
885
+ # if we get notified that the server is back up.
886
+ await self._sleeper.sleep(
887
+ request.destination, delay_seconds * 1000
888
+ )
889
+ retries_left -= 1
890
+ else:
891
+ raise
892
+
893
+ except Exception as e:
894
+ logger.warning(
895
+ "{%s} [%s] Request failed: %s %s: %s",
896
+ request.txn_id,
897
+ request.destination,
898
+ request.method,
899
+ url_str,
900
+ _flatten_response_never_received(e),
901
+ )
902
+ raise
903
+ return response
904
+
905
+ def build_auth_headers(
906
+ self,
907
+ destination: bytes | None,
908
+ method: bytes,
909
+ url_bytes: bytes,
910
+ content: JsonDict | None = None,
911
+ destination_is: bytes | None = None,
912
+ ) -> list[bytes]:
913
+ """
914
+ Builds the Authorization headers for a federation request
915
+ Args:
916
+ destination: The destination homeserver of the request.
917
+ May be None if the destination is an identity server, in which case
918
+ destination_is must be non-None.
919
+ method: The HTTP method of the request
920
+ url_bytes: The URI path of the request
921
+ content: The body of the request
922
+ destination_is: As 'destination', but if the destination is an
923
+ identity server
924
+
925
+ Returns:
926
+ A list of headers to be added as "Authorization:" headers
927
+ """
928
+ if not destination and not destination_is:
929
+ raise ValueError(
930
+ "At least one of the arguments destination and destination_is "
931
+ "must be a nonempty bytestring."
932
+ )
933
+
934
+ request: JsonDict = {
935
+ "method": method.decode("ascii"),
936
+ "uri": url_bytes.decode("ascii"),
937
+ "origin": self.server_name,
938
+ }
939
+
940
+ if destination is not None:
941
+ request["destination"] = destination.decode("ascii")
942
+
943
+ if destination_is is not None:
944
+ request["destination_is"] = destination_is.decode("ascii")
945
+
946
+ if content is not None:
947
+ request["content"] = content
948
+
949
+ request = sign_json(request, self.server_name, self.signing_key)
950
+
951
+ auth_headers = []
952
+
953
+ for key, sig in request["signatures"][self.server_name].items():
954
+ auth_headers.append(
955
+ (
956
+ 'X-Matrix origin="%s",key="%s",sig="%s",destination="%s"'
957
+ % (
958
+ self.server_name,
959
+ key,
960
+ sig,
961
+ request.get("destination") or request["destination_is"],
962
+ )
963
+ ).encode("ascii")
964
+ )
965
+ return auth_headers
966
+
967
+ @overload
968
+ async def put_json(
969
+ self,
970
+ destination: str,
971
+ path: str,
972
+ args: QueryParams | None = None,
973
+ data: JsonDict | None = None,
974
+ json_data_callback: Callable[[], JsonDict] | None = None,
975
+ long_retries: bool = False,
976
+ timeout: int | None = None,
977
+ ignore_backoff: bool = False,
978
+ backoff_on_404: bool = False,
979
+ try_trailing_slash_on_400: bool = False,
980
+ parser: Literal[None] = None,
981
+ backoff_on_all_error_codes: bool = False,
982
+ ) -> JsonDict: ...
983
+
984
+ @overload
985
+ async def put_json(
986
+ self,
987
+ destination: str,
988
+ path: str,
989
+ args: QueryParams | None = None,
990
+ data: JsonDict | None = None,
991
+ json_data_callback: Callable[[], JsonDict] | None = None,
992
+ long_retries: bool = False,
993
+ timeout: int | None = None,
994
+ ignore_backoff: bool = False,
995
+ backoff_on_404: bool = False,
996
+ try_trailing_slash_on_400: bool = False,
997
+ parser: ByteParser[T] | None = None,
998
+ backoff_on_all_error_codes: bool = False,
999
+ ) -> T: ...
1000
+
1001
+ async def put_json(
1002
+ self,
1003
+ destination: str,
1004
+ path: str,
1005
+ args: QueryParams | None = None,
1006
+ data: JsonDict | None = None,
1007
+ json_data_callback: Callable[[], JsonDict] | None = None,
1008
+ long_retries: bool = False,
1009
+ timeout: int | None = None,
1010
+ ignore_backoff: bool = False,
1011
+ backoff_on_404: bool = False,
1012
+ try_trailing_slash_on_400: bool = False,
1013
+ parser: ByteParser[T] | None = None,
1014
+ backoff_on_all_error_codes: bool = False,
1015
+ ) -> JsonDict | T:
1016
+ """Sends the specified json data using PUT
1017
+
1018
+ Args:
1019
+ destination: The remote server to send the HTTP request to.
1020
+ path: The HTTP path.
1021
+ args: query params
1022
+ data: A dict containing the data that will be used as
1023
+ the request body. This will be encoded as JSON.
1024
+ json_data_callback: A callable returning the dict to
1025
+ use as the request body.
1026
+
1027
+ long_retries: whether to use the long retry algorithm. See
1028
+ docs on _send_request for details.
1029
+
1030
+ timeout: number of milliseconds to wait for the response.
1031
+ self._default_timeout (60s) by default.
1032
+
1033
+ Note that we may make several attempts to send the request; this
1034
+ timeout applies to the time spent waiting for response headers for
1035
+ *each* attempt (including connection time) as well as the time spent
1036
+ reading the response body after a 200 response.
1037
+
1038
+ ignore_backoff: true to ignore the historical backoff data
1039
+ and try the request anyway.
1040
+ backoff_on_404: True if we should count a 404 response as
1041
+ a failure of the server (and should therefore back off future
1042
+ requests).
1043
+ try_trailing_slash_on_400: True if on a 400 M_UNRECOGNIZED
1044
+ response we should try appending a trailing slash to the end
1045
+ of the request. Workaround for https://github.com/matrix-org/synapse/issues/3622
1046
+ in Synapse <= v0.99.3. This will be attempted before backing off if
1047
+ backing off has been enabled.
1048
+ parser: The parser to use to decode the response. Defaults to
1049
+ parsing as JSON.
1050
+ backoff_on_all_error_codes: Back off if we get any error response
1051
+
1052
+ Returns:
1053
+ Succeeds when we get a 2xx HTTP response. The
1054
+ result will be the decoded JSON body.
1055
+
1056
+ Raises:
1057
+ HttpResponseException: If we get an HTTP response code >= 300
1058
+ (except 429).
1059
+ NotRetryingDestination: If we are not yet ready to retry this
1060
+ server.
1061
+ FederationDeniedError: If this destination is not on our
1062
+ federation whitelist
1063
+ RequestSendFailed: If there were problems connecting to the
1064
+ remote, due to e.g. DNS failures, connection timeouts etc.
1065
+ """
1066
+ request = MatrixFederationRequest(
1067
+ method="PUT",
1068
+ destination=destination,
1069
+ path=path,
1070
+ query=args,
1071
+ json_callback=json_data_callback,
1072
+ json=data,
1073
+ )
1074
+
1075
+ start_ms = self.clock.time_msec()
1076
+
1077
+ response = await self._send_request_with_optional_trailing_slash(
1078
+ request,
1079
+ try_trailing_slash_on_400,
1080
+ backoff_on_404=backoff_on_404,
1081
+ ignore_backoff=ignore_backoff,
1082
+ long_retries=long_retries,
1083
+ timeout=timeout,
1084
+ backoff_on_all_error_codes=backoff_on_all_error_codes,
1085
+ )
1086
+
1087
+ if timeout is not None:
1088
+ _sec_timeout = timeout / 1000
1089
+ else:
1090
+ _sec_timeout = self.default_timeout_seconds
1091
+
1092
+ if parser is None:
1093
+ parser = cast(ByteParser[T], JsonParser())
1094
+
1095
+ body = await _handle_response(
1096
+ self.clock,
1097
+ self.reactor,
1098
+ _sec_timeout,
1099
+ request,
1100
+ response,
1101
+ start_ms,
1102
+ parser=parser,
1103
+ )
1104
+
1105
+ return body
1106
+
1107
+ async def post_json(
1108
+ self,
1109
+ destination: str,
1110
+ path: str,
1111
+ data: JsonDict | None = None,
1112
+ long_retries: bool = False,
1113
+ timeout: int | None = None,
1114
+ ignore_backoff: bool = False,
1115
+ args: QueryParams | None = None,
1116
+ ) -> JsonDict:
1117
+ """Sends the specified json data using POST
1118
+
1119
+ Args:
1120
+ destination: The remote server to send the HTTP request to.
1121
+
1122
+ path: The HTTP path.
1123
+
1124
+ data: A dict containing the data that will be used as
1125
+ the request body. This will be encoded as JSON.
1126
+
1127
+ long_retries: whether to use the long retry algorithm. See
1128
+ docs on _send_request for details.
1129
+
1130
+ timeout: number of milliseconds to wait for the response.
1131
+ self._default_timeout (60s) by default.
1132
+
1133
+ Note that we may make several attempts to send the request; this
1134
+ timeout applies to the time spent waiting for response headers for
1135
+ *each* attempt (including connection time) as well as the time spent
1136
+ reading the response body after a 200 response.
1137
+
1138
+ ignore_backoff: true to ignore the historical backoff data and
1139
+ try the request anyway.
1140
+
1141
+ args: query params
1142
+ Returns:
1143
+ Succeeds when we get a 2xx HTTP response. The result will be the decoded JSON body.
1144
+
1145
+ Raises:
1146
+ HttpResponseException: If we get an HTTP response code >= 300
1147
+ (except 429).
1148
+ NotRetryingDestination: If we are not yet ready to retry this
1149
+ server.
1150
+ FederationDeniedError: If this destination is not on our
1151
+ federation whitelist
1152
+ RequestSendFailed: If there were problems connecting to the
1153
+ remote, due to e.g. DNS failures, connection timeouts etc.
1154
+ """
1155
+
1156
+ request = MatrixFederationRequest(
1157
+ method="POST", destination=destination, path=path, query=args, json=data
1158
+ )
1159
+
1160
+ start_ms = self.clock.time_msec()
1161
+
1162
+ response = await self._send_request(
1163
+ request,
1164
+ long_retries=long_retries,
1165
+ timeout=timeout,
1166
+ ignore_backoff=ignore_backoff,
1167
+ )
1168
+
1169
+ if timeout is not None:
1170
+ _sec_timeout = timeout / 1000
1171
+ else:
1172
+ _sec_timeout = self.default_timeout_seconds
1173
+
1174
+ body = await _handle_response(
1175
+ self.clock,
1176
+ self.reactor,
1177
+ _sec_timeout,
1178
+ request,
1179
+ response,
1180
+ start_ms,
1181
+ parser=JsonParser(),
1182
+ )
1183
+ return body
1184
+
1185
+ @overload
1186
+ async def get_json(
1187
+ self,
1188
+ destination: str,
1189
+ path: str,
1190
+ args: QueryParams | None = None,
1191
+ retry_on_dns_fail: bool = True,
1192
+ timeout: int | None = None,
1193
+ ignore_backoff: bool = False,
1194
+ try_trailing_slash_on_400: bool = False,
1195
+ parser: Literal[None] = None,
1196
+ ) -> JsonDict: ...
1197
+
1198
+ @overload
1199
+ async def get_json(
1200
+ self,
1201
+ destination: str,
1202
+ path: str,
1203
+ args: QueryParams | None = ...,
1204
+ retry_on_dns_fail: bool = ...,
1205
+ timeout: int | None = ...,
1206
+ ignore_backoff: bool = ...,
1207
+ try_trailing_slash_on_400: bool = ...,
1208
+ parser: ByteParser[T] = ...,
1209
+ ) -> T: ...
1210
+
1211
+ async def get_json(
1212
+ self,
1213
+ destination: str,
1214
+ path: str,
1215
+ args: QueryParams | None = None,
1216
+ retry_on_dns_fail: bool = True,
1217
+ timeout: int | None = None,
1218
+ ignore_backoff: bool = False,
1219
+ try_trailing_slash_on_400: bool = False,
1220
+ parser: ByteParser[T] | None = None,
1221
+ ) -> JsonDict | T:
1222
+ """GETs some json from the given host homeserver and path
1223
+
1224
+ Args:
1225
+ destination: The remote server to send the HTTP request to.
1226
+
1227
+ path: The HTTP path.
1228
+
1229
+ args: A dictionary used to create query strings, defaults to
1230
+ None.
1231
+
1232
+ retry_on_dns_fail: true if the request should be retried on DNS failures
1233
+
1234
+ timeout: number of milliseconds to wait for the response.
1235
+ self._default_timeout (60s) by default.
1236
+
1237
+ Note that we may make several attempts to send the request; this
1238
+ timeout applies to the time spent waiting for response headers for
1239
+ *each* attempt (including connection time) as well as the time spent
1240
+ reading the response body after a 200 response.
1241
+
1242
+ ignore_backoff: true to ignore the historical backoff data
1243
+ and try the request anyway.
1244
+
1245
+ try_trailing_slash_on_400: True if on a 400 M_UNRECOGNIZED
1246
+ response we should try appending a trailing slash to the end of
1247
+ the request. Workaround for https://github.com/matrix-org/synapse/issues/3622
1248
+ in Synapse <= v0.99.3.
1249
+
1250
+ parser: The parser to use to decode the response. Defaults to
1251
+ parsing as JSON.
1252
+
1253
+ Returns:
1254
+ Succeeds when we get a 2xx HTTP response. The
1255
+ result will be the decoded JSON body.
1256
+
1257
+ Raises:
1258
+ HttpResponseException: If we get an HTTP response code >= 300
1259
+ (except 429).
1260
+ NotRetryingDestination: If we are not yet ready to retry this
1261
+ server.
1262
+ FederationDeniedError: If this destination is not on our
1263
+ federation whitelist
1264
+ RequestSendFailed: If there were problems connecting to the
1265
+ remote, due to e.g. DNS failures, connection timeouts etc.
1266
+ """
1267
+ json_dict, _ = await self.get_json_with_headers(
1268
+ destination=destination,
1269
+ path=path,
1270
+ args=args,
1271
+ retry_on_dns_fail=retry_on_dns_fail,
1272
+ timeout=timeout,
1273
+ ignore_backoff=ignore_backoff,
1274
+ try_trailing_slash_on_400=try_trailing_slash_on_400,
1275
+ parser=parser,
1276
+ )
1277
+ return json_dict
1278
+
1279
+ @overload
1280
+ async def get_json_with_headers(
1281
+ self,
1282
+ destination: str,
1283
+ path: str,
1284
+ args: QueryParams | None = None,
1285
+ retry_on_dns_fail: bool = True,
1286
+ timeout: int | None = None,
1287
+ ignore_backoff: bool = False,
1288
+ try_trailing_slash_on_400: bool = False,
1289
+ parser: Literal[None] = None,
1290
+ ) -> tuple[JsonDict, dict[bytes, list[bytes]]]: ...
1291
+
1292
+ @overload
1293
+ async def get_json_with_headers(
1294
+ self,
1295
+ destination: str,
1296
+ path: str,
1297
+ args: QueryParams | None = ...,
1298
+ retry_on_dns_fail: bool = ...,
1299
+ timeout: int | None = ...,
1300
+ ignore_backoff: bool = ...,
1301
+ try_trailing_slash_on_400: bool = ...,
1302
+ parser: ByteParser[T] = ...,
1303
+ ) -> tuple[T, dict[bytes, list[bytes]]]: ...
1304
+
1305
+ async def get_json_with_headers(
1306
+ self,
1307
+ destination: str,
1308
+ path: str,
1309
+ args: QueryParams | None = None,
1310
+ retry_on_dns_fail: bool = True,
1311
+ timeout: int | None = None,
1312
+ ignore_backoff: bool = False,
1313
+ try_trailing_slash_on_400: bool = False,
1314
+ parser: ByteParser[T] | None = None,
1315
+ ) -> tuple[JsonDict | T, dict[bytes, list[bytes]]]:
1316
+ """GETs some json from the given host homeserver and path
1317
+
1318
+ Args:
1319
+ destination: The remote server to send the HTTP request to.
1320
+
1321
+ path: The HTTP path.
1322
+
1323
+ args: A dictionary used to create query strings, defaults to
1324
+ None.
1325
+
1326
+ retry_on_dns_fail: true if the request should be retried on DNS failures
1327
+
1328
+ timeout: number of milliseconds to wait for the response.
1329
+ self._default_timeout (60s) by default.
1330
+
1331
+ Note that we may make several attempts to send the request; this
1332
+ timeout applies to the time spent waiting for response headers for
1333
+ *each* attempt (including connection time) as well as the time spent
1334
+ reading the response body after a 200 response.
1335
+
1336
+ ignore_backoff: true to ignore the historical backoff data
1337
+ and try the request anyway.
1338
+
1339
+ try_trailing_slash_on_400: True if on a 400 M_UNRECOGNIZED
1340
+ response we should try appending a trailing slash to the end of
1341
+ the request. Workaround for https://github.com/matrix-org/synapse/issues/3622
1342
+ in Synapse <= v0.99.3.
1343
+
1344
+ parser: The parser to use to decode the response. Defaults to
1345
+ parsing as JSON.
1346
+
1347
+ Returns:
1348
+ Succeeds when we get a 2xx HTTP response. The result will be a tuple of the
1349
+ decoded JSON body and a dict of the response headers.
1350
+
1351
+ Raises:
1352
+ HttpResponseException: If we get an HTTP response code >= 300
1353
+ (except 429).
1354
+ NotRetryingDestination: If we are not yet ready to retry this
1355
+ server.
1356
+ FederationDeniedError: If this destination is not on our
1357
+ federation whitelist
1358
+ RequestSendFailed: If there were problems connecting to the
1359
+ remote, due to e.g. DNS failures, connection timeouts etc.
1360
+ """
1361
+ request = MatrixFederationRequest(
1362
+ method="GET", destination=destination, path=path, query=args
1363
+ )
1364
+
1365
+ start_ms = self.clock.time_msec()
1366
+
1367
+ response = await self._send_request_with_optional_trailing_slash(
1368
+ request,
1369
+ try_trailing_slash_on_400,
1370
+ backoff_on_404=False,
1371
+ ignore_backoff=ignore_backoff,
1372
+ retry_on_dns_fail=retry_on_dns_fail,
1373
+ timeout=timeout,
1374
+ )
1375
+
1376
+ headers = dict(response.headers.getAllRawHeaders())
1377
+
1378
+ if timeout is not None:
1379
+ _sec_timeout = timeout / 1000
1380
+ else:
1381
+ _sec_timeout = self.default_timeout_seconds
1382
+
1383
+ if parser is None:
1384
+ parser = cast(ByteParser[T], JsonParser())
1385
+
1386
+ body = await _handle_response(
1387
+ self.clock,
1388
+ self.reactor,
1389
+ _sec_timeout,
1390
+ request,
1391
+ response,
1392
+ start_ms,
1393
+ parser=parser,
1394
+ )
1395
+
1396
+ return body, headers
1397
+
1398
+ async def delete_json(
1399
+ self,
1400
+ destination: str,
1401
+ path: str,
1402
+ long_retries: bool = False,
1403
+ timeout: int | None = None,
1404
+ ignore_backoff: bool = False,
1405
+ args: QueryParams | None = None,
1406
+ ) -> JsonDict:
1407
+ """Send a DELETE request to the remote expecting some json response
1408
+
1409
+ Args:
1410
+ destination: The remote server to send the HTTP request to.
1411
+ path: The HTTP path.
1412
+
1413
+ long_retries: whether to use the long retry algorithm. See
1414
+ docs on _send_request for details.
1415
+
1416
+ timeout: number of milliseconds to wait for the response.
1417
+ self._default_timeout (60s) by default.
1418
+
1419
+ Note that we may make several attempts to send the request; this
1420
+ timeout applies to the time spent waiting for response headers for
1421
+ *each* attempt (including connection time) as well as the time spent
1422
+ reading the response body after a 200 response.
1423
+
1424
+ ignore_backoff: true to ignore the historical backoff data and
1425
+ try the request anyway.
1426
+
1427
+ args: query params
1428
+ Returns:
1429
+ Succeeds when we get a 2xx HTTP response. The
1430
+ result will be the decoded JSON body.
1431
+
1432
+ Raises:
1433
+ HttpResponseException: If we get an HTTP response code >= 300
1434
+ (except 429).
1435
+ NotRetryingDestination: If we are not yet ready to retry this
1436
+ server.
1437
+ FederationDeniedError: If this destination is not on our
1438
+ federation whitelist
1439
+ RequestSendFailed: If there were problems connecting to the
1440
+ remote, due to e.g. DNS failures, connection timeouts etc.
1441
+ """
1442
+ request = MatrixFederationRequest(
1443
+ method="DELETE", destination=destination, path=path, query=args
1444
+ )
1445
+
1446
+ start_ms = self.clock.time_msec()
1447
+
1448
+ response = await self._send_request(
1449
+ request,
1450
+ long_retries=long_retries,
1451
+ timeout=timeout,
1452
+ ignore_backoff=ignore_backoff,
1453
+ )
1454
+
1455
+ if timeout is not None:
1456
+ _sec_timeout = timeout / 1000
1457
+ else:
1458
+ _sec_timeout = self.default_timeout_seconds
1459
+
1460
+ body = await _handle_response(
1461
+ self.clock,
1462
+ self.reactor,
1463
+ _sec_timeout,
1464
+ request,
1465
+ response,
1466
+ start_ms,
1467
+ parser=JsonParser(),
1468
+ )
1469
+ return body
1470
+
1471
+ async def get_file(
1472
+ self,
1473
+ destination: str,
1474
+ path: str,
1475
+ output_stream: BinaryIO,
1476
+ download_ratelimiter: Ratelimiter,
1477
+ ip_address: str,
1478
+ max_size: int,
1479
+ args: QueryParams | None = None,
1480
+ retry_on_dns_fail: bool = True,
1481
+ ignore_backoff: bool = False,
1482
+ follow_redirects: bool = False,
1483
+ ) -> tuple[int, dict[bytes, list[bytes]]]:
1484
+ """GETs a file from a given homeserver
1485
+ Args:
1486
+ destination: The remote server to send the HTTP request to.
1487
+ path: The HTTP path to GET.
1488
+ output_stream: File to write the response body to.
1489
+ download_ratelimiter: a ratelimiter to limit remote media downloads, keyed to
1490
+ requester IP
1491
+ ip_address: IP address of the requester
1492
+ max_size: maximum allowable size in bytes of the file
1493
+ args: Optional dictionary used to create the query string.
1494
+ ignore_backoff: true to ignore the historical backoff data
1495
+ and try the request anyway.
1496
+ follow_redirects: True to follow the Location header of 307/308 redirect
1497
+ responses. This does not recurse.
1498
+
1499
+ Returns:
1500
+ Resolves with an (int,dict) tuple of
1501
+ the file length and a dict of the response headers.
1502
+
1503
+ Raises:
1504
+ HttpResponseException: If we get an HTTP response code >= 300
1505
+ (except 429).
1506
+ NotRetryingDestination: If we are not yet ready to retry this
1507
+ server.
1508
+ FederationDeniedError: If this destination is not on our
1509
+ federation whitelist
1510
+ RequestSendFailed: If there were problems connecting to the
1511
+ remote, due to e.g. DNS failures, connection timeouts etc.
1512
+ SynapseError: If the requested file exceeds ratelimits
1513
+ """
1514
+ request = MatrixFederationRequest(
1515
+ method="GET", destination=destination, path=path, query=args
1516
+ )
1517
+
1518
+ # check for a minimum balance of 1MiB in ratelimiter before initiating request
1519
+ send_req, _ = await download_ratelimiter.can_do_action(
1520
+ requester=None, key=ip_address, n_actions=1048576, update=False
1521
+ )
1522
+
1523
+ if not send_req:
1524
+ msg = "Requested file size exceeds ratelimits"
1525
+ logger.warning(
1526
+ "{%s} [%s] %s",
1527
+ request.txn_id,
1528
+ request.destination,
1529
+ msg,
1530
+ )
1531
+ raise SynapseError(HTTPStatus.TOO_MANY_REQUESTS, msg, Codes.LIMIT_EXCEEDED)
1532
+
1533
+ response = await self._send_request(
1534
+ request,
1535
+ retry_on_dns_fail=retry_on_dns_fail,
1536
+ ignore_backoff=ignore_backoff,
1537
+ follow_redirects=follow_redirects,
1538
+ )
1539
+
1540
+ headers = dict(response.headers.getAllRawHeaders())
1541
+ expected_size = response.length
1542
+
1543
+ if expected_size == UNKNOWN_LENGTH:
1544
+ expected_size = max_size
1545
+ else:
1546
+ if int(expected_size) > max_size:
1547
+ msg = "Requested file is too large > %r bytes" % (max_size,)
1548
+ logger.warning(
1549
+ "{%s} [%s] %s",
1550
+ request.txn_id,
1551
+ request.destination,
1552
+ msg,
1553
+ )
1554
+ raise SynapseError(HTTPStatus.BAD_GATEWAY, msg, Codes.TOO_LARGE)
1555
+
1556
+ read_body, _ = await download_ratelimiter.can_do_action(
1557
+ requester=None,
1558
+ key=ip_address,
1559
+ n_actions=expected_size,
1560
+ )
1561
+ if not read_body:
1562
+ msg = "Requested file size exceeds ratelimits"
1563
+ logger.warning(
1564
+ "{%s} [%s] %s",
1565
+ request.txn_id,
1566
+ request.destination,
1567
+ msg,
1568
+ )
1569
+ raise SynapseError(
1570
+ HTTPStatus.TOO_MANY_REQUESTS, msg, Codes.LIMIT_EXCEEDED
1571
+ )
1572
+
1573
+ try:
1574
+ async with self.remote_download_linearizer.queue(ip_address):
1575
+ # add a byte of headroom to max size as function errs at >=
1576
+ d = read_body_with_max_size(response, output_stream, expected_size + 1)
1577
+ d.addTimeout(self.default_timeout_seconds, self.reactor)
1578
+ length = await make_deferred_yieldable(d)
1579
+ except BodyExceededMaxSize:
1580
+ msg = "Requested file is too large > %r bytes" % (expected_size,)
1581
+ logger.warning(
1582
+ "{%s} [%s] %s",
1583
+ request.txn_id,
1584
+ request.destination,
1585
+ msg,
1586
+ )
1587
+ raise SynapseError(HTTPStatus.BAD_GATEWAY, msg, Codes.TOO_LARGE)
1588
+ except defer.TimeoutError as e:
1589
+ logger.warning(
1590
+ "{%s} [%s] Timed out reading response - %s %s",
1591
+ request.txn_id,
1592
+ request.destination,
1593
+ request.method,
1594
+ request.uri.decode("ascii"),
1595
+ )
1596
+ raise RequestSendFailed(e, can_retry=True) from e
1597
+ except ResponseFailed as e:
1598
+ logger.warning(
1599
+ "{%s} [%s] Failed to read response - %s %s",
1600
+ request.txn_id,
1601
+ request.destination,
1602
+ request.method,
1603
+ request.uri.decode("ascii"),
1604
+ )
1605
+ raise RequestSendFailed(e, can_retry=True) from e
1606
+ except Exception as e:
1607
+ logger.warning(
1608
+ "{%s} [%s] Error reading response: %s",
1609
+ request.txn_id,
1610
+ request.destination,
1611
+ e,
1612
+ )
1613
+ raise
1614
+ logger.info(
1615
+ "{%s} [%s] Completed: %d %s [%d bytes] %s %s",
1616
+ request.txn_id,
1617
+ request.destination,
1618
+ response.code,
1619
+ response.phrase.decode("ascii", errors="replace"),
1620
+ length,
1621
+ request.method,
1622
+ request.uri.decode("ascii"),
1623
+ )
1624
+
1625
+ # if we didn't know the length upfront, decrement the actual size from ratelimiter
1626
+ if response.length == UNKNOWN_LENGTH:
1627
+ download_ratelimiter.record_action(
1628
+ requester=None, key=ip_address, n_actions=length
1629
+ )
1630
+
1631
+ return length, headers
1632
+
1633
+ async def federation_get_file(
1634
+ self,
1635
+ destination: str,
1636
+ path: str,
1637
+ output_stream: BinaryIO,
1638
+ download_ratelimiter: Ratelimiter,
1639
+ ip_address: str,
1640
+ max_size: int,
1641
+ args: QueryParams | None = None,
1642
+ retry_on_dns_fail: bool = True,
1643
+ ignore_backoff: bool = False,
1644
+ ) -> tuple[int, dict[bytes, list[bytes]], bytes]:
1645
+ """GETs a file from a given homeserver over the federation /download endpoint
1646
+ Args:
1647
+ destination: The remote server to send the HTTP request to.
1648
+ path: The HTTP path to GET.
1649
+ output_stream: File to write the response body to.
1650
+ download_ratelimiter: a ratelimiter to limit remote media downloads, keyed to
1651
+ requester IP
1652
+ ip_address: IP address of the requester
1653
+ max_size: maximum allowable size in bytes of the file
1654
+ args: Optional dictionary used to create the query string.
1655
+ ignore_backoff: true to ignore the historical backoff data
1656
+ and try the request anyway.
1657
+
1658
+ Returns:
1659
+ Resolves to an (int, dict, bytes) tuple of
1660
+ the file length, a dict of the response headers, and the file json
1661
+
1662
+ Raises:
1663
+ HttpResponseException: If we get an HTTP response code >= 300
1664
+ (except 429).
1665
+ NotRetryingDestination: If we are not yet ready to retry this
1666
+ server.
1667
+ FederationDeniedError: If this destination is not on our
1668
+ federation whitelist
1669
+ RequestSendFailed: If there were problems connecting to the
1670
+ remote, due to e.g. DNS failures, connection timeouts etc.
1671
+ SynapseError: If the requested file exceeds ratelimits or the response from the
1672
+ remote server is not a multipart response
1673
+ AssertionError: if the resolved multipart response's length is None
1674
+ """
1675
+ request = MatrixFederationRequest(
1676
+ method="GET", destination=destination, path=path, query=args
1677
+ )
1678
+
1679
+ # check for a minimum balance of 1MiB in ratelimiter before initiating request
1680
+ send_req, _ = await download_ratelimiter.can_do_action(
1681
+ requester=None, key=ip_address, n_actions=1048576, update=False
1682
+ )
1683
+
1684
+ if not send_req:
1685
+ msg = "Requested file size exceeds ratelimits"
1686
+ logger.warning(
1687
+ "{%s} [%s] %s",
1688
+ request.txn_id,
1689
+ request.destination,
1690
+ msg,
1691
+ )
1692
+ raise SynapseError(HTTPStatus.TOO_MANY_REQUESTS, msg, Codes.LIMIT_EXCEEDED)
1693
+
1694
+ response = await self._send_request(
1695
+ request,
1696
+ retry_on_dns_fail=retry_on_dns_fail,
1697
+ ignore_backoff=ignore_backoff,
1698
+ )
1699
+
1700
+ headers = dict(response.headers.getAllRawHeaders())
1701
+ expected_size = response.length
1702
+
1703
+ if expected_size == UNKNOWN_LENGTH:
1704
+ expected_size = max_size
1705
+ else:
1706
+ if int(expected_size) > max_size:
1707
+ msg = "Requested file is too large > %r bytes" % (max_size,)
1708
+ logger.warning(
1709
+ "{%s} [%s] %s",
1710
+ request.txn_id,
1711
+ request.destination,
1712
+ msg,
1713
+ )
1714
+ raise SynapseError(HTTPStatus.BAD_GATEWAY, msg, Codes.TOO_LARGE)
1715
+
1716
+ read_body, _ = await download_ratelimiter.can_do_action(
1717
+ requester=None,
1718
+ key=ip_address,
1719
+ n_actions=expected_size,
1720
+ )
1721
+ if not read_body:
1722
+ msg = "Requested file size exceeds ratelimits"
1723
+ logger.warning(
1724
+ "{%s} [%s] %s",
1725
+ request.txn_id,
1726
+ request.destination,
1727
+ msg,
1728
+ )
1729
+ raise SynapseError(
1730
+ HTTPStatus.TOO_MANY_REQUESTS, msg, Codes.LIMIT_EXCEEDED
1731
+ )
1732
+
1733
+ # this should be a multipart/mixed response with the boundary string in the header
1734
+ try:
1735
+ raw_content_type = headers.get(b"Content-Type")
1736
+ assert raw_content_type is not None
1737
+ content_type = raw_content_type[0].decode("UTF-8")
1738
+ content_type_parts = content_type.split("boundary=")
1739
+ boundary = content_type_parts[1]
1740
+ except Exception:
1741
+ msg = "Remote response is malformed: expected Content-Type of multipart/mixed with a boundary present."
1742
+ logger.warning(
1743
+ "{%s} [%s] %s",
1744
+ request.txn_id,
1745
+ request.destination,
1746
+ msg,
1747
+ )
1748
+ raise SynapseError(HTTPStatus.BAD_GATEWAY, msg)
1749
+
1750
+ try:
1751
+ async with self.remote_download_linearizer.queue(ip_address):
1752
+ # add a byte of headroom to max size as `_MultipartParserProtocol.dataReceived` errs at >=
1753
+ deferred = read_multipart_response(
1754
+ response, output_stream, boundary, expected_size + 1
1755
+ )
1756
+ deferred.addTimeout(self.default_timeout_seconds, self.reactor)
1757
+ multipart_response = await make_deferred_yieldable(deferred)
1758
+ except BodyExceededMaxSize:
1759
+ msg = "Requested file is too large > %r bytes" % (expected_size,)
1760
+ logger.warning(
1761
+ "{%s} [%s] %s",
1762
+ request.txn_id,
1763
+ request.destination,
1764
+ msg,
1765
+ )
1766
+ raise SynapseError(HTTPStatus.BAD_GATEWAY, msg, Codes.TOO_LARGE)
1767
+ except defer.TimeoutError as e:
1768
+ logger.warning(
1769
+ "{%s} [%s] Timed out reading response - %s %s",
1770
+ request.txn_id,
1771
+ request.destination,
1772
+ request.method,
1773
+ request.uri.decode("ascii"),
1774
+ )
1775
+ raise RequestSendFailed(e, can_retry=True) from e
1776
+ except ResponseFailed as e:
1777
+ logger.warning(
1778
+ "{%s} [%s] Failed to read response - %s %s",
1779
+ request.txn_id,
1780
+ request.destination,
1781
+ request.method,
1782
+ request.uri.decode("ascii"),
1783
+ )
1784
+ raise RequestSendFailed(e, can_retry=True) from e
1785
+ except Exception as e:
1786
+ logger.warning(
1787
+ "{%s} [%s] Error reading response: %s",
1788
+ request.txn_id,
1789
+ request.destination,
1790
+ e,
1791
+ )
1792
+ raise
1793
+
1794
+ if not multipart_response.url:
1795
+ assert multipart_response.length is not None
1796
+ length = multipart_response.length
1797
+ headers[b"Content-Type"] = [multipart_response.content_type]
1798
+ headers[b"Content-Disposition"] = [multipart_response.disposition]
1799
+
1800
+ # the response contained a redirect url to download the file from
1801
+ else:
1802
+ str_url = multipart_response.url.decode("utf-8")
1803
+ logger.info(
1804
+ "{%s} [%s] File download redirected, now downloading from: %s",
1805
+ request.txn_id,
1806
+ request.destination,
1807
+ str_url,
1808
+ )
1809
+ # We don't know how large the response will be upfront, so limit it to
1810
+ # the `max_size` config value.
1811
+ length, headers, _, _ = await self._simple_http_client.get_file(
1812
+ str_url, output_stream, max_size
1813
+ )
1814
+
1815
+ logger.info(
1816
+ "{%s} [%s] Completed: %d %s [%d bytes] %s %s",
1817
+ request.txn_id,
1818
+ request.destination,
1819
+ response.code,
1820
+ response.phrase.decode("ascii", errors="replace"),
1821
+ length,
1822
+ request.method,
1823
+ request.uri.decode("ascii"),
1824
+ )
1825
+
1826
+ # if we didn't know the length upfront, decrement the actual size from ratelimiter
1827
+ if response.length == UNKNOWN_LENGTH:
1828
+ download_ratelimiter.record_action(
1829
+ requester=None, key=ip_address, n_actions=length
1830
+ )
1831
+
1832
+ return length, headers, multipart_response.json
1833
+
1834
+
1835
+ def _flatten_response_never_received(e: BaseException) -> str:
1836
+ if hasattr(e, "reasons"):
1837
+ reasons = ", ".join(
1838
+ _flatten_response_never_received(f.value) for f in e.reasons
1839
+ )
1840
+
1841
+ return "%s:[%s]" % (type(e).__name__, reasons)
1842
+ else:
1843
+ return repr(e)
1844
+
1845
+
1846
+ def check_content_type_is(headers: Headers, expected_content_type: str) -> None:
1847
+ """
1848
+ Check that a set of HTTP headers have a Content-Type header, and that it
1849
+ is the expected value..
1850
+
1851
+ Args:
1852
+ headers: headers to check
1853
+
1854
+ Raises:
1855
+ RequestSendFailed: if the Content-Type header is missing or doesn't match
1856
+
1857
+ """
1858
+ content_type_headers = headers.getRawHeaders(b"Content-Type")
1859
+ if content_type_headers is None:
1860
+ raise RequestSendFailed(
1861
+ RuntimeError("No Content-Type header received from remote server"),
1862
+ can_retry=False,
1863
+ )
1864
+
1865
+ c_type = content_type_headers[0].decode("ascii") # only the first header
1866
+ # Extract the 'essence' of the mimetype, removing any parameter
1867
+ c_type_parsed = c_type.split(";", 1)[0].strip()
1868
+ if c_type_parsed != expected_content_type:
1869
+ raise RequestSendFailed(
1870
+ RuntimeError(
1871
+ f"Remote server sent Content-Type header of '{c_type}', not '{expected_content_type}'",
1872
+ ),
1873
+ can_retry=False,
1874
+ )