matrix-synapse 1.143.0rc2__cp310-abi3-manylinux_2_28_aarch64.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.
Files changed (1058) hide show
  1. matrix_synapse-1.143.0rc2.dist-info/AUTHORS.rst +51 -0
  2. matrix_synapse-1.143.0rc2.dist-info/LICENSE-AGPL-3.0 +661 -0
  3. matrix_synapse-1.143.0rc2.dist-info/LICENSE-COMMERCIAL +6 -0
  4. matrix_synapse-1.143.0rc2.dist-info/METADATA +385 -0
  5. matrix_synapse-1.143.0rc2.dist-info/RECORD +1058 -0
  6. matrix_synapse-1.143.0rc2.dist-info/WHEEL +4 -0
  7. matrix_synapse-1.143.0rc2.dist-info/entry_points.txt +14 -0
  8. synapse/__init__.py +97 -0
  9. synapse/_scripts/__init__.py +0 -0
  10. synapse/_scripts/export_signing_key.py +109 -0
  11. synapse/_scripts/generate_config.py +83 -0
  12. synapse/_scripts/generate_log_config.py +56 -0
  13. synapse/_scripts/generate_signing_key.py +55 -0
  14. synapse/_scripts/generate_workers_map.py +318 -0
  15. synapse/_scripts/hash_password.py +95 -0
  16. synapse/_scripts/move_remote_media_to_new_store.py +128 -0
  17. synapse/_scripts/register_new_matrix_user.py +402 -0
  18. synapse/_scripts/review_recent_signups.py +212 -0
  19. synapse/_scripts/synapse_port_db.py +1604 -0
  20. synapse/_scripts/synctl.py +365 -0
  21. synapse/_scripts/update_synapse_database.py +130 -0
  22. synapse/api/__init__.py +20 -0
  23. synapse/api/auth/__init__.py +207 -0
  24. synapse/api/auth/base.py +406 -0
  25. synapse/api/auth/internal.py +299 -0
  26. synapse/api/auth/mas.py +436 -0
  27. synapse/api/auth/msc3861_delegated.py +617 -0
  28. synapse/api/auth_blocking.py +144 -0
  29. synapse/api/constants.py +362 -0
  30. synapse/api/errors.py +907 -0
  31. synapse/api/filtering.py +537 -0
  32. synapse/api/presence.py +102 -0
  33. synapse/api/ratelimiting.py +480 -0
  34. synapse/api/room_versions.py +535 -0
  35. synapse/api/urls.py +118 -0
  36. synapse/app/__init__.py +60 -0
  37. synapse/app/_base.py +862 -0
  38. synapse/app/admin_cmd.py +388 -0
  39. synapse/app/appservice.py +30 -0
  40. synapse/app/client_reader.py +30 -0
  41. synapse/app/complement_fork_starter.py +206 -0
  42. synapse/app/event_creator.py +29 -0
  43. synapse/app/federation_reader.py +30 -0
  44. synapse/app/federation_sender.py +30 -0
  45. synapse/app/frontend_proxy.py +30 -0
  46. synapse/app/generic_worker.py +474 -0
  47. synapse/app/homeserver.py +505 -0
  48. synapse/app/media_repository.py +30 -0
  49. synapse/app/phone_stats_home.py +296 -0
  50. synapse/app/pusher.py +30 -0
  51. synapse/app/synchrotron.py +30 -0
  52. synapse/app/user_dir.py +31 -0
  53. synapse/appservice/__init__.py +458 -0
  54. synapse/appservice/api.py +567 -0
  55. synapse/appservice/scheduler.py +564 -0
  56. synapse/config/__init__.py +27 -0
  57. synapse/config/__main__.py +62 -0
  58. synapse/config/_base.py +1106 -0
  59. synapse/config/_base.pyi +215 -0
  60. synapse/config/_util.py +99 -0
  61. synapse/config/account_validity.py +116 -0
  62. synapse/config/api.py +141 -0
  63. synapse/config/appservice.py +210 -0
  64. synapse/config/auth.py +80 -0
  65. synapse/config/auto_accept_invites.py +43 -0
  66. synapse/config/background_updates.py +44 -0
  67. synapse/config/cache.py +231 -0
  68. synapse/config/captcha.py +90 -0
  69. synapse/config/cas.py +116 -0
  70. synapse/config/consent.py +73 -0
  71. synapse/config/database.py +184 -0
  72. synapse/config/emailconfig.py +367 -0
  73. synapse/config/experimental.py +595 -0
  74. synapse/config/federation.py +114 -0
  75. synapse/config/homeserver.py +141 -0
  76. synapse/config/jwt.py +55 -0
  77. synapse/config/key.py +447 -0
  78. synapse/config/logger.py +390 -0
  79. synapse/config/mas.py +192 -0
  80. synapse/config/matrixrtc.py +66 -0
  81. synapse/config/metrics.py +84 -0
  82. synapse/config/modules.py +40 -0
  83. synapse/config/oembed.py +185 -0
  84. synapse/config/oidc.py +509 -0
  85. synapse/config/password_auth_providers.py +82 -0
  86. synapse/config/push.py +64 -0
  87. synapse/config/ratelimiting.py +254 -0
  88. synapse/config/redis.py +74 -0
  89. synapse/config/registration.py +296 -0
  90. synapse/config/repository.py +311 -0
  91. synapse/config/retention.py +162 -0
  92. synapse/config/room.py +88 -0
  93. synapse/config/room_directory.py +165 -0
  94. synapse/config/saml2.py +251 -0
  95. synapse/config/server.py +1170 -0
  96. synapse/config/server_notices.py +84 -0
  97. synapse/config/spam_checker.py +66 -0
  98. synapse/config/sso.py +121 -0
  99. synapse/config/stats.py +54 -0
  100. synapse/config/third_party_event_rules.py +40 -0
  101. synapse/config/tls.py +192 -0
  102. synapse/config/tracer.py +71 -0
  103. synapse/config/user_directory.py +47 -0
  104. synapse/config/user_types.py +42 -0
  105. synapse/config/voip.py +59 -0
  106. synapse/config/workers.py +642 -0
  107. synapse/crypto/__init__.py +20 -0
  108. synapse/crypto/context_factory.py +278 -0
  109. synapse/crypto/event_signing.py +194 -0
  110. synapse/crypto/keyring.py +931 -0
  111. synapse/event_auth.py +1266 -0
  112. synapse/events/__init__.py +667 -0
  113. synapse/events/auto_accept_invites.py +216 -0
  114. synapse/events/builder.py +387 -0
  115. synapse/events/presence_router.py +243 -0
  116. synapse/events/snapshot.py +559 -0
  117. synapse/events/utils.py +924 -0
  118. synapse/events/validator.py +305 -0
  119. synapse/federation/__init__.py +22 -0
  120. synapse/federation/federation_base.py +382 -0
  121. synapse/federation/federation_client.py +2132 -0
  122. synapse/federation/federation_server.py +1540 -0
  123. synapse/federation/persistence.py +70 -0
  124. synapse/federation/send_queue.py +531 -0
  125. synapse/federation/sender/__init__.py +1164 -0
  126. synapse/federation/sender/per_destination_queue.py +886 -0
  127. synapse/federation/sender/transaction_manager.py +210 -0
  128. synapse/federation/transport/__init__.py +28 -0
  129. synapse/federation/transport/client.py +1199 -0
  130. synapse/federation/transport/server/__init__.py +334 -0
  131. synapse/federation/transport/server/_base.py +429 -0
  132. synapse/federation/transport/server/federation.py +910 -0
  133. synapse/federation/units.py +133 -0
  134. synapse/handlers/__init__.py +20 -0
  135. synapse/handlers/account.py +162 -0
  136. synapse/handlers/account_data.py +360 -0
  137. synapse/handlers/account_validity.py +361 -0
  138. synapse/handlers/admin.py +615 -0
  139. synapse/handlers/appservice.py +989 -0
  140. synapse/handlers/auth.py +2481 -0
  141. synapse/handlers/cas.py +413 -0
  142. synapse/handlers/deactivate_account.py +363 -0
  143. synapse/handlers/delayed_events.py +599 -0
  144. synapse/handlers/device.py +1870 -0
  145. synapse/handlers/devicemessage.py +399 -0
  146. synapse/handlers/directory.py +545 -0
  147. synapse/handlers/e2e_keys.py +1834 -0
  148. synapse/handlers/e2e_room_keys.py +455 -0
  149. synapse/handlers/event_auth.py +390 -0
  150. synapse/handlers/events.py +201 -0
  151. synapse/handlers/federation.py +2039 -0
  152. synapse/handlers/federation_event.py +2419 -0
  153. synapse/handlers/identity.py +812 -0
  154. synapse/handlers/initial_sync.py +528 -0
  155. synapse/handlers/jwt.py +120 -0
  156. synapse/handlers/message.py +2347 -0
  157. synapse/handlers/oidc.py +1801 -0
  158. synapse/handlers/pagination.py +768 -0
  159. synapse/handlers/password_policy.py +102 -0
  160. synapse/handlers/presence.py +2633 -0
  161. synapse/handlers/profile.py +655 -0
  162. synapse/handlers/push_rules.py +164 -0
  163. synapse/handlers/read_marker.py +79 -0
  164. synapse/handlers/receipts.py +351 -0
  165. synapse/handlers/register.py +1059 -0
  166. synapse/handlers/relations.py +623 -0
  167. synapse/handlers/reports.py +98 -0
  168. synapse/handlers/room.py +2448 -0
  169. synapse/handlers/room_list.py +632 -0
  170. synapse/handlers/room_member.py +2365 -0
  171. synapse/handlers/room_member_worker.py +146 -0
  172. synapse/handlers/room_policy.py +186 -0
  173. synapse/handlers/room_summary.py +1057 -0
  174. synapse/handlers/saml.py +524 -0
  175. synapse/handlers/search.py +723 -0
  176. synapse/handlers/send_email.py +209 -0
  177. synapse/handlers/set_password.py +71 -0
  178. synapse/handlers/sliding_sync/__init__.py +1701 -0
  179. synapse/handlers/sliding_sync/extensions.py +969 -0
  180. synapse/handlers/sliding_sync/room_lists.py +2262 -0
  181. synapse/handlers/sliding_sync/store.py +128 -0
  182. synapse/handlers/sso.py +1291 -0
  183. synapse/handlers/state_deltas.py +82 -0
  184. synapse/handlers/stats.py +321 -0
  185. synapse/handlers/sync.py +3106 -0
  186. synapse/handlers/thread_subscriptions.py +190 -0
  187. synapse/handlers/typing.py +606 -0
  188. synapse/handlers/ui_auth/__init__.py +48 -0
  189. synapse/handlers/ui_auth/checkers.py +332 -0
  190. synapse/handlers/user_directory.py +783 -0
  191. synapse/handlers/worker_lock.py +371 -0
  192. synapse/http/__init__.py +105 -0
  193. synapse/http/additional_resource.py +62 -0
  194. synapse/http/client.py +1373 -0
  195. synapse/http/connectproxyclient.py +316 -0
  196. synapse/http/federation/__init__.py +19 -0
  197. synapse/http/federation/matrix_federation_agent.py +490 -0
  198. synapse/http/federation/srv_resolver.py +196 -0
  199. synapse/http/federation/well_known_resolver.py +367 -0
  200. synapse/http/matrixfederationclient.py +1873 -0
  201. synapse/http/proxy.py +290 -0
  202. synapse/http/proxyagent.py +497 -0
  203. synapse/http/replicationagent.py +202 -0
  204. synapse/http/request_metrics.py +309 -0
  205. synapse/http/server.py +1110 -0
  206. synapse/http/servlet.py +1018 -0
  207. synapse/http/site.py +825 -0
  208. synapse/http/types.py +27 -0
  209. synapse/logging/__init__.py +31 -0
  210. synapse/logging/_remote.py +261 -0
  211. synapse/logging/_terse_json.py +95 -0
  212. synapse/logging/context.py +1209 -0
  213. synapse/logging/formatter.py +62 -0
  214. synapse/logging/handlers.py +99 -0
  215. synapse/logging/loggers.py +25 -0
  216. synapse/logging/opentracing.py +1132 -0
  217. synapse/logging/scopecontextmanager.py +160 -0
  218. synapse/media/_base.py +830 -0
  219. synapse/media/filepath.py +417 -0
  220. synapse/media/media_repository.py +1580 -0
  221. synapse/media/media_storage.py +702 -0
  222. synapse/media/oembed.py +277 -0
  223. synapse/media/preview_html.py +556 -0
  224. synapse/media/storage_provider.py +195 -0
  225. synapse/media/thumbnailer.py +833 -0
  226. synapse/media/url_previewer.py +875 -0
  227. synapse/metrics/__init__.py +748 -0
  228. synapse/metrics/_gc.py +219 -0
  229. synapse/metrics/_reactor_metrics.py +171 -0
  230. synapse/metrics/_types.py +38 -0
  231. synapse/metrics/background_process_metrics.py +555 -0
  232. synapse/metrics/common_usage_metrics.py +94 -0
  233. synapse/metrics/jemalloc.py +248 -0
  234. synapse/module_api/__init__.py +2131 -0
  235. synapse/module_api/callbacks/__init__.py +50 -0
  236. synapse/module_api/callbacks/account_validity_callbacks.py +106 -0
  237. synapse/module_api/callbacks/media_repository_callbacks.py +157 -0
  238. synapse/module_api/callbacks/ratelimit_callbacks.py +78 -0
  239. synapse/module_api/callbacks/spamchecker_callbacks.py +991 -0
  240. synapse/module_api/callbacks/third_party_event_rules_callbacks.py +592 -0
  241. synapse/module_api/errors.py +42 -0
  242. synapse/notifier.py +970 -0
  243. synapse/push/__init__.py +212 -0
  244. synapse/push/bulk_push_rule_evaluator.py +635 -0
  245. synapse/push/clientformat.py +126 -0
  246. synapse/push/emailpusher.py +333 -0
  247. synapse/push/httppusher.py +564 -0
  248. synapse/push/mailer.py +1010 -0
  249. synapse/push/presentable_names.py +216 -0
  250. synapse/push/push_tools.py +114 -0
  251. synapse/push/push_types.py +141 -0
  252. synapse/push/pusher.py +87 -0
  253. synapse/push/pusherpool.py +501 -0
  254. synapse/push/rulekinds.py +33 -0
  255. synapse/py.typed +0 -0
  256. synapse/replication/__init__.py +20 -0
  257. synapse/replication/http/__init__.py +68 -0
  258. synapse/replication/http/_base.py +468 -0
  259. synapse/replication/http/account_data.py +297 -0
  260. synapse/replication/http/deactivate_account.py +81 -0
  261. synapse/replication/http/delayed_events.py +62 -0
  262. synapse/replication/http/devices.py +254 -0
  263. synapse/replication/http/federation.py +334 -0
  264. synapse/replication/http/login.py +106 -0
  265. synapse/replication/http/membership.py +364 -0
  266. synapse/replication/http/presence.py +133 -0
  267. synapse/replication/http/push.py +156 -0
  268. synapse/replication/http/register.py +172 -0
  269. synapse/replication/http/send_events.py +182 -0
  270. synapse/replication/http/state.py +82 -0
  271. synapse/replication/http/streams.py +101 -0
  272. synapse/replication/tcp/__init__.py +56 -0
  273. synapse/replication/tcp/client.py +552 -0
  274. synapse/replication/tcp/commands.py +569 -0
  275. synapse/replication/tcp/context.py +41 -0
  276. synapse/replication/tcp/external_cache.py +156 -0
  277. synapse/replication/tcp/handler.py +922 -0
  278. synapse/replication/tcp/protocol.py +608 -0
  279. synapse/replication/tcp/redis.py +509 -0
  280. synapse/replication/tcp/resource.py +348 -0
  281. synapse/replication/tcp/streams/__init__.py +96 -0
  282. synapse/replication/tcp/streams/_base.py +765 -0
  283. synapse/replication/tcp/streams/events.py +287 -0
  284. synapse/replication/tcp/streams/federation.py +92 -0
  285. synapse/replication/tcp/streams/partial_state.py +80 -0
  286. synapse/res/providers.json +29 -0
  287. synapse/res/templates/_base.html +29 -0
  288. synapse/res/templates/account_previously_renewed.html +6 -0
  289. synapse/res/templates/account_renewed.html +6 -0
  290. synapse/res/templates/add_threepid.html +8 -0
  291. synapse/res/templates/add_threepid.txt +6 -0
  292. synapse/res/templates/add_threepid_failure.html +7 -0
  293. synapse/res/templates/add_threepid_success.html +6 -0
  294. synapse/res/templates/already_in_use.html +12 -0
  295. synapse/res/templates/already_in_use.txt +10 -0
  296. synapse/res/templates/auth_success.html +21 -0
  297. synapse/res/templates/invalid_token.html +6 -0
  298. synapse/res/templates/mail-Element.css +7 -0
  299. synapse/res/templates/mail-Vector.css +7 -0
  300. synapse/res/templates/mail-expiry.css +4 -0
  301. synapse/res/templates/mail.css +156 -0
  302. synapse/res/templates/notice_expiry.html +46 -0
  303. synapse/res/templates/notice_expiry.txt +7 -0
  304. synapse/res/templates/notif.html +51 -0
  305. synapse/res/templates/notif.txt +22 -0
  306. synapse/res/templates/notif_mail.html +59 -0
  307. synapse/res/templates/notif_mail.txt +10 -0
  308. synapse/res/templates/password_reset.html +10 -0
  309. synapse/res/templates/password_reset.txt +7 -0
  310. synapse/res/templates/password_reset_confirmation.html +15 -0
  311. synapse/res/templates/password_reset_failure.html +7 -0
  312. synapse/res/templates/password_reset_success.html +6 -0
  313. synapse/res/templates/recaptcha.html +42 -0
  314. synapse/res/templates/registration.html +12 -0
  315. synapse/res/templates/registration.txt +10 -0
  316. synapse/res/templates/registration_failure.html +6 -0
  317. synapse/res/templates/registration_success.html +6 -0
  318. synapse/res/templates/registration_token.html +18 -0
  319. synapse/res/templates/room.html +33 -0
  320. synapse/res/templates/room.txt +9 -0
  321. synapse/res/templates/sso.css +129 -0
  322. synapse/res/templates/sso_account_deactivated.html +25 -0
  323. synapse/res/templates/sso_auth_account_details.html +186 -0
  324. synapse/res/templates/sso_auth_account_details.js +116 -0
  325. synapse/res/templates/sso_auth_bad_user.html +26 -0
  326. synapse/res/templates/sso_auth_confirm.html +27 -0
  327. synapse/res/templates/sso_auth_success.html +26 -0
  328. synapse/res/templates/sso_error.html +71 -0
  329. synapse/res/templates/sso_footer.html +19 -0
  330. synapse/res/templates/sso_login_idp_picker.html +60 -0
  331. synapse/res/templates/sso_new_user_consent.html +30 -0
  332. synapse/res/templates/sso_partial_profile.html +19 -0
  333. synapse/res/templates/sso_redirect_confirm.html +39 -0
  334. synapse/res/templates/style.css +33 -0
  335. synapse/res/templates/terms.html +27 -0
  336. synapse/rest/__init__.py +197 -0
  337. synapse/rest/admin/__init__.py +390 -0
  338. synapse/rest/admin/_base.py +72 -0
  339. synapse/rest/admin/background_updates.py +171 -0
  340. synapse/rest/admin/devices.py +221 -0
  341. synapse/rest/admin/event_reports.py +173 -0
  342. synapse/rest/admin/events.py +69 -0
  343. synapse/rest/admin/experimental_features.py +137 -0
  344. synapse/rest/admin/federation.py +243 -0
  345. synapse/rest/admin/media.py +540 -0
  346. synapse/rest/admin/registration_tokens.py +358 -0
  347. synapse/rest/admin/rooms.py +1061 -0
  348. synapse/rest/admin/scheduled_tasks.py +70 -0
  349. synapse/rest/admin/server_notice_servlet.py +132 -0
  350. synapse/rest/admin/statistics.py +132 -0
  351. synapse/rest/admin/username_available.py +58 -0
  352. synapse/rest/admin/users.py +1606 -0
  353. synapse/rest/client/__init__.py +20 -0
  354. synapse/rest/client/_base.py +113 -0
  355. synapse/rest/client/account.py +930 -0
  356. synapse/rest/client/account_data.py +319 -0
  357. synapse/rest/client/account_validity.py +103 -0
  358. synapse/rest/client/appservice_ping.py +125 -0
  359. synapse/rest/client/auth.py +218 -0
  360. synapse/rest/client/auth_metadata.py +122 -0
  361. synapse/rest/client/capabilities.py +121 -0
  362. synapse/rest/client/delayed_events.py +165 -0
  363. synapse/rest/client/devices.py +587 -0
  364. synapse/rest/client/directory.py +211 -0
  365. synapse/rest/client/events.py +116 -0
  366. synapse/rest/client/filter.py +112 -0
  367. synapse/rest/client/initial_sync.py +65 -0
  368. synapse/rest/client/keys.py +678 -0
  369. synapse/rest/client/knock.py +104 -0
  370. synapse/rest/client/login.py +750 -0
  371. synapse/rest/client/login_token_request.py +127 -0
  372. synapse/rest/client/logout.py +93 -0
  373. synapse/rest/client/matrixrtc.py +52 -0
  374. synapse/rest/client/media.py +285 -0
  375. synapse/rest/client/mutual_rooms.py +93 -0
  376. synapse/rest/client/notifications.py +137 -0
  377. synapse/rest/client/openid.py +109 -0
  378. synapse/rest/client/password_policy.py +69 -0
  379. synapse/rest/client/presence.py +131 -0
  380. synapse/rest/client/profile.py +291 -0
  381. synapse/rest/client/push_rule.py +331 -0
  382. synapse/rest/client/pusher.py +181 -0
  383. synapse/rest/client/read_marker.py +104 -0
  384. synapse/rest/client/receipts.py +165 -0
  385. synapse/rest/client/register.py +1067 -0
  386. synapse/rest/client/relations.py +138 -0
  387. synapse/rest/client/rendezvous.py +76 -0
  388. synapse/rest/client/reporting.py +207 -0
  389. synapse/rest/client/room.py +1669 -0
  390. synapse/rest/client/room_keys.py +426 -0
  391. synapse/rest/client/room_upgrade_rest_servlet.py +112 -0
  392. synapse/rest/client/sendtodevice.py +85 -0
  393. synapse/rest/client/sync.py +1131 -0
  394. synapse/rest/client/tags.py +129 -0
  395. synapse/rest/client/thirdparty.py +130 -0
  396. synapse/rest/client/thread_subscriptions.py +247 -0
  397. synapse/rest/client/tokenrefresh.py +52 -0
  398. synapse/rest/client/transactions.py +149 -0
  399. synapse/rest/client/user_directory.py +90 -0
  400. synapse/rest/client/versions.py +191 -0
  401. synapse/rest/client/voip.py +88 -0
  402. synapse/rest/consent/__init__.py +0 -0
  403. synapse/rest/consent/consent_resource.py +210 -0
  404. synapse/rest/health.py +38 -0
  405. synapse/rest/key/__init__.py +20 -0
  406. synapse/rest/key/v2/__init__.py +40 -0
  407. synapse/rest/key/v2/local_key_resource.py +125 -0
  408. synapse/rest/key/v2/remote_key_resource.py +302 -0
  409. synapse/rest/media/__init__.py +0 -0
  410. synapse/rest/media/config_resource.py +53 -0
  411. synapse/rest/media/create_resource.py +90 -0
  412. synapse/rest/media/download_resource.py +110 -0
  413. synapse/rest/media/media_repository_resource.py +113 -0
  414. synapse/rest/media/preview_url_resource.py +77 -0
  415. synapse/rest/media/thumbnail_resource.py +142 -0
  416. synapse/rest/media/upload_resource.py +187 -0
  417. synapse/rest/media/v1/__init__.py +39 -0
  418. synapse/rest/media/v1/_base.py +23 -0
  419. synapse/rest/media/v1/media_storage.py +23 -0
  420. synapse/rest/media/v1/storage_provider.py +23 -0
  421. synapse/rest/synapse/__init__.py +20 -0
  422. synapse/rest/synapse/client/__init__.py +93 -0
  423. synapse/rest/synapse/client/federation_whitelist.py +66 -0
  424. synapse/rest/synapse/client/jwks.py +77 -0
  425. synapse/rest/synapse/client/new_user_consent.py +115 -0
  426. synapse/rest/synapse/client/oidc/__init__.py +45 -0
  427. synapse/rest/synapse/client/oidc/backchannel_logout_resource.py +42 -0
  428. synapse/rest/synapse/client/oidc/callback_resource.py +48 -0
  429. synapse/rest/synapse/client/password_reset.py +129 -0
  430. synapse/rest/synapse/client/pick_idp.py +107 -0
  431. synapse/rest/synapse/client/pick_username.py +153 -0
  432. synapse/rest/synapse/client/rendezvous.py +58 -0
  433. synapse/rest/synapse/client/saml2/__init__.py +42 -0
  434. synapse/rest/synapse/client/saml2/metadata_resource.py +46 -0
  435. synapse/rest/synapse/client/saml2/response_resource.py +52 -0
  436. synapse/rest/synapse/client/sso_register.py +56 -0
  437. synapse/rest/synapse/client/unsubscribe.py +88 -0
  438. synapse/rest/synapse/mas/__init__.py +71 -0
  439. synapse/rest/synapse/mas/_base.py +55 -0
  440. synapse/rest/synapse/mas/devices.py +239 -0
  441. synapse/rest/synapse/mas/users.py +469 -0
  442. synapse/rest/well_known.py +148 -0
  443. synapse/server.py +1257 -0
  444. synapse/server_notices/__init__.py +0 -0
  445. synapse/server_notices/consent_server_notices.py +136 -0
  446. synapse/server_notices/resource_limits_server_notices.py +215 -0
  447. synapse/server_notices/server_notices_manager.py +388 -0
  448. synapse/server_notices/server_notices_sender.py +67 -0
  449. synapse/server_notices/worker_server_notices_sender.py +46 -0
  450. synapse/spam_checker_api/__init__.py +31 -0
  451. synapse/state/__init__.py +1022 -0
  452. synapse/state/v1.py +369 -0
  453. synapse/state/v2.py +984 -0
  454. synapse/static/client/login/index.html +47 -0
  455. synapse/static/client/login/js/jquery-3.4.1.min.js +2 -0
  456. synapse/static/client/login/js/login.js +291 -0
  457. synapse/static/client/login/spinner.gif +0 -0
  458. synapse/static/client/login/style.css +79 -0
  459. synapse/static/index.html +63 -0
  460. synapse/storage/__init__.py +43 -0
  461. synapse/storage/_base.py +245 -0
  462. synapse/storage/admin_client_config.py +25 -0
  463. synapse/storage/background_updates.py +1188 -0
  464. synapse/storage/controllers/__init__.py +57 -0
  465. synapse/storage/controllers/persist_events.py +1237 -0
  466. synapse/storage/controllers/purge_events.py +455 -0
  467. synapse/storage/controllers/state.py +950 -0
  468. synapse/storage/controllers/stats.py +119 -0
  469. synapse/storage/database.py +2719 -0
  470. synapse/storage/databases/__init__.py +175 -0
  471. synapse/storage/databases/main/__init__.py +420 -0
  472. synapse/storage/databases/main/account_data.py +1059 -0
  473. synapse/storage/databases/main/appservice.py +473 -0
  474. synapse/storage/databases/main/cache.py +911 -0
  475. synapse/storage/databases/main/censor_events.py +225 -0
  476. synapse/storage/databases/main/client_ips.py +815 -0
  477. synapse/storage/databases/main/delayed_events.py +562 -0
  478. synapse/storage/databases/main/deviceinbox.py +1271 -0
  479. synapse/storage/databases/main/devices.py +2578 -0
  480. synapse/storage/databases/main/directory.py +212 -0
  481. synapse/storage/databases/main/e2e_room_keys.py +689 -0
  482. synapse/storage/databases/main/end_to_end_keys.py +1894 -0
  483. synapse/storage/databases/main/event_federation.py +2508 -0
  484. synapse/storage/databases/main/event_push_actions.py +1933 -0
  485. synapse/storage/databases/main/events.py +3765 -0
  486. synapse/storage/databases/main/events_bg_updates.py +2910 -0
  487. synapse/storage/databases/main/events_forward_extremities.py +126 -0
  488. synapse/storage/databases/main/events_worker.py +2786 -0
  489. synapse/storage/databases/main/experimental_features.py +130 -0
  490. synapse/storage/databases/main/filtering.py +231 -0
  491. synapse/storage/databases/main/keys.py +291 -0
  492. synapse/storage/databases/main/lock.py +553 -0
  493. synapse/storage/databases/main/media_repository.py +1068 -0
  494. synapse/storage/databases/main/metrics.py +460 -0
  495. synapse/storage/databases/main/monthly_active_users.py +443 -0
  496. synapse/storage/databases/main/openid.py +60 -0
  497. synapse/storage/databases/main/presence.py +509 -0
  498. synapse/storage/databases/main/profile.py +539 -0
  499. synapse/storage/databases/main/purge_events.py +521 -0
  500. synapse/storage/databases/main/push_rule.py +970 -0
  501. synapse/storage/databases/main/pusher.py +793 -0
  502. synapse/storage/databases/main/receipts.py +1341 -0
  503. synapse/storage/databases/main/registration.py +3072 -0
  504. synapse/storage/databases/main/rejections.py +37 -0
  505. synapse/storage/databases/main/relations.py +1116 -0
  506. synapse/storage/databases/main/room.py +2779 -0
  507. synapse/storage/databases/main/roommember.py +2110 -0
  508. synapse/storage/databases/main/search.py +939 -0
  509. synapse/storage/databases/main/session.py +151 -0
  510. synapse/storage/databases/main/signatures.py +94 -0
  511. synapse/storage/databases/main/sliding_sync.py +603 -0
  512. synapse/storage/databases/main/state.py +1002 -0
  513. synapse/storage/databases/main/state_deltas.py +329 -0
  514. synapse/storage/databases/main/stats.py +789 -0
  515. synapse/storage/databases/main/stream.py +2577 -0
  516. synapse/storage/databases/main/tags.py +360 -0
  517. synapse/storage/databases/main/task_scheduler.py +225 -0
  518. synapse/storage/databases/main/thread_subscriptions.py +589 -0
  519. synapse/storage/databases/main/transactions.py +675 -0
  520. synapse/storage/databases/main/ui_auth.py +420 -0
  521. synapse/storage/databases/main/user_directory.py +1330 -0
  522. synapse/storage/databases/main/user_erasure_store.py +117 -0
  523. synapse/storage/databases/state/__init__.py +22 -0
  524. synapse/storage/databases/state/bg_updates.py +497 -0
  525. synapse/storage/databases/state/deletion.py +557 -0
  526. synapse/storage/databases/state/store.py +948 -0
  527. synapse/storage/engines/__init__.py +70 -0
  528. synapse/storage/engines/_base.py +154 -0
  529. synapse/storage/engines/postgres.py +261 -0
  530. synapse/storage/engines/sqlite.py +199 -0
  531. synapse/storage/invite_rule.py +112 -0
  532. synapse/storage/keys.py +40 -0
  533. synapse/storage/prepare_database.py +730 -0
  534. synapse/storage/push_rule.py +28 -0
  535. synapse/storage/roommember.py +88 -0
  536. synapse/storage/schema/README.md +4 -0
  537. synapse/storage/schema/__init__.py +186 -0
  538. synapse/storage/schema/common/delta/25/00background_updates.sql +40 -0
  539. synapse/storage/schema/common/delta/35/00background_updates_add_col.sql +36 -0
  540. synapse/storage/schema/common/delta/58/00background_update_ordering.sql +38 -0
  541. synapse/storage/schema/common/full_schemas/72/full.sql.postgres +8 -0
  542. synapse/storage/schema/common/full_schemas/72/full.sql.sqlite +6 -0
  543. synapse/storage/schema/common/schema_version.sql +60 -0
  544. synapse/storage/schema/main/delta/12/v12.sql +82 -0
  545. synapse/storage/schema/main/delta/13/v13.sql +38 -0
  546. synapse/storage/schema/main/delta/14/v14.sql +42 -0
  547. synapse/storage/schema/main/delta/15/appservice_txns.sql +50 -0
  548. synapse/storage/schema/main/delta/15/presence_indices.sql +2 -0
  549. synapse/storage/schema/main/delta/15/v15.sql +24 -0
  550. synapse/storage/schema/main/delta/16/events_order_index.sql +4 -0
  551. synapse/storage/schema/main/delta/16/remote_media_cache_index.sql +2 -0
  552. synapse/storage/schema/main/delta/16/remove_duplicates.sql +9 -0
  553. synapse/storage/schema/main/delta/16/room_alias_index.sql +3 -0
  554. synapse/storage/schema/main/delta/16/unique_constraints.sql +72 -0
  555. synapse/storage/schema/main/delta/16/users.sql +56 -0
  556. synapse/storage/schema/main/delta/17/drop_indexes.sql +37 -0
  557. synapse/storage/schema/main/delta/17/server_keys.sql +43 -0
  558. synapse/storage/schema/main/delta/17/user_threepids.sql +9 -0
  559. synapse/storage/schema/main/delta/18/server_keys_bigger_ints.sql +51 -0
  560. synapse/storage/schema/main/delta/19/event_index.sql +38 -0
  561. synapse/storage/schema/main/delta/20/dummy.sql +1 -0
  562. synapse/storage/schema/main/delta/20/pushers.py +93 -0
  563. synapse/storage/schema/main/delta/21/end_to_end_keys.sql +53 -0
  564. synapse/storage/schema/main/delta/21/receipts.sql +57 -0
  565. synapse/storage/schema/main/delta/22/receipts_index.sql +41 -0
  566. synapse/storage/schema/main/delta/22/user_threepids_unique.sql +19 -0
  567. synapse/storage/schema/main/delta/24/stats_reporting.sql +37 -0
  568. synapse/storage/schema/main/delta/25/fts.py +81 -0
  569. synapse/storage/schema/main/delta/25/guest_access.sql +44 -0
  570. synapse/storage/schema/main/delta/25/history_visibility.sql +44 -0
  571. synapse/storage/schema/main/delta/25/tags.sql +57 -0
  572. synapse/storage/schema/main/delta/26/account_data.sql +36 -0
  573. synapse/storage/schema/main/delta/27/account_data.sql +55 -0
  574. synapse/storage/schema/main/delta/27/forgotten_memberships.sql +45 -0
  575. synapse/storage/schema/main/delta/27/ts.py +61 -0
  576. synapse/storage/schema/main/delta/28/event_push_actions.sql +46 -0
  577. synapse/storage/schema/main/delta/28/events_room_stream.sql +39 -0
  578. synapse/storage/schema/main/delta/28/public_roms_index.sql +39 -0
  579. synapse/storage/schema/main/delta/28/receipts_user_id_index.sql +41 -0
  580. synapse/storage/schema/main/delta/28/upgrade_times.sql +40 -0
  581. synapse/storage/schema/main/delta/28/users_is_guest.sql +41 -0
  582. synapse/storage/schema/main/delta/29/push_actions.sql +54 -0
  583. synapse/storage/schema/main/delta/30/alias_creator.sql +35 -0
  584. synapse/storage/schema/main/delta/30/as_users.py +82 -0
  585. synapse/storage/schema/main/delta/30/deleted_pushers.sql +44 -0
  586. synapse/storage/schema/main/delta/30/presence_stream.sql +49 -0
  587. synapse/storage/schema/main/delta/30/public_rooms.sql +42 -0
  588. synapse/storage/schema/main/delta/30/push_rule_stream.sql +57 -0
  589. synapse/storage/schema/main/delta/30/threepid_guest_access_tokens.sql +43 -0
  590. synapse/storage/schema/main/delta/31/invites.sql +61 -0
  591. synapse/storage/schema/main/delta/31/local_media_repository_url_cache.sql +46 -0
  592. synapse/storage/schema/main/delta/31/pushers_0.py +92 -0
  593. synapse/storage/schema/main/delta/31/pushers_index.sql +41 -0
  594. synapse/storage/schema/main/delta/31/search_update.py +65 -0
  595. synapse/storage/schema/main/delta/32/events.sql +35 -0
  596. synapse/storage/schema/main/delta/32/openid.sql +9 -0
  597. synapse/storage/schema/main/delta/32/pusher_throttle.sql +42 -0
  598. synapse/storage/schema/main/delta/32/remove_indices.sql +52 -0
  599. synapse/storage/schema/main/delta/32/reports.sql +44 -0
  600. synapse/storage/schema/main/delta/33/access_tokens_device_index.sql +36 -0
  601. synapse/storage/schema/main/delta/33/devices.sql +40 -0
  602. synapse/storage/schema/main/delta/33/devices_for_e2e_keys.sql +38 -0
  603. synapse/storage/schema/main/delta/33/devices_for_e2e_keys_clear_unknown_device.sql +39 -0
  604. synapse/storage/schema/main/delta/33/event_fields.py +61 -0
  605. synapse/storage/schema/main/delta/33/remote_media_ts.py +43 -0
  606. synapse/storage/schema/main/delta/33/user_ips_index.sql +36 -0
  607. synapse/storage/schema/main/delta/34/appservice_stream.sql +42 -0
  608. synapse/storage/schema/main/delta/34/cache_stream.py +50 -0
  609. synapse/storage/schema/main/delta/34/device_inbox.sql +43 -0
  610. synapse/storage/schema/main/delta/34/push_display_name_rename.sql +39 -0
  611. synapse/storage/schema/main/delta/34/received_txn_purge.py +36 -0
  612. synapse/storage/schema/main/delta/35/contains_url.sql +36 -0
  613. synapse/storage/schema/main/delta/35/device_outbox.sql +58 -0
  614. synapse/storage/schema/main/delta/35/device_stream_id.sql +40 -0
  615. synapse/storage/schema/main/delta/35/event_push_actions_index.sql +36 -0
  616. synapse/storage/schema/main/delta/35/public_room_list_change_stream.sql +52 -0
  617. synapse/storage/schema/main/delta/35/stream_order_to_extrem.sql +56 -0
  618. synapse/storage/schema/main/delta/36/readd_public_rooms.sql +45 -0
  619. synapse/storage/schema/main/delta/37/remove_auth_idx.py +89 -0
  620. synapse/storage/schema/main/delta/37/user_threepids.sql +71 -0
  621. synapse/storage/schema/main/delta/38/postgres_fts_gist.sql +38 -0
  622. synapse/storage/schema/main/delta/39/appservice_room_list.sql +48 -0
  623. synapse/storage/schema/main/delta/39/device_federation_stream_idx.sql +35 -0
  624. synapse/storage/schema/main/delta/39/event_push_index.sql +36 -0
  625. synapse/storage/schema/main/delta/39/federation_out_position.sql +41 -0
  626. synapse/storage/schema/main/delta/39/membership_profile.sql +39 -0
  627. synapse/storage/schema/main/delta/40/current_state_idx.sql +36 -0
  628. synapse/storage/schema/main/delta/40/device_inbox.sql +40 -0
  629. synapse/storage/schema/main/delta/40/device_list_streams.sql +79 -0
  630. synapse/storage/schema/main/delta/40/event_push_summary.sql +57 -0
  631. synapse/storage/schema/main/delta/40/pushers.sql +58 -0
  632. synapse/storage/schema/main/delta/41/device_list_stream_idx.sql +36 -0
  633. synapse/storage/schema/main/delta/41/device_outbound_index.sql +35 -0
  634. synapse/storage/schema/main/delta/41/event_search_event_id_idx.sql +36 -0
  635. synapse/storage/schema/main/delta/41/ratelimit.sql +41 -0
  636. synapse/storage/schema/main/delta/42/current_state_delta.sql +48 -0
  637. synapse/storage/schema/main/delta/42/device_list_last_id.sql +52 -0
  638. synapse/storage/schema/main/delta/42/event_auth_state_only.sql +36 -0
  639. synapse/storage/schema/main/delta/42/user_dir.py +88 -0
  640. synapse/storage/schema/main/delta/43/blocked_rooms.sql +40 -0
  641. synapse/storage/schema/main/delta/43/quarantine_media.sql +36 -0
  642. synapse/storage/schema/main/delta/43/url_cache.sql +35 -0
  643. synapse/storage/schema/main/delta/43/user_share.sql +52 -0
  644. synapse/storage/schema/main/delta/44/expire_url_cache.sql +60 -0
  645. synapse/storage/schema/main/delta/45/group_server.sql +186 -0
  646. synapse/storage/schema/main/delta/45/profile_cache.sql +47 -0
  647. synapse/storage/schema/main/delta/46/drop_refresh_tokens.sql +36 -0
  648. synapse/storage/schema/main/delta/46/drop_unique_deleted_pushers.sql +54 -0
  649. synapse/storage/schema/main/delta/46/group_server.sql +51 -0
  650. synapse/storage/schema/main/delta/46/local_media_repository_url_idx.sql +43 -0
  651. synapse/storage/schema/main/delta/46/user_dir_null_room_ids.sql +54 -0
  652. synapse/storage/schema/main/delta/46/user_dir_typos.sql +43 -0
  653. synapse/storage/schema/main/delta/47/last_access_media.sql +35 -0
  654. synapse/storage/schema/main/delta/47/postgres_fts_gin.sql +36 -0
  655. synapse/storage/schema/main/delta/47/push_actions_staging.sql +47 -0
  656. synapse/storage/schema/main/delta/48/add_user_consent.sql +37 -0
  657. synapse/storage/schema/main/delta/48/add_user_ips_last_seen_index.sql +36 -0
  658. synapse/storage/schema/main/delta/48/deactivated_users.sql +44 -0
  659. synapse/storage/schema/main/delta/48/group_unique_indexes.py +67 -0
  660. synapse/storage/schema/main/delta/48/groups_joinable.sql +41 -0
  661. synapse/storage/schema/main/delta/49/add_user_consent_server_notice_sent.sql +39 -0
  662. synapse/storage/schema/main/delta/49/add_user_daily_visits.sql +40 -0
  663. synapse/storage/schema/main/delta/49/add_user_ips_last_seen_only_index.sql +36 -0
  664. synapse/storage/schema/main/delta/50/add_creation_ts_users_index.sql +38 -0
  665. synapse/storage/schema/main/delta/50/erasure_store.sql +40 -0
  666. synapse/storage/schema/main/delta/50/make_event_content_nullable.py +102 -0
  667. synapse/storage/schema/main/delta/51/e2e_room_keys.sql +58 -0
  668. synapse/storage/schema/main/delta/51/monthly_active_users.sql +46 -0
  669. synapse/storage/schema/main/delta/52/add_event_to_state_group_index.sql +38 -0
  670. synapse/storage/schema/main/delta/52/device_list_streams_unique_idx.sql +55 -0
  671. synapse/storage/schema/main/delta/52/e2e_room_keys.sql +72 -0
  672. synapse/storage/schema/main/delta/53/add_user_type_to_users.sql +38 -0
  673. synapse/storage/schema/main/delta/53/drop_sent_transactions.sql +35 -0
  674. synapse/storage/schema/main/delta/53/event_format_version.sql +35 -0
  675. synapse/storage/schema/main/delta/53/user_dir_populate.sql +49 -0
  676. synapse/storage/schema/main/delta/53/user_ips_index.sql +49 -0
  677. synapse/storage/schema/main/delta/53/user_share.sql +63 -0
  678. synapse/storage/schema/main/delta/53/user_threepid_id.sql +48 -0
  679. synapse/storage/schema/main/delta/53/users_in_public_rooms.sql +47 -0
  680. synapse/storage/schema/main/delta/54/account_validity_with_renewal.sql +49 -0
  681. synapse/storage/schema/main/delta/54/add_validity_to_server_keys.sql +42 -0
  682. synapse/storage/schema/main/delta/54/delete_forward_extremities.sql +42 -0
  683. synapse/storage/schema/main/delta/54/drop_legacy_tables.sql +49 -0
  684. synapse/storage/schema/main/delta/54/drop_presence_list.sql +35 -0
  685. synapse/storage/schema/main/delta/54/relations.sql +46 -0
  686. synapse/storage/schema/main/delta/54/stats.sql +99 -0
  687. synapse/storage/schema/main/delta/54/stats2.sql +47 -0
  688. synapse/storage/schema/main/delta/55/access_token_expiry.sql +37 -0
  689. synapse/storage/schema/main/delta/55/track_threepid_validations.sql +50 -0
  690. synapse/storage/schema/main/delta/55/users_alter_deactivated.sql +38 -0
  691. synapse/storage/schema/main/delta/56/add_spans_to_device_lists.sql +39 -0
  692. synapse/storage/schema/main/delta/56/current_state_events_membership.sql +41 -0
  693. synapse/storage/schema/main/delta/56/current_state_events_membership_mk2.sql +43 -0
  694. synapse/storage/schema/main/delta/56/delete_keys_from_deleted_backups.sql +44 -0
  695. synapse/storage/schema/main/delta/56/destinations_failure_ts.sql +44 -0
  696. synapse/storage/schema/main/delta/56/destinations_retry_interval_type.sql.postgres +18 -0
  697. synapse/storage/schema/main/delta/56/device_stream_id_insert.sql +39 -0
  698. synapse/storage/schema/main/delta/56/devices_last_seen.sql +43 -0
  699. synapse/storage/schema/main/delta/56/drop_unused_event_tables.sql +39 -0
  700. synapse/storage/schema/main/delta/56/event_expiry.sql +40 -0
  701. synapse/storage/schema/main/delta/56/event_labels.sql +49 -0
  702. synapse/storage/schema/main/delta/56/event_labels_background_update.sql +36 -0
  703. synapse/storage/schema/main/delta/56/fix_room_keys_index.sql +37 -0
  704. synapse/storage/schema/main/delta/56/hidden_devices.sql +37 -0
  705. synapse/storage/schema/main/delta/56/hidden_devices_fix.sql.sqlite +42 -0
  706. synapse/storage/schema/main/delta/56/nuke_empty_communities_from_db.sql +48 -0
  707. synapse/storage/schema/main/delta/56/public_room_list_idx.sql +35 -0
  708. synapse/storage/schema/main/delta/56/redaction_censor.sql +35 -0
  709. synapse/storage/schema/main/delta/56/redaction_censor2.sql +41 -0
  710. synapse/storage/schema/main/delta/56/redaction_censor3_fix_update.sql.postgres +25 -0
  711. synapse/storage/schema/main/delta/56/redaction_censor4.sql +35 -0
  712. synapse/storage/schema/main/delta/56/remove_tombstoned_rooms_from_directory.sql +38 -0
  713. synapse/storage/schema/main/delta/56/room_key_etag.sql +36 -0
  714. synapse/storage/schema/main/delta/56/room_membership_idx.sql +37 -0
  715. synapse/storage/schema/main/delta/56/room_retention.sql +52 -0
  716. synapse/storage/schema/main/delta/56/signing_keys.sql +75 -0
  717. synapse/storage/schema/main/delta/56/signing_keys_nonunique_signatures.sql +41 -0
  718. synapse/storage/schema/main/delta/56/stats_separated.sql +175 -0
  719. synapse/storage/schema/main/delta/56/unique_user_filter_index.py +46 -0
  720. synapse/storage/schema/main/delta/56/user_external_ids.sql +43 -0
  721. synapse/storage/schema/main/delta/56/users_in_public_rooms_idx.sql +36 -0
  722. synapse/storage/schema/main/delta/57/delete_old_current_state_events.sql +41 -0
  723. synapse/storage/schema/main/delta/57/device_list_remote_cache_stale.sql +44 -0
  724. synapse/storage/schema/main/delta/57/local_current_membership.py +111 -0
  725. synapse/storage/schema/main/delta/57/remove_sent_outbound_pokes.sql +40 -0
  726. synapse/storage/schema/main/delta/57/rooms_version_column.sql +43 -0
  727. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.postgres +35 -0
  728. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.sqlite +22 -0
  729. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.postgres +39 -0
  730. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.sqlite +23 -0
  731. synapse/storage/schema/main/delta/58/02remove_dup_outbound_pokes.sql +41 -0
  732. synapse/storage/schema/main/delta/58/03persist_ui_auth.sql +55 -0
  733. synapse/storage/schema/main/delta/58/05cache_instance.sql.postgres +30 -0
  734. synapse/storage/schema/main/delta/58/06dlols_unique_idx.py +83 -0
  735. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.postgres +33 -0
  736. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.sqlite +44 -0
  737. synapse/storage/schema/main/delta/58/07persist_ui_auth_ips.sql +44 -0
  738. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.postgres +18 -0
  739. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.sqlite +18 -0
  740. synapse/storage/schema/main/delta/58/09shadow_ban.sql +37 -0
  741. synapse/storage/schema/main/delta/58/10_pushrules_enabled_delete_obsolete.sql +47 -0
  742. synapse/storage/schema/main/delta/58/10drop_local_rejections_stream.sql +41 -0
  743. synapse/storage/schema/main/delta/58/10federation_pos_instance_name.sql +41 -0
  744. synapse/storage/schema/main/delta/58/11dehydration.sql +39 -0
  745. synapse/storage/schema/main/delta/58/11fallback.sql +43 -0
  746. synapse/storage/schema/main/delta/58/11user_id_seq.py +38 -0
  747. synapse/storage/schema/main/delta/58/12room_stats.sql +51 -0
  748. synapse/storage/schema/main/delta/58/13remove_presence_allow_inbound.sql +36 -0
  749. synapse/storage/schema/main/delta/58/14events_instance_name.sql +35 -0
  750. synapse/storage/schema/main/delta/58/14events_instance_name.sql.postgres +28 -0
  751. synapse/storage/schema/main/delta/58/15_catchup_destination_rooms.sql +61 -0
  752. synapse/storage/schema/main/delta/58/15unread_count.sql +45 -0
  753. synapse/storage/schema/main/delta/58/16populate_stats_process_rooms_fix.sql +41 -0
  754. synapse/storage/schema/main/delta/58/17_catchup_last_successful.sql +40 -0
  755. synapse/storage/schema/main/delta/58/18stream_positions.sql +41 -0
  756. synapse/storage/schema/main/delta/58/19instance_map.sql.postgres +25 -0
  757. synapse/storage/schema/main/delta/58/19txn_id.sql +59 -0
  758. synapse/storage/schema/main/delta/58/20instance_name_event_tables.sql +36 -0
  759. synapse/storage/schema/main/delta/58/20user_daily_visits.sql +37 -0
  760. synapse/storage/schema/main/delta/58/21as_device_stream.sql +36 -0
  761. synapse/storage/schema/main/delta/58/21drop_device_max_stream_id.sql +1 -0
  762. synapse/storage/schema/main/delta/58/22puppet_token.sql +36 -0
  763. synapse/storage/schema/main/delta/58/22users_have_local_media.sql +2 -0
  764. synapse/storage/schema/main/delta/58/23e2e_cross_signing_keys_idx.sql +36 -0
  765. synapse/storage/schema/main/delta/58/24drop_event_json_index.sql +38 -0
  766. synapse/storage/schema/main/delta/58/25user_external_ids_user_id_idx.sql +36 -0
  767. synapse/storage/schema/main/delta/58/26access_token_last_validated.sql +37 -0
  768. synapse/storage/schema/main/delta/58/27local_invites.sql +37 -0
  769. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.postgres +16 -0
  770. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.sqlite +62 -0
  771. synapse/storage/schema/main/delta/59/01ignored_user.py +85 -0
  772. synapse/storage/schema/main/delta/59/02shard_send_to_device.sql +37 -0
  773. synapse/storage/schema/main/delta/59/03shard_send_to_device_sequence.sql.postgres +25 -0
  774. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql +71 -0
  775. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql.postgres +16 -0
  776. synapse/storage/schema/main/delta/59/04drop_account_data.sql +36 -0
  777. synapse/storage/schema/main/delta/59/05cache_invalidation.sql +36 -0
  778. synapse/storage/schema/main/delta/59/06chain_cover_index.sql +36 -0
  779. synapse/storage/schema/main/delta/59/06shard_account_data.sql +39 -0
  780. synapse/storage/schema/main/delta/59/06shard_account_data.sql.postgres +32 -0
  781. synapse/storage/schema/main/delta/59/07shard_account_data_fix.sql +37 -0
  782. synapse/storage/schema/main/delta/59/08delete_pushers_for_deactivated_accounts.sql +39 -0
  783. synapse/storage/schema/main/delta/59/08delete_stale_pushers.sql +39 -0
  784. synapse/storage/schema/main/delta/59/09rejected_events_metadata.sql +45 -0
  785. synapse/storage/schema/main/delta/59/10delete_purged_chain_cover.sql +36 -0
  786. synapse/storage/schema/main/delta/59/11add_knock_members_to_stats.sql +39 -0
  787. synapse/storage/schema/main/delta/59/11drop_thumbnail_constraint.sql.postgres +22 -0
  788. synapse/storage/schema/main/delta/59/12account_validity_token_used_ts_ms.sql +37 -0
  789. synapse/storage/schema/main/delta/59/12presence_stream_instance.sql +37 -0
  790. synapse/storage/schema/main/delta/59/12presence_stream_instance_seq.sql.postgres +20 -0
  791. synapse/storage/schema/main/delta/59/13users_to_send_full_presence_to.sql +53 -0
  792. synapse/storage/schema/main/delta/59/14refresh_tokens.sql +53 -0
  793. synapse/storage/schema/main/delta/59/15locks.sql +56 -0
  794. synapse/storage/schema/main/delta/59/16federation_inbound_staging.sql +51 -0
  795. synapse/storage/schema/main/delta/60/01recreate_stream_ordering.sql.postgres +45 -0
  796. synapse/storage/schema/main/delta/60/02change_stream_ordering_columns.sql.postgres +30 -0
  797. synapse/storage/schema/main/delta/61/01change_appservices_txns.sql.postgres +23 -0
  798. synapse/storage/schema/main/delta/61/01insertion_event_lookups.sql +68 -0
  799. synapse/storage/schema/main/delta/61/02drop_redundant_room_depth_index.sql +37 -0
  800. synapse/storage/schema/main/delta/61/03recreate_min_depth.py +74 -0
  801. synapse/storage/schema/main/delta/62/01insertion_event_extremities.sql +43 -0
  802. synapse/storage/schema/main/delta/63/01create_registration_tokens.sql +42 -0
  803. synapse/storage/schema/main/delta/63/02delete_unlinked_email_pushers.sql +39 -0
  804. synapse/storage/schema/main/delta/63/02populate-rooms-creator.sql +36 -0
  805. synapse/storage/schema/main/delta/63/03session_store.sql +42 -0
  806. synapse/storage/schema/main/delta/63/04add_presence_stream_not_offline_index.sql +37 -0
  807. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.postgres +23 -0
  808. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.sqlite +37 -0
  809. synapse/storage/schema/main/delta/65/01msc2716_insertion_event_edges.sql +38 -0
  810. synapse/storage/schema/main/delta/65/03remove_hidden_devices_from_device_inbox.sql +41 -0
  811. synapse/storage/schema/main/delta/65/04_local_group_updates.sql +37 -0
  812. synapse/storage/schema/main/delta/65/05_remove_room_stats_historical_and_user_stats_historical.sql +38 -0
  813. synapse/storage/schema/main/delta/65/06remove_deleted_devices_from_device_inbox.sql +53 -0
  814. synapse/storage/schema/main/delta/65/07_arbitrary_relations.sql +37 -0
  815. synapse/storage/schema/main/delta/65/08_device_inbox_background_updates.sql +37 -0
  816. synapse/storage/schema/main/delta/65/10_expirable_refresh_tokens.sql +47 -0
  817. synapse/storage/schema/main/delta/65/11_devices_auth_provider_session.sql +46 -0
  818. synapse/storage/schema/main/delta/67/01drop_public_room_list_stream.sql +37 -0
  819. synapse/storage/schema/main/delta/68/01event_columns.sql +45 -0
  820. synapse/storage/schema/main/delta/68/02_msc2409_add_device_id_appservice_stream_type.sql +40 -0
  821. synapse/storage/schema/main/delta/68/03_delete_account_data_for_deactivated_accounts.sql +39 -0
  822. synapse/storage/schema/main/delta/68/04_refresh_tokens_index_next_token_id.sql +47 -0
  823. synapse/storage/schema/main/delta/68/04partial_state_rooms.sql +60 -0
  824. synapse/storage/schema/main/delta/68/05_delete_non_strings_from_event_search.sql.sqlite +22 -0
  825. synapse/storage/schema/main/delta/68/05partial_state_rooms_triggers.py +80 -0
  826. synapse/storage/schema/main/delta/68/06_msc3202_add_device_list_appservice_stream_type.sql +42 -0
  827. synapse/storage/schema/main/delta/69/01as_txn_seq.py +54 -0
  828. synapse/storage/schema/main/delta/69/01device_list_oubound_by_room.sql +57 -0
  829. synapse/storage/schema/main/delta/69/02cache_invalidation_index.sql +37 -0
  830. synapse/storage/schema/main/delta/70/01clean_table_purged_rooms.sql +39 -0
  831. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.postgres +43 -0
  832. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.sqlite +47 -0
  833. synapse/storage/schema/main/delta/71/01remove_noop_background_updates.sql +80 -0
  834. synapse/storage/schema/main/delta/71/02event_push_summary_unique.sql +37 -0
  835. synapse/storage/schema/main/delta/72/01add_room_type_to_state_stats.sql +38 -0
  836. synapse/storage/schema/main/delta/72/01event_push_summary_receipt.sql +54 -0
  837. synapse/storage/schema/main/delta/72/02event_push_actions_index.sql +38 -0
  838. synapse/storage/schema/main/delta/72/03bg_populate_events_columns.py +57 -0
  839. synapse/storage/schema/main/delta/72/03drop_event_reference_hashes.sql +36 -0
  840. synapse/storage/schema/main/delta/72/03remove_groups.sql +50 -0
  841. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.postgres +17 -0
  842. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.sqlite +40 -0
  843. synapse/storage/schema/main/delta/72/05receipts_event_stream_ordering.sql +38 -0
  844. synapse/storage/schema/main/delta/72/05remove_unstable_private_read_receipts.sql +38 -0
  845. synapse/storage/schema/main/delta/72/06add_consent_ts_to_users.sql +35 -0
  846. synapse/storage/schema/main/delta/72/06thread_notifications.sql +49 -0
  847. synapse/storage/schema/main/delta/72/07force_update_current_state_events_membership.py +67 -0
  848. synapse/storage/schema/main/delta/72/07thread_receipts.sql.postgres +30 -0
  849. synapse/storage/schema/main/delta/72/07thread_receipts.sql.sqlite +70 -0
  850. synapse/storage/schema/main/delta/72/08begin_cache_invalidation_seq_at_2.sql.postgres +23 -0
  851. synapse/storage/schema/main/delta/72/08thread_receipts.sql +39 -0
  852. synapse/storage/schema/main/delta/72/09partial_indices.sql.sqlite +56 -0
  853. synapse/storage/schema/main/delta/73/01event_failed_pull_attempts.sql +48 -0
  854. synapse/storage/schema/main/delta/73/02add_pusher_enabled.sql +35 -0
  855. synapse/storage/schema/main/delta/73/02room_id_indexes_for_purging.sql +41 -0
  856. synapse/storage/schema/main/delta/73/03pusher_device_id.sql +39 -0
  857. synapse/storage/schema/main/delta/73/03users_approved_column.sql +39 -0
  858. synapse/storage/schema/main/delta/73/04partial_join_details.sql +42 -0
  859. synapse/storage/schema/main/delta/73/04pending_device_list_updates.sql +47 -0
  860. synapse/storage/schema/main/delta/73/05old_push_actions.sql.postgres +22 -0
  861. synapse/storage/schema/main/delta/73/05old_push_actions.sql.sqlite +24 -0
  862. synapse/storage/schema/main/delta/73/06thread_notifications_thread_id_idx.sql +42 -0
  863. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.postgres +23 -0
  864. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.sqlite +76 -0
  865. synapse/storage/schema/main/delta/73/09partial_joined_via_destination.sql +37 -0
  866. synapse/storage/schema/main/delta/73/09threads_table.sql +49 -0
  867. synapse/storage/schema/main/delta/73/10_update_sqlite_fts4_tokenizer.py +71 -0
  868. synapse/storage/schema/main/delta/73/10login_tokens.sql +54 -0
  869. synapse/storage/schema/main/delta/73/11event_search_room_id_n_distinct.sql.postgres +33 -0
  870. synapse/storage/schema/main/delta/73/12refactor_device_list_outbound_pokes.sql +72 -0
  871. synapse/storage/schema/main/delta/73/13add_device_lists_index.sql +39 -0
  872. synapse/storage/schema/main/delta/73/20_un_partial_stated_room_stream.sql +51 -0
  873. synapse/storage/schema/main/delta/73/21_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  874. synapse/storage/schema/main/delta/73/22_rebuild_user_dir_stats.sql +48 -0
  875. synapse/storage/schema/main/delta/73/22_un_partial_stated_event_stream.sql +53 -0
  876. synapse/storage/schema/main/delta/73/23_fix_thread_index.sql +52 -0
  877. synapse/storage/schema/main/delta/73/23_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  878. synapse/storage/schema/main/delta/73/24_events_jump_to_date_index.sql +36 -0
  879. synapse/storage/schema/main/delta/73/25drop_presence.sql +36 -0
  880. synapse/storage/schema/main/delta/74/01_user_directory_stale_remote_users.sql +58 -0
  881. synapse/storage/schema/main/delta/74/02_set_device_id_for_pushers_bg_update.sql +38 -0
  882. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.postgres +29 -0
  883. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.sqlite +23 -0
  884. synapse/storage/schema/main/delta/74/03_room_membership_index.sql +38 -0
  885. synapse/storage/schema/main/delta/74/04_delete_e2e_backup_keys_for_deactivated_users.sql +36 -0
  886. synapse/storage/schema/main/delta/74/04_membership_tables_event_stream_ordering_triggers.py +87 -0
  887. synapse/storage/schema/main/delta/74/05_events_txn_id_device_id.sql +72 -0
  888. synapse/storage/schema/main/delta/74/90COMMENTS_destinations.sql.postgres +52 -0
  889. synapse/storage/schema/main/delta/76/01_add_profiles_full_user_id_column.sql +39 -0
  890. synapse/storage/schema/main/delta/76/02_add_user_filters_full_user_id_column.sql +39 -0
  891. synapse/storage/schema/main/delta/76/03_per_user_experimental_features.sql +46 -0
  892. synapse/storage/schema/main/delta/76/04_add_room_forgetter.sql +43 -0
  893. synapse/storage/schema/main/delta/77/01_add_profiles_not_valid_check.sql.postgres +16 -0
  894. synapse/storage/schema/main/delta/77/02_add_user_filters_not_valid_check.sql.postgres +16 -0
  895. synapse/storage/schema/main/delta/77/03bg_populate_full_user_id_profiles.sql +35 -0
  896. synapse/storage/schema/main/delta/77/04bg_populate_full_user_id_user_filters.sql +35 -0
  897. synapse/storage/schema/main/delta/77/05thread_notifications_backfill.sql +67 -0
  898. synapse/storage/schema/main/delta/77/06thread_notifications_not_null.sql.sqlite +102 -0
  899. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions.sql.postgres +27 -0
  900. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions_staging.sql.postgres +27 -0
  901. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_summary.sql.postgres +29 -0
  902. synapse/storage/schema/main/delta/77/14bg_indices_event_stream_ordering.sql +39 -0
  903. synapse/storage/schema/main/delta/78/01_validate_and_update_profiles.py +99 -0
  904. synapse/storage/schema/main/delta/78/02_validate_and_update_user_filters.py +100 -0
  905. synapse/storage/schema/main/delta/78/03_remove_unused_indexes_user_filters.py +72 -0
  906. synapse/storage/schema/main/delta/78/03event_extremities_constraints.py +65 -0
  907. synapse/storage/schema/main/delta/78/04_add_full_user_id_index_user_filters.py +32 -0
  908. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.postgres +102 -0
  909. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.sqlite +72 -0
  910. synapse/storage/schema/main/delta/79/04_mitigate_stream_ordering_update_race.py +70 -0
  911. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.postgres +69 -0
  912. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.sqlite +65 -0
  913. synapse/storage/schema/main/delta/80/01_users_alter_locked.sql +35 -0
  914. synapse/storage/schema/main/delta/80/02_read_write_locks_unlogged.sql.postgres +30 -0
  915. synapse/storage/schema/main/delta/80/02_scheduled_tasks.sql +47 -0
  916. synapse/storage/schema/main/delta/80/03_read_write_locks_triggers.sql.postgres +37 -0
  917. synapse/storage/schema/main/delta/80/04_read_write_locks_deadlock.sql.postgres +71 -0
  918. synapse/storage/schema/main/delta/82/02_scheduled_tasks_index.sql +35 -0
  919. synapse/storage/schema/main/delta/82/04_add_indices_for_purging_rooms.sql +39 -0
  920. synapse/storage/schema/main/delta/82/05gaps.sql +44 -0
  921. synapse/storage/schema/main/delta/83/01_drop_old_tables.sql +43 -0
  922. synapse/storage/schema/main/delta/83/03_instance_name_receipts.sql.sqlite +17 -0
  923. synapse/storage/schema/main/delta/83/05_cross_signing_key_update_grant.sql +34 -0
  924. synapse/storage/schema/main/delta/83/06_event_push_summary_room.sql +36 -0
  925. synapse/storage/schema/main/delta/84/01_auth_links_stats.sql.postgres +20 -0
  926. synapse/storage/schema/main/delta/84/02_auth_links_index.sql +16 -0
  927. synapse/storage/schema/main/delta/84/03_auth_links_analyze.sql.postgres +16 -0
  928. synapse/storage/schema/main/delta/84/04_access_token_index.sql +15 -0
  929. synapse/storage/schema/main/delta/85/01_add_suspended.sql +14 -0
  930. synapse/storage/schema/main/delta/85/02_add_instance_names.sql +27 -0
  931. synapse/storage/schema/main/delta/85/03_new_sequences.sql.postgres +54 -0
  932. synapse/storage/schema/main/delta/85/04_cleanup_device_federation_outbox.sql +15 -0
  933. synapse/storage/schema/main/delta/85/05_add_instance_names_converted_pos.sql +16 -0
  934. synapse/storage/schema/main/delta/85/06_add_room_reports.sql +20 -0
  935. synapse/storage/schema/main/delta/86/01_authenticate_media.sql +15 -0
  936. synapse/storage/schema/main/delta/86/02_receipts_event_id_index.sql +15 -0
  937. synapse/storage/schema/main/delta/87/01_sliding_sync_memberships.sql +169 -0
  938. synapse/storage/schema/main/delta/87/02_per_connection_state.sql +81 -0
  939. synapse/storage/schema/main/delta/87/03_current_state_index.sql +19 -0
  940. synapse/storage/schema/main/delta/88/01_add_delayed_events.sql +43 -0
  941. synapse/storage/schema/main/delta/88/01_custom_profile_fields.sql +15 -0
  942. synapse/storage/schema/main/delta/88/02_fix_sliding_sync_membership_snapshots_forgotten_column.sql +21 -0
  943. synapse/storage/schema/main/delta/88/03_add_otk_ts_added_index.sql +18 -0
  944. synapse/storage/schema/main/delta/88/04_current_state_delta_index.sql +18 -0
  945. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.postgres +19 -0
  946. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.sqlite +19 -0
  947. synapse/storage/schema/main/delta/88/05_sliding_sync_room_config_index.sql +20 -0
  948. synapse/storage/schema/main/delta/88/06_events_received_ts_index.sql +17 -0
  949. synapse/storage/schema/main/delta/89/01_sliding_sync_membership_snapshot_index.sql +15 -0
  950. synapse/storage/schema/main/delta/90/01_add_column_participant_room_memberships_table.sql +16 -0
  951. synapse/storage/schema/main/delta/91/01_media_hash.sql +28 -0
  952. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.postgres +16 -0
  953. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.sqlite +16 -0
  954. synapse/storage/schema/main/delta/92/02_remove_populate_participant_bg_update.sql +17 -0
  955. synapse/storage/schema/main/delta/92/04_ss_membership_snapshot_idx.sql +16 -0
  956. synapse/storage/schema/main/delta/92/04_thread_subscriptions.sql +59 -0
  957. synapse/storage/schema/main/delta/92/04_thread_subscriptions_seq.sql.postgres +19 -0
  958. synapse/storage/schema/main/delta/92/05_fixup_max_depth_cap.sql +17 -0
  959. synapse/storage/schema/main/delta/92/05_thread_subscriptions_comments.sql.postgres +18 -0
  960. synapse/storage/schema/main/delta/92/06_device_federation_inbox_index.sql +16 -0
  961. synapse/storage/schema/main/delta/92/06_threads_last_sent_stream_ordering_comments.sql.postgres +24 -0
  962. synapse/storage/schema/main/delta/92/07_add_user_reports.sql +22 -0
  963. synapse/storage/schema/main/delta/92/07_event_txn_id_device_id_txn_id2.sql +15 -0
  964. synapse/storage/schema/main/delta/92/08_room_ban_redactions.sql +21 -0
  965. synapse/storage/schema/main/delta/92/08_thread_subscriptions_seq_fixup.sql.postgres +19 -0
  966. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql +20 -0
  967. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql.postgres +18 -0
  968. synapse/storage/schema/main/delta/93/01_add_delayed_events.sql +15 -0
  969. synapse/storage/schema/main/full_schemas/72/full.sql.postgres +1344 -0
  970. synapse/storage/schema/main/full_schemas/72/full.sql.sqlite +646 -0
  971. synapse/storage/schema/state/delta/23/drop_state_index.sql +35 -0
  972. synapse/storage/schema/state/delta/32/remove_state_indices.sql +38 -0
  973. synapse/storage/schema/state/delta/35/add_state_index.sql +36 -0
  974. synapse/storage/schema/state/delta/35/state.sql +41 -0
  975. synapse/storage/schema/state/delta/35/state_dedupe.sql +36 -0
  976. synapse/storage/schema/state/delta/47/state_group_seq.py +38 -0
  977. synapse/storage/schema/state/delta/56/state_group_room_idx.sql +36 -0
  978. synapse/storage/schema/state/delta/61/02state_groups_state_n_distinct.sql.postgres +34 -0
  979. synapse/storage/schema/state/delta/70/08_state_group_edges_unique.sql +36 -0
  980. synapse/storage/schema/state/delta/89/01_state_groups_deletion.sql +39 -0
  981. synapse/storage/schema/state/delta/90/02_delete_unreferenced_state_groups.sql +16 -0
  982. synapse/storage/schema/state/delta/90/03_remove_old_deletion_bg_update.sql +15 -0
  983. synapse/storage/schema/state/full_schemas/72/full.sql.postgres +30 -0
  984. synapse/storage/schema/state/full_schemas/72/full.sql.sqlite +20 -0
  985. synapse/storage/types.py +183 -0
  986. synapse/storage/util/__init__.py +20 -0
  987. synapse/storage/util/id_generators.py +928 -0
  988. synapse/storage/util/partial_state_events_tracker.py +194 -0
  989. synapse/storage/util/sequence.py +315 -0
  990. synapse/streams/__init__.py +43 -0
  991. synapse/streams/config.py +91 -0
  992. synapse/streams/events.py +203 -0
  993. synapse/synapse_rust/__init__.pyi +3 -0
  994. synapse/synapse_rust/acl.pyi +20 -0
  995. synapse/synapse_rust/events.pyi +136 -0
  996. synapse/synapse_rust/http_client.pyi +32 -0
  997. synapse/synapse_rust/push.pyi +86 -0
  998. synapse/synapse_rust/rendezvous.pyi +30 -0
  999. synapse/synapse_rust/segmenter.pyi +1 -0
  1000. synapse/synapse_rust.abi3.so +0 -0
  1001. synapse/types/__init__.py +1600 -0
  1002. synapse/types/handlers/__init__.py +93 -0
  1003. synapse/types/handlers/policy_server.py +16 -0
  1004. synapse/types/handlers/sliding_sync.py +908 -0
  1005. synapse/types/rest/__init__.py +25 -0
  1006. synapse/types/rest/client/__init__.py +413 -0
  1007. synapse/types/state.py +634 -0
  1008. synapse/types/storage/__init__.py +66 -0
  1009. synapse/util/__init__.py +169 -0
  1010. synapse/util/async_helpers.py +1045 -0
  1011. synapse/util/background_queue.py +142 -0
  1012. synapse/util/batching_queue.py +202 -0
  1013. synapse/util/caches/__init__.py +300 -0
  1014. synapse/util/caches/cached_call.py +143 -0
  1015. synapse/util/caches/deferred_cache.py +530 -0
  1016. synapse/util/caches/descriptors.py +692 -0
  1017. synapse/util/caches/dictionary_cache.py +346 -0
  1018. synapse/util/caches/expiringcache.py +249 -0
  1019. synapse/util/caches/lrucache.py +975 -0
  1020. synapse/util/caches/response_cache.py +322 -0
  1021. synapse/util/caches/stream_change_cache.py +370 -0
  1022. synapse/util/caches/treecache.py +189 -0
  1023. synapse/util/caches/ttlcache.py +197 -0
  1024. synapse/util/cancellation.py +63 -0
  1025. synapse/util/check_dependencies.py +335 -0
  1026. synapse/util/clock.py +567 -0
  1027. synapse/util/constants.py +22 -0
  1028. synapse/util/daemonize.py +165 -0
  1029. synapse/util/distributor.py +157 -0
  1030. synapse/util/events.py +134 -0
  1031. synapse/util/file_consumer.py +164 -0
  1032. synapse/util/frozenutils.py +57 -0
  1033. synapse/util/gai_resolver.py +178 -0
  1034. synapse/util/hash.py +38 -0
  1035. synapse/util/httpresourcetree.py +108 -0
  1036. synapse/util/iterutils.py +189 -0
  1037. synapse/util/json.py +56 -0
  1038. synapse/util/linked_list.py +156 -0
  1039. synapse/util/logcontext.py +46 -0
  1040. synapse/util/logformatter.py +28 -0
  1041. synapse/util/macaroons.py +325 -0
  1042. synapse/util/manhole.py +191 -0
  1043. synapse/util/metrics.py +339 -0
  1044. synapse/util/module_loader.py +116 -0
  1045. synapse/util/msisdn.py +51 -0
  1046. synapse/util/patch_inline_callbacks.py +250 -0
  1047. synapse/util/pydantic_models.py +63 -0
  1048. synapse/util/ratelimitutils.py +419 -0
  1049. synapse/util/retryutils.py +339 -0
  1050. synapse/util/rlimit.py +42 -0
  1051. synapse/util/rust.py +133 -0
  1052. synapse/util/sentinel.py +21 -0
  1053. synapse/util/stringutils.py +293 -0
  1054. synapse/util/task_scheduler.py +493 -0
  1055. synapse/util/templates.py +126 -0
  1056. synapse/util/threepids.py +123 -0
  1057. synapse/util/wheel_timer.py +112 -0
  1058. synapse/visibility.py +835 -0
@@ -0,0 +1,1873 @@
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
+ TextIO,
37
+ TypeVar,
38
+ cast,
39
+ overload,
40
+ )
41
+
42
+ import attr
43
+ import treq
44
+ from canonicaljson import encode_canonical_json
45
+ from prometheus_client import Counter
46
+ from signedjson.sign import sign_json
47
+
48
+ from twisted.internet import defer
49
+ from twisted.internet.error import DNSLookupError
50
+ from twisted.internet.interfaces import IReactorTime
51
+ from twisted.internet.task import Cooperator
52
+ from twisted.web.client import ResponseFailed
53
+ from twisted.web.http_headers import Headers
54
+ from twisted.web.iweb import UNKNOWN_LENGTH, IAgent, IBodyProducer, IResponse
55
+
56
+ import synapse.metrics
57
+ import synapse.util.retryutils
58
+ from synapse.api.errors import (
59
+ Codes,
60
+ FederationDeniedError,
61
+ HttpResponseException,
62
+ RequestSendFailed,
63
+ SynapseError,
64
+ )
65
+ from synapse.api.ratelimiting import Ratelimiter
66
+ from synapse.crypto.context_factory import FederationPolicyForHTTPS
67
+ from synapse.http import QuieterFileBodyProducer
68
+ from synapse.http.client import (
69
+ BlocklistingAgentWrapper,
70
+ BodyExceededMaxSize,
71
+ ByteWriteable,
72
+ SimpleHttpClient,
73
+ _make_scheduler,
74
+ encode_query_args,
75
+ read_body_with_max_size,
76
+ read_multipart_response,
77
+ )
78
+ from synapse.http.connectproxyclient import BearerProxyCredentials
79
+ from synapse.http.federation.matrix_federation_agent import MatrixFederationAgent
80
+ from synapse.http.proxyagent import ProxyAgent
81
+ from synapse.http.types import QueryParams
82
+ from synapse.logging import opentracing
83
+ from synapse.logging.context import make_deferred_yieldable, run_in_background
84
+ from synapse.logging.opentracing import set_tag, start_active_span, tags
85
+ from synapse.metrics import SERVER_NAME_LABEL
86
+ from synapse.types import JsonDict
87
+ from synapse.util.async_helpers import AwakenableSleeper, Linearizer, timeout_deferred
88
+ from synapse.util.clock import Clock
89
+ from synapse.util.json import json_decoder
90
+ from synapse.util.metrics import Measure
91
+ from synapse.util.stringutils import parse_and_validate_server_name
92
+
93
+ if TYPE_CHECKING:
94
+ from synapse.server import HomeServer
95
+
96
+ logger = logging.getLogger(__name__)
97
+
98
+ outgoing_requests_counter = Counter(
99
+ "synapse_http_matrixfederationclient_requests",
100
+ "",
101
+ labelnames=["method", SERVER_NAME_LABEL],
102
+ )
103
+ incoming_responses_counter = Counter(
104
+ "synapse_http_matrixfederationclient_responses",
105
+ "",
106
+ labelnames=["method", "code", SERVER_NAME_LABEL],
107
+ )
108
+
109
+
110
+ MAXINT = sys.maxsize
111
+
112
+
113
+ _next_id = 1
114
+
115
+ T = TypeVar("T")
116
+
117
+
118
+ class ByteParser(ByteWriteable, Generic[T], abc.ABC):
119
+ """A `ByteWriteable` that has an additional `finish` function that returns
120
+ the parsed data.
121
+ """
122
+
123
+ CONTENT_TYPE: str = abc.abstractproperty() # type: ignore
124
+ """The expected content type of the response, e.g. `application/json`. If
125
+ the content type doesn't match we fail the request.
126
+ """
127
+
128
+ # a federation response can be rather large (eg a big state_ids is 50M or so), so we
129
+ # need a generous limit here.
130
+ MAX_RESPONSE_SIZE: int = 100 * 1024 * 1024
131
+ """The largest response this parser will accept."""
132
+
133
+ @abc.abstractmethod
134
+ def finish(self) -> T:
135
+ """Called when response has finished streaming and the parser should
136
+ return the final result (or error).
137
+ """
138
+
139
+
140
+ @attr.s(slots=True, frozen=True, auto_attribs=True)
141
+ class MatrixFederationRequest:
142
+ method: str
143
+ """HTTP method
144
+ """
145
+
146
+ path: str
147
+ """HTTP path
148
+ """
149
+
150
+ destination: str
151
+ """The remote server to send the HTTP request to.
152
+ """
153
+
154
+ json: JsonDict | None = None
155
+ """JSON to send in the body.
156
+ """
157
+
158
+ json_callback: Callable[[], JsonDict] | None = None
159
+ """A callback to generate the JSON.
160
+ """
161
+
162
+ query: QueryParams | None = None
163
+ """Query arguments.
164
+ """
165
+
166
+ txn_id: str = attr.ib(init=False)
167
+ """Unique ID for this request (for logging), this is autogenerated.
168
+ """
169
+
170
+ uri: bytes = b""
171
+ """The URI of this request, usually generated from the above information.
172
+ """
173
+
174
+ _generate_uri: bool = True
175
+ """True to automatically generate the uri field based on the above information.
176
+
177
+ Set to False if manually configuring the URI.
178
+ """
179
+
180
+ def __attrs_post_init__(self) -> None:
181
+ global _next_id
182
+ txn_id = "%s-O-%s" % (self.method, _next_id)
183
+ _next_id = (_next_id + 1) % (MAXINT - 1)
184
+
185
+ object.__setattr__(self, "txn_id", txn_id)
186
+
187
+ if self._generate_uri:
188
+ destination_bytes = self.destination.encode("ascii")
189
+ path_bytes = self.path.encode("ascii")
190
+ query_bytes = encode_query_args(self.query)
191
+
192
+ # The object is frozen so we can pre-compute this.
193
+ uri = urllib.parse.urlunparse(
194
+ (
195
+ b"matrix-federation",
196
+ destination_bytes,
197
+ path_bytes,
198
+ None,
199
+ query_bytes,
200
+ b"",
201
+ )
202
+ )
203
+ object.__setattr__(self, "uri", uri)
204
+
205
+ def get_json(self) -> JsonDict | None:
206
+ if self.json_callback:
207
+ return self.json_callback()
208
+ return self.json
209
+
210
+
211
+ class _BaseJsonParser(ByteParser[T]):
212
+ """A parser that buffers the response and tries to parse it as JSON."""
213
+
214
+ CONTENT_TYPE = "application/json"
215
+
216
+ def __init__(
217
+ self, validator: Callable[[object | None], bool] | None = None
218
+ ) -> None:
219
+ """
220
+ Args:
221
+ validator: A callable which takes the parsed JSON value and returns
222
+ true if the value is valid.
223
+ """
224
+ self._buffer = StringIO()
225
+ self._binary_wrapper = BinaryIOWrapper(self._buffer)
226
+ self._validator = validator
227
+
228
+ def write(self, data: bytes) -> int:
229
+ return self._binary_wrapper.write(data)
230
+
231
+ def finish(self) -> T:
232
+ result = json_decoder.decode(self._buffer.getvalue())
233
+ if self._validator is not None and not self._validator(result):
234
+ raise ValueError(
235
+ f"Received incorrect JSON value: {result.__class__.__name__}"
236
+ )
237
+ return result
238
+
239
+
240
+ class JsonParser(_BaseJsonParser[JsonDict]):
241
+ """A parser that buffers the response and tries to parse it as a JSON object."""
242
+
243
+ def __init__(self) -> None:
244
+ super().__init__(self._validate)
245
+
246
+ @staticmethod
247
+ def _validate(v: Any) -> bool:
248
+ return isinstance(v, dict)
249
+
250
+
251
+ class LegacyJsonSendParser(_BaseJsonParser[tuple[int, JsonDict]]):
252
+ """Ensure the legacy responses of /send_join & /send_leave are correct."""
253
+
254
+ def __init__(self) -> None:
255
+ super().__init__(self._validate)
256
+
257
+ @staticmethod
258
+ def _validate(v: Any) -> bool:
259
+ # Match [integer, JSON dict]
260
+ return (
261
+ isinstance(v, list)
262
+ and len(v) == 2
263
+ and type(v[0]) == int # noqa: E721
264
+ and isinstance(v[1], dict)
265
+ )
266
+
267
+
268
+ async def _handle_response(
269
+ clock: Clock,
270
+ reactor: IReactorTime,
271
+ timeout_sec: float,
272
+ request: MatrixFederationRequest,
273
+ response: IResponse,
274
+ start_ms: int,
275
+ parser: ByteParser[T],
276
+ ) -> T:
277
+ """
278
+ Reads the body of a response with a timeout and sends it to a parser
279
+
280
+ Args:
281
+ reactor: twisted reactor, for the timeout
282
+ timeout_sec: number of seconds to wait for response to complete
283
+ request: the request that triggered the response
284
+ response: response to the request
285
+ start_ms: Timestamp when request was made
286
+ parser: The parser for the response
287
+
288
+ Returns:
289
+ The parsed response
290
+ """
291
+
292
+ max_response_size = parser.MAX_RESPONSE_SIZE
293
+
294
+ finished = False
295
+ try:
296
+ check_content_type_is(response.headers, parser.CONTENT_TYPE)
297
+
298
+ d = read_body_with_max_size(response, parser, max_response_size)
299
+ d = timeout_deferred(
300
+ deferred=d,
301
+ timeout=timeout_sec,
302
+ clock=clock,
303
+ )
304
+
305
+ length = await make_deferred_yieldable(d)
306
+
307
+ finished = True
308
+ value = parser.finish()
309
+ except BodyExceededMaxSize as e:
310
+ # The response was too big.
311
+ logger.warning(
312
+ "{%s} [%s] JSON response exceeded max size %i - %s %s",
313
+ request.txn_id,
314
+ request.destination,
315
+ max_response_size,
316
+ request.method,
317
+ request.uri.decode("ascii"),
318
+ )
319
+ raise RequestSendFailed(e, can_retry=False) from e
320
+ except ValueError as e:
321
+ # The content was invalid.
322
+ logger.warning(
323
+ "{%s} [%s] Failed to parse response - %s %s",
324
+ request.txn_id,
325
+ request.destination,
326
+ request.method,
327
+ request.uri.decode("ascii"),
328
+ )
329
+ raise RequestSendFailed(e, can_retry=False) from e
330
+ except defer.TimeoutError as e:
331
+ logger.warning(
332
+ "{%s} [%s] Timed out reading response - %s %s",
333
+ request.txn_id,
334
+ request.destination,
335
+ request.method,
336
+ request.uri.decode("ascii"),
337
+ )
338
+ raise RequestSendFailed(e, can_retry=True) from e
339
+ except ResponseFailed as e:
340
+ logger.warning(
341
+ "{%s} [%s] Failed to read response - %s %s",
342
+ request.txn_id,
343
+ request.destination,
344
+ request.method,
345
+ request.uri.decode("ascii"),
346
+ )
347
+ raise RequestSendFailed(e, can_retry=True) from e
348
+ except Exception as e:
349
+ logger.warning(
350
+ "{%s} [%s] Error reading response %s %s: %s",
351
+ request.txn_id,
352
+ request.destination,
353
+ request.method,
354
+ request.uri.decode("ascii"),
355
+ e,
356
+ )
357
+ raise
358
+ finally:
359
+ if not finished:
360
+ # There was an exception and we didn't `finish()` the parse.
361
+ # Let the parser know that it can free up any resources.
362
+ try:
363
+ parser.finish()
364
+ except Exception:
365
+ # Ignore any additional exceptions.
366
+ pass
367
+
368
+ time_taken_secs = reactor.seconds() - start_ms / 1000
369
+
370
+ logger.info(
371
+ "{%s} [%s] Completed request: %d %s in %.2f secs, got %d bytes - %s %s",
372
+ request.txn_id,
373
+ request.destination,
374
+ response.code,
375
+ response.phrase.decode("ascii", errors="replace"),
376
+ time_taken_secs,
377
+ length,
378
+ request.method,
379
+ request.uri.decode("ascii"),
380
+ )
381
+ return value
382
+
383
+
384
+ class BinaryIOWrapper:
385
+ """A wrapper for a TextIO which converts from bytes on the fly."""
386
+
387
+ def __init__(self, file: TextIO, encoding: str = "utf-8", errors: str = "strict"):
388
+ self.decoder = codecs.getincrementaldecoder(encoding)(errors)
389
+ self.file = file
390
+
391
+ def write(self, b: bytes | bytearray) -> int:
392
+ self.file.write(self.decoder.decode(b))
393
+ return len(b)
394
+
395
+
396
+ class MatrixFederationHttpClient:
397
+ """HTTP client used to talk to other homeservers over the federation
398
+ protocol. Send client certificates and signs requests.
399
+
400
+ Attributes:
401
+ agent (twisted.web.client.Agent): The twisted Agent used to send the
402
+ requests.
403
+ """
404
+
405
+ def __init__(
406
+ self,
407
+ hs: "HomeServer",
408
+ tls_client_options_factory: FederationPolicyForHTTPS | None,
409
+ ):
410
+ self.hs = hs
411
+ self.signing_key = hs.signing_key
412
+ self.server_name = hs.hostname
413
+
414
+ self.reactor = hs.get_reactor()
415
+ self.clock = hs.get_clock()
416
+
417
+ user_agent = hs.version_string
418
+ if hs.config.server.user_agent_suffix:
419
+ user_agent = "%s %s" % (user_agent, hs.config.server.user_agent_suffix)
420
+
421
+ outbound_federation_restricted_to = (
422
+ hs.config.worker.outbound_federation_restricted_to
423
+ )
424
+ if hs.get_instance_name() in outbound_federation_restricted_to:
425
+ # Talk to federation directly
426
+ federation_agent: IAgent = MatrixFederationAgent(
427
+ server_name=self.server_name,
428
+ reactor=self.reactor,
429
+ clock=self.clock,
430
+ tls_client_options_factory=tls_client_options_factory,
431
+ user_agent=user_agent.encode("ascii"),
432
+ ip_allowlist=hs.config.server.federation_ip_range_allowlist,
433
+ ip_blocklist=hs.config.server.federation_ip_range_blocklist,
434
+ proxy_config=hs.config.server.proxy_config,
435
+ )
436
+ else:
437
+ proxy_authorization_secret = hs.config.worker.worker_replication_secret
438
+ assert proxy_authorization_secret is not None, (
439
+ "`worker_replication_secret` must be set when using `outbound_federation_restricted_to` (used to authenticate requests across workers)"
440
+ )
441
+ federation_proxy_credentials = BearerProxyCredentials(
442
+ proxy_authorization_secret.encode("ascii")
443
+ )
444
+
445
+ # We need to talk to federation via the proxy via one of the configured
446
+ # locations
447
+ federation_proxy_locations = outbound_federation_restricted_to.locations
448
+ federation_agent = ProxyAgent(
449
+ reactor=self.reactor,
450
+ proxy_reactor=self.reactor,
451
+ contextFactory=tls_client_options_factory,
452
+ federation_proxy_locations=federation_proxy_locations,
453
+ federation_proxy_credentials=federation_proxy_credentials,
454
+ )
455
+
456
+ # Use a BlocklistingAgentWrapper to prevent circumventing the IP
457
+ # blocking via IP literals in server names
458
+ self.agent: IAgent = BlocklistingAgentWrapper(
459
+ federation_agent,
460
+ ip_blocklist=hs.config.server.federation_ip_range_blocklist,
461
+ )
462
+
463
+ self._store = hs.get_datastores().main
464
+ self.version_string_bytes = hs.version_string.encode("ascii")
465
+ self.default_timeout_seconds = hs.config.federation.client_timeout_ms / 1000
466
+ self.max_long_retry_delay_seconds = (
467
+ hs.config.federation.max_long_retry_delay_ms / 1000
468
+ )
469
+ self.max_short_retry_delay_seconds = (
470
+ hs.config.federation.max_short_retry_delay_ms / 1000
471
+ )
472
+ self.max_long_retries = hs.config.federation.max_long_retries
473
+ self.max_short_retries = hs.config.federation.max_short_retries
474
+
475
+ self._cooperator = Cooperator(scheduler=_make_scheduler(self.clock))
476
+
477
+ self._sleeper = AwakenableSleeper(self.clock)
478
+
479
+ self._simple_http_client = SimpleHttpClient(
480
+ hs,
481
+ ip_blocklist=hs.config.server.federation_ip_range_blocklist,
482
+ ip_allowlist=hs.config.server.federation_ip_range_allowlist,
483
+ use_proxy=True,
484
+ )
485
+
486
+ self.remote_download_linearizer = Linearizer(
487
+ name="remote_download_linearizer", max_count=6, clock=self.clock
488
+ )
489
+ self._is_shutdown = False
490
+
491
+ def shutdown(self) -> None:
492
+ self._is_shutdown = True
493
+
494
+ def wake_destination(self, destination: str) -> None:
495
+ """Called when the remote server may have come back online."""
496
+
497
+ self._sleeper.wake(destination)
498
+
499
+ async def _send_request_with_optional_trailing_slash(
500
+ self,
501
+ request: MatrixFederationRequest,
502
+ try_trailing_slash_on_400: bool = False,
503
+ **send_request_args: Any,
504
+ ) -> IResponse:
505
+ """Wrapper for _send_request which can optionally retry the request
506
+ upon receiving a combination of a 400 HTTP response code and a
507
+ 'M_UNRECOGNIZED' errcode. This is a workaround for Synapse <= v0.99.3
508
+ due to https://github.com/matrix-org/synapse/issues/3622.
509
+
510
+ Args:
511
+ request: details of request to be sent
512
+ try_trailing_slash_on_400: Whether on receiving a 400
513
+ 'M_UNRECOGNIZED' from the server to retry the request with a
514
+ trailing slash appended to the request path.
515
+ send_request_args: A dictionary of arguments to pass to `_send_request()`.
516
+
517
+ Raises:
518
+ HttpResponseException: If we get an HTTP response code >= 300
519
+ (except 429).
520
+
521
+ Returns:
522
+ Parsed JSON response body.
523
+ """
524
+ try:
525
+ response = await self._send_request(request, **send_request_args)
526
+ except HttpResponseException as e:
527
+ # Received an HTTP error > 300. Check if it meets the requirements
528
+ # to retry with a trailing slash
529
+ if not try_trailing_slash_on_400:
530
+ raise
531
+
532
+ if e.code != 400 or e.to_synapse_error().errcode != "M_UNRECOGNIZED":
533
+ raise
534
+
535
+ # Retry with a trailing slash if we received a 400 with
536
+ # 'M_UNRECOGNIZED' which some endpoints can return when omitting a
537
+ # trailing slash on Synapse <= v0.99.3.
538
+ logger.info("Retrying request with trailing slash")
539
+
540
+ # Request is frozen so we create a new instance
541
+ request = attr.evolve(request, path=request.path + "/")
542
+
543
+ response = await self._send_request(request, **send_request_args)
544
+
545
+ return response
546
+
547
+ async def _send_request(
548
+ self,
549
+ request: MatrixFederationRequest,
550
+ retry_on_dns_fail: bool = True,
551
+ timeout: int | None = None,
552
+ long_retries: bool = False,
553
+ ignore_backoff: bool = False,
554
+ backoff_on_404: bool = False,
555
+ backoff_on_all_error_codes: bool = False,
556
+ follow_redirects: bool = False,
557
+ ) -> IResponse:
558
+ """
559
+ Sends a request to the given server.
560
+
561
+ Args:
562
+ request: details of request to be sent
563
+
564
+ retry_on_dns_fail: true if the request should be retried on DNS failures
565
+
566
+ timeout: number of milliseconds to wait for the response headers
567
+ (including connecting to the server), *for each attempt*.
568
+ 60s by default.
569
+
570
+ long_retries: whether to use the long retry algorithm.
571
+
572
+ The regular retry algorithm makes 4 attempts, with intervals
573
+ [0.5s, 1s, 2s].
574
+
575
+ The long retry algorithm makes 11 attempts, with intervals
576
+ [4s, 16s, 60s, 60s, ...]
577
+
578
+ Both algorithms add -20%/+40% jitter to the retry intervals.
579
+
580
+ Note that the above intervals are *in addition* to the time spent
581
+ waiting for the request to complete (up to `timeout` ms).
582
+
583
+ NB: the long retry algorithm takes over 20 minutes to complete, with a
584
+ default timeout of 60s! It's best not to use the `long_retries` option
585
+ for something that is blocking a client so we don't make them wait for
586
+ aaaaages, whereas some things like sending transactions (server to
587
+ server) we can be a lot more lenient but its very fuzzy / hand-wavey.
588
+
589
+ In the future, we could be more intelligent about doing this sort of
590
+ thing by looking at things with the bigger picture in mind,
591
+ https://github.com/matrix-org/synapse/issues/8917
592
+
593
+ ignore_backoff: true to ignore the historical backoff data
594
+ and try the request anyway.
595
+
596
+ backoff_on_404: Back off if we get a 404
597
+ backoff_on_all_error_codes: Back off if we get any error response
598
+
599
+ follow_redirects: True to follow the Location header of 307/308 redirect
600
+ responses. This does not recurse.
601
+
602
+ Returns:
603
+ Resolves with the HTTP response object on success.
604
+
605
+ Raises:
606
+ HttpResponseException: If we get an HTTP response code >= 300
607
+ (except 429).
608
+ NotRetryingDestination: If we are not yet ready to retry this
609
+ server.
610
+ FederationDeniedError: If this destination is not on our
611
+ federation whitelist
612
+ RequestSendFailed: If there were problems connecting to the
613
+ remote, due to e.g. DNS failures, connection timeouts etc.
614
+ """
615
+ # Validate server name and log if it is an invalid destination, this is
616
+ # partially to help track down code paths where we haven't validated before here
617
+ try:
618
+ parse_and_validate_server_name(request.destination)
619
+ except ValueError:
620
+ logger.exception("Invalid destination: %s.", request.destination)
621
+ raise FederationDeniedError(request.destination)
622
+
623
+ if timeout is not None:
624
+ _sec_timeout = timeout / 1000
625
+ else:
626
+ _sec_timeout = self.default_timeout_seconds
627
+
628
+ if (
629
+ self.hs.config.federation.federation_domain_whitelist is not None
630
+ and request.destination
631
+ not in self.hs.config.federation.federation_domain_whitelist
632
+ ):
633
+ raise FederationDeniedError(request.destination)
634
+
635
+ limiter = await synapse.util.retryutils.get_retry_limiter(
636
+ destination=request.destination,
637
+ our_server_name=self.server_name,
638
+ hs=self.hs,
639
+ clock=self.clock,
640
+ store=self._store,
641
+ backoff_on_404=backoff_on_404,
642
+ ignore_backoff=ignore_backoff,
643
+ notifier=self.hs.get_notifier(),
644
+ replication_client=self.hs.get_replication_command_handler(),
645
+ backoff_on_all_error_codes=backoff_on_all_error_codes,
646
+ )
647
+
648
+ method_bytes = request.method.encode("ascii")
649
+ destination_bytes = request.destination.encode("ascii")
650
+ path_bytes = request.path.encode("ascii")
651
+ query_bytes = encode_query_args(request.query)
652
+
653
+ scope = start_active_span(
654
+ "outgoing-federation-request",
655
+ tags={
656
+ tags.SPAN_KIND: tags.SPAN_KIND_RPC_CLIENT,
657
+ tags.PEER_ADDRESS: request.destination,
658
+ tags.HTTP_METHOD: request.method,
659
+ tags.HTTP_URL: request.path,
660
+ },
661
+ finish_on_close=True,
662
+ )
663
+
664
+ # Inject the span into the headers
665
+ headers_dict: dict[bytes, list[bytes]] = {}
666
+ opentracing.inject_header_dict(headers_dict, request.destination)
667
+
668
+ headers_dict[b"User-Agent"] = [self.version_string_bytes]
669
+
670
+ with limiter, scope:
671
+ # XXX: Would be much nicer to retry only at the transaction-layer
672
+ # (once we have reliable transactions in place)
673
+ if long_retries:
674
+ retries_left = self.max_long_retries
675
+ else:
676
+ retries_left = self.max_short_retries
677
+
678
+ url_bytes = request.uri
679
+ url_str = url_bytes.decode("ascii")
680
+
681
+ url_to_sign_bytes = urllib.parse.urlunparse(
682
+ (b"", b"", path_bytes, None, query_bytes, b"")
683
+ )
684
+
685
+ while not self._is_shutdown:
686
+ try:
687
+ json = request.get_json()
688
+ if json:
689
+ headers_dict[b"Content-Type"] = [b"application/json"]
690
+ auth_headers = self.build_auth_headers(
691
+ destination_bytes, method_bytes, url_to_sign_bytes, json
692
+ )
693
+ data = encode_canonical_json(json)
694
+ producer: IBodyProducer | None = QuieterFileBodyProducer(
695
+ BytesIO(data), cooperator=self._cooperator
696
+ )
697
+ else:
698
+ producer = None
699
+ auth_headers = self.build_auth_headers(
700
+ destination_bytes, method_bytes, url_to_sign_bytes
701
+ )
702
+
703
+ headers_dict[b"Authorization"] = auth_headers
704
+
705
+ logger.debug(
706
+ "{%s} [%s] Sending request: %s %s; timeout %fs",
707
+ request.txn_id,
708
+ request.destination,
709
+ request.method,
710
+ url_str,
711
+ _sec_timeout,
712
+ )
713
+
714
+ outgoing_requests_counter.labels(
715
+ method=request.method, **{SERVER_NAME_LABEL: self.server_name}
716
+ ).inc()
717
+
718
+ try:
719
+ with Measure(
720
+ self.clock,
721
+ name="outbound_request",
722
+ server_name=self.server_name,
723
+ ):
724
+ # we don't want all the fancy cookie and redirect handling
725
+ # that treq.request gives: just use the raw Agent.
726
+
727
+ # To preserve the logging context, the timeout is treated
728
+ # in a similar way to `defer.gatherResults`:
729
+ # * Each logging context-preserving fork is wrapped in
730
+ # `run_in_background`. In this case there is only one,
731
+ # since the timeout fork is not logging-context aware.
732
+ # * The `Deferred` that joins the forks back together is
733
+ # wrapped in `make_deferred_yieldable` to restore the
734
+ # logging context regardless of the path taken.
735
+ request_deferred = run_in_background(
736
+ self.agent.request,
737
+ method_bytes,
738
+ url_bytes,
739
+ headers=Headers(headers_dict),
740
+ bodyProducer=producer,
741
+ )
742
+ request_deferred = timeout_deferred(
743
+ deferred=request_deferred,
744
+ timeout=_sec_timeout,
745
+ clock=self.clock,
746
+ )
747
+
748
+ response = await make_deferred_yieldable(request_deferred)
749
+ except DNSLookupError as e:
750
+ raise RequestSendFailed(e, can_retry=retry_on_dns_fail) from e
751
+ except Exception as e:
752
+ raise RequestSendFailed(e, can_retry=True) from e
753
+
754
+ incoming_responses_counter.labels(
755
+ method=request.method,
756
+ code=response.code,
757
+ **{SERVER_NAME_LABEL: self.server_name},
758
+ ).inc()
759
+
760
+ set_tag(tags.HTTP_STATUS_CODE, response.code)
761
+ response_phrase = response.phrase.decode("ascii", errors="replace")
762
+
763
+ if 200 <= response.code < 300:
764
+ logger.debug(
765
+ "{%s} [%s] Got response headers: %d %s",
766
+ request.txn_id,
767
+ request.destination,
768
+ response.code,
769
+ response_phrase,
770
+ )
771
+ elif (
772
+ response.code in (307, 308)
773
+ and follow_redirects
774
+ and response.headers.hasHeader("Location")
775
+ ):
776
+ # The Location header *might* be relative so resolve it.
777
+ location = response.headers.getRawHeaders(b"Location")[0]
778
+ new_uri = urllib.parse.urljoin(request.uri, location)
779
+
780
+ return await self._send_request(
781
+ attr.evolve(request, uri=new_uri, generate_uri=False),
782
+ retry_on_dns_fail,
783
+ timeout,
784
+ long_retries,
785
+ ignore_backoff,
786
+ backoff_on_404,
787
+ backoff_on_all_error_codes,
788
+ # Do not continue following redirects.
789
+ follow_redirects=False,
790
+ )
791
+ else:
792
+ logger.info(
793
+ "{%s} [%s] Got response headers: %d %s",
794
+ request.txn_id,
795
+ request.destination,
796
+ response.code,
797
+ response_phrase,
798
+ )
799
+ # :'(
800
+ # Update transactions table?
801
+ d = treq.content(response)
802
+ d = timeout_deferred(
803
+ deferred=d,
804
+ timeout=_sec_timeout,
805
+ clock=self.clock,
806
+ )
807
+
808
+ try:
809
+ body = await make_deferred_yieldable(d)
810
+ except Exception as e:
811
+ # Eh, we're already going to raise an exception so lets
812
+ # ignore if this fails.
813
+ logger.warning(
814
+ "{%s} [%s] Failed to get error response: %s %s: %s",
815
+ request.txn_id,
816
+ request.destination,
817
+ request.method,
818
+ url_str,
819
+ _flatten_response_never_received(e),
820
+ )
821
+ body = b""
822
+
823
+ exc = HttpResponseException(
824
+ response.code, response_phrase, body
825
+ )
826
+
827
+ # Retry if the error is a 5xx or a 429 (Too Many
828
+ # Requests), otherwise just raise a standard
829
+ # `HttpResponseException`
830
+ if 500 <= response.code < 600 or response.code == 429:
831
+ raise RequestSendFailed(exc, can_retry=True) from exc
832
+ else:
833
+ raise exc
834
+
835
+ break
836
+ except RequestSendFailed as e:
837
+ logger.info(
838
+ "{%s} [%s] Request failed: %s %s: %s",
839
+ request.txn_id,
840
+ request.destination,
841
+ request.method,
842
+ url_str,
843
+ _flatten_response_never_received(e.inner_exception),
844
+ )
845
+
846
+ if not e.can_retry:
847
+ raise
848
+
849
+ if retries_left and not timeout:
850
+ if long_retries:
851
+ delay_seconds = 4 ** (
852
+ self.max_long_retries + 1 - retries_left
853
+ )
854
+ delay_seconds = min(
855
+ delay_seconds, self.max_long_retry_delay_seconds
856
+ )
857
+ delay_seconds *= random.uniform(0.8, 1.4)
858
+ else:
859
+ delay_seconds = 0.5 * 2 ** (
860
+ self.max_short_retries - retries_left
861
+ )
862
+ delay_seconds = min(
863
+ delay_seconds, self.max_short_retry_delay_seconds
864
+ )
865
+ delay_seconds *= random.uniform(0.8, 1.4)
866
+
867
+ logger.debug(
868
+ "{%s} [%s] Waiting %ss before re-sending...",
869
+ request.txn_id,
870
+ request.destination,
871
+ delay_seconds,
872
+ )
873
+
874
+ if self._is_shutdown:
875
+ # Immediately fail sending the request instead of starting a
876
+ # potentially long sleep after the server has requested
877
+ # shutdown.
878
+ # This is the code path followed when the
879
+ # `federation_transaction_transmission_loop` has been
880
+ # cancelled.
881
+ raise
882
+
883
+ # Sleep for the calculated delay, or wake up immediately
884
+ # if we get notified that the server is back up.
885
+ await self._sleeper.sleep(
886
+ request.destination, delay_seconds * 1000
887
+ )
888
+ retries_left -= 1
889
+ else:
890
+ raise
891
+
892
+ except Exception as e:
893
+ logger.warning(
894
+ "{%s} [%s] Request failed: %s %s: %s",
895
+ request.txn_id,
896
+ request.destination,
897
+ request.method,
898
+ url_str,
899
+ _flatten_response_never_received(e),
900
+ )
901
+ raise
902
+ return response
903
+
904
+ def build_auth_headers(
905
+ self,
906
+ destination: bytes | None,
907
+ method: bytes,
908
+ url_bytes: bytes,
909
+ content: JsonDict | None = None,
910
+ destination_is: bytes | None = None,
911
+ ) -> list[bytes]:
912
+ """
913
+ Builds the Authorization headers for a federation request
914
+ Args:
915
+ destination: The destination homeserver of the request.
916
+ May be None if the destination is an identity server, in which case
917
+ destination_is must be non-None.
918
+ method: The HTTP method of the request
919
+ url_bytes: The URI path of the request
920
+ content: The body of the request
921
+ destination_is: As 'destination', but if the destination is an
922
+ identity server
923
+
924
+ Returns:
925
+ A list of headers to be added as "Authorization:" headers
926
+ """
927
+ if not destination and not destination_is:
928
+ raise ValueError(
929
+ "At least one of the arguments destination and destination_is "
930
+ "must be a nonempty bytestring."
931
+ )
932
+
933
+ request: JsonDict = {
934
+ "method": method.decode("ascii"),
935
+ "uri": url_bytes.decode("ascii"),
936
+ "origin": self.server_name,
937
+ }
938
+
939
+ if destination is not None:
940
+ request["destination"] = destination.decode("ascii")
941
+
942
+ if destination_is is not None:
943
+ request["destination_is"] = destination_is.decode("ascii")
944
+
945
+ if content is not None:
946
+ request["content"] = content
947
+
948
+ request = sign_json(request, self.server_name, self.signing_key)
949
+
950
+ auth_headers = []
951
+
952
+ for key, sig in request["signatures"][self.server_name].items():
953
+ auth_headers.append(
954
+ (
955
+ 'X-Matrix origin="%s",key="%s",sig="%s",destination="%s"'
956
+ % (
957
+ self.server_name,
958
+ key,
959
+ sig,
960
+ request.get("destination") or request["destination_is"],
961
+ )
962
+ ).encode("ascii")
963
+ )
964
+ return auth_headers
965
+
966
+ @overload
967
+ async def put_json(
968
+ self,
969
+ destination: str,
970
+ path: str,
971
+ args: QueryParams | None = None,
972
+ data: JsonDict | None = None,
973
+ json_data_callback: Callable[[], JsonDict] | None = None,
974
+ long_retries: bool = False,
975
+ timeout: int | None = None,
976
+ ignore_backoff: bool = False,
977
+ backoff_on_404: bool = False,
978
+ try_trailing_slash_on_400: bool = False,
979
+ parser: Literal[None] = None,
980
+ backoff_on_all_error_codes: bool = False,
981
+ ) -> JsonDict: ...
982
+
983
+ @overload
984
+ async def put_json(
985
+ self,
986
+ destination: str,
987
+ path: str,
988
+ args: QueryParams | None = None,
989
+ data: JsonDict | None = None,
990
+ json_data_callback: Callable[[], JsonDict] | None = None,
991
+ long_retries: bool = False,
992
+ timeout: int | None = None,
993
+ ignore_backoff: bool = False,
994
+ backoff_on_404: bool = False,
995
+ try_trailing_slash_on_400: bool = False,
996
+ parser: ByteParser[T] | None = None,
997
+ backoff_on_all_error_codes: bool = False,
998
+ ) -> T: ...
999
+
1000
+ async def put_json(
1001
+ self,
1002
+ destination: str,
1003
+ path: str,
1004
+ args: QueryParams | None = None,
1005
+ data: JsonDict | None = None,
1006
+ json_data_callback: Callable[[], JsonDict] | None = None,
1007
+ long_retries: bool = False,
1008
+ timeout: int | None = None,
1009
+ ignore_backoff: bool = False,
1010
+ backoff_on_404: bool = False,
1011
+ try_trailing_slash_on_400: bool = False,
1012
+ parser: ByteParser[T] | None = None,
1013
+ backoff_on_all_error_codes: bool = False,
1014
+ ) -> JsonDict | T:
1015
+ """Sends the specified json data using PUT
1016
+
1017
+ Args:
1018
+ destination: The remote server to send the HTTP request to.
1019
+ path: The HTTP path.
1020
+ args: query params
1021
+ data: A dict containing the data that will be used as
1022
+ the request body. This will be encoded as JSON.
1023
+ json_data_callback: A callable returning the dict to
1024
+ use as the request body.
1025
+
1026
+ long_retries: whether to use the long retry algorithm. See
1027
+ docs on _send_request for details.
1028
+
1029
+ timeout: number of milliseconds to wait for the response.
1030
+ self._default_timeout (60s) by default.
1031
+
1032
+ Note that we may make several attempts to send the request; this
1033
+ timeout applies to the time spent waiting for response headers for
1034
+ *each* attempt (including connection time) as well as the time spent
1035
+ reading the response body after a 200 response.
1036
+
1037
+ ignore_backoff: true to ignore the historical backoff data
1038
+ and try the request anyway.
1039
+ backoff_on_404: True if we should count a 404 response as
1040
+ a failure of the server (and should therefore back off future
1041
+ requests).
1042
+ try_trailing_slash_on_400: True if on a 400 M_UNRECOGNIZED
1043
+ response we should try appending a trailing slash to the end
1044
+ of the request. Workaround for https://github.com/matrix-org/synapse/issues/3622
1045
+ in Synapse <= v0.99.3. This will be attempted before backing off if
1046
+ backing off has been enabled.
1047
+ parser: The parser to use to decode the response. Defaults to
1048
+ parsing as JSON.
1049
+ backoff_on_all_error_codes: Back off if we get any error response
1050
+
1051
+ Returns:
1052
+ Succeeds when we get a 2xx HTTP response. The
1053
+ result will be the decoded JSON body.
1054
+
1055
+ Raises:
1056
+ HttpResponseException: If we get an HTTP response code >= 300
1057
+ (except 429).
1058
+ NotRetryingDestination: If we are not yet ready to retry this
1059
+ server.
1060
+ FederationDeniedError: If this destination is not on our
1061
+ federation whitelist
1062
+ RequestSendFailed: If there were problems connecting to the
1063
+ remote, due to e.g. DNS failures, connection timeouts etc.
1064
+ """
1065
+ request = MatrixFederationRequest(
1066
+ method="PUT",
1067
+ destination=destination,
1068
+ path=path,
1069
+ query=args,
1070
+ json_callback=json_data_callback,
1071
+ json=data,
1072
+ )
1073
+
1074
+ start_ms = self.clock.time_msec()
1075
+
1076
+ response = await self._send_request_with_optional_trailing_slash(
1077
+ request,
1078
+ try_trailing_slash_on_400,
1079
+ backoff_on_404=backoff_on_404,
1080
+ ignore_backoff=ignore_backoff,
1081
+ long_retries=long_retries,
1082
+ timeout=timeout,
1083
+ backoff_on_all_error_codes=backoff_on_all_error_codes,
1084
+ )
1085
+
1086
+ if timeout is not None:
1087
+ _sec_timeout = timeout / 1000
1088
+ else:
1089
+ _sec_timeout = self.default_timeout_seconds
1090
+
1091
+ if parser is None:
1092
+ parser = cast(ByteParser[T], JsonParser())
1093
+
1094
+ body = await _handle_response(
1095
+ self.clock,
1096
+ self.reactor,
1097
+ _sec_timeout,
1098
+ request,
1099
+ response,
1100
+ start_ms,
1101
+ parser=parser,
1102
+ )
1103
+
1104
+ return body
1105
+
1106
+ async def post_json(
1107
+ self,
1108
+ destination: str,
1109
+ path: str,
1110
+ data: JsonDict | None = None,
1111
+ long_retries: bool = False,
1112
+ timeout: int | None = None,
1113
+ ignore_backoff: bool = False,
1114
+ args: QueryParams | None = None,
1115
+ ) -> JsonDict:
1116
+ """Sends the specified json data using POST
1117
+
1118
+ Args:
1119
+ destination: The remote server to send the HTTP request to.
1120
+
1121
+ path: The HTTP path.
1122
+
1123
+ data: A dict containing the data that will be used as
1124
+ the request body. This will be encoded as JSON.
1125
+
1126
+ long_retries: whether to use the long retry algorithm. See
1127
+ docs on _send_request for details.
1128
+
1129
+ timeout: number of milliseconds to wait for the response.
1130
+ self._default_timeout (60s) by default.
1131
+
1132
+ Note that we may make several attempts to send the request; this
1133
+ timeout applies to the time spent waiting for response headers for
1134
+ *each* attempt (including connection time) as well as the time spent
1135
+ reading the response body after a 200 response.
1136
+
1137
+ ignore_backoff: true to ignore the historical backoff data and
1138
+ try the request anyway.
1139
+
1140
+ args: query params
1141
+ Returns:
1142
+ Succeeds when we get a 2xx HTTP response. The result will be the decoded JSON body.
1143
+
1144
+ Raises:
1145
+ HttpResponseException: If we get an HTTP response code >= 300
1146
+ (except 429).
1147
+ NotRetryingDestination: If we are not yet ready to retry this
1148
+ server.
1149
+ FederationDeniedError: If this destination is not on our
1150
+ federation whitelist
1151
+ RequestSendFailed: If there were problems connecting to the
1152
+ remote, due to e.g. DNS failures, connection timeouts etc.
1153
+ """
1154
+
1155
+ request = MatrixFederationRequest(
1156
+ method="POST", destination=destination, path=path, query=args, json=data
1157
+ )
1158
+
1159
+ start_ms = self.clock.time_msec()
1160
+
1161
+ response = await self._send_request(
1162
+ request,
1163
+ long_retries=long_retries,
1164
+ timeout=timeout,
1165
+ ignore_backoff=ignore_backoff,
1166
+ )
1167
+
1168
+ if timeout is not None:
1169
+ _sec_timeout = timeout / 1000
1170
+ else:
1171
+ _sec_timeout = self.default_timeout_seconds
1172
+
1173
+ body = await _handle_response(
1174
+ self.clock,
1175
+ self.reactor,
1176
+ _sec_timeout,
1177
+ request,
1178
+ response,
1179
+ start_ms,
1180
+ parser=JsonParser(),
1181
+ )
1182
+ return body
1183
+
1184
+ @overload
1185
+ async def get_json(
1186
+ self,
1187
+ destination: str,
1188
+ path: str,
1189
+ args: QueryParams | None = None,
1190
+ retry_on_dns_fail: bool = True,
1191
+ timeout: int | None = None,
1192
+ ignore_backoff: bool = False,
1193
+ try_trailing_slash_on_400: bool = False,
1194
+ parser: Literal[None] = None,
1195
+ ) -> JsonDict: ...
1196
+
1197
+ @overload
1198
+ async def get_json(
1199
+ self,
1200
+ destination: str,
1201
+ path: str,
1202
+ args: QueryParams | None = ...,
1203
+ retry_on_dns_fail: bool = ...,
1204
+ timeout: int | None = ...,
1205
+ ignore_backoff: bool = ...,
1206
+ try_trailing_slash_on_400: bool = ...,
1207
+ parser: ByteParser[T] = ...,
1208
+ ) -> T: ...
1209
+
1210
+ async def get_json(
1211
+ self,
1212
+ destination: str,
1213
+ path: str,
1214
+ args: QueryParams | None = None,
1215
+ retry_on_dns_fail: bool = True,
1216
+ timeout: int | None = None,
1217
+ ignore_backoff: bool = False,
1218
+ try_trailing_slash_on_400: bool = False,
1219
+ parser: ByteParser[T] | None = None,
1220
+ ) -> JsonDict | T:
1221
+ """GETs some json from the given host homeserver and path
1222
+
1223
+ Args:
1224
+ destination: The remote server to send the HTTP request to.
1225
+
1226
+ path: The HTTP path.
1227
+
1228
+ args: A dictionary used to create query strings, defaults to
1229
+ None.
1230
+
1231
+ retry_on_dns_fail: true if the request should be retried on DNS failures
1232
+
1233
+ timeout: number of milliseconds to wait for the response.
1234
+ self._default_timeout (60s) by default.
1235
+
1236
+ Note that we may make several attempts to send the request; this
1237
+ timeout applies to the time spent waiting for response headers for
1238
+ *each* attempt (including connection time) as well as the time spent
1239
+ reading the response body after a 200 response.
1240
+
1241
+ ignore_backoff: true to ignore the historical backoff data
1242
+ and try the request anyway.
1243
+
1244
+ try_trailing_slash_on_400: True if on a 400 M_UNRECOGNIZED
1245
+ response we should try appending a trailing slash to the end of
1246
+ the request. Workaround for https://github.com/matrix-org/synapse/issues/3622
1247
+ in Synapse <= v0.99.3.
1248
+
1249
+ parser: The parser to use to decode the response. Defaults to
1250
+ parsing as JSON.
1251
+
1252
+ Returns:
1253
+ Succeeds when we get a 2xx HTTP response. The
1254
+ result will be the decoded JSON body.
1255
+
1256
+ Raises:
1257
+ HttpResponseException: If we get an HTTP response code >= 300
1258
+ (except 429).
1259
+ NotRetryingDestination: If we are not yet ready to retry this
1260
+ server.
1261
+ FederationDeniedError: If this destination is not on our
1262
+ federation whitelist
1263
+ RequestSendFailed: If there were problems connecting to the
1264
+ remote, due to e.g. DNS failures, connection timeouts etc.
1265
+ """
1266
+ json_dict, _ = await self.get_json_with_headers(
1267
+ destination=destination,
1268
+ path=path,
1269
+ args=args,
1270
+ retry_on_dns_fail=retry_on_dns_fail,
1271
+ timeout=timeout,
1272
+ ignore_backoff=ignore_backoff,
1273
+ try_trailing_slash_on_400=try_trailing_slash_on_400,
1274
+ parser=parser,
1275
+ )
1276
+ return json_dict
1277
+
1278
+ @overload
1279
+ async def get_json_with_headers(
1280
+ self,
1281
+ destination: str,
1282
+ path: str,
1283
+ args: QueryParams | None = None,
1284
+ retry_on_dns_fail: bool = True,
1285
+ timeout: int | None = None,
1286
+ ignore_backoff: bool = False,
1287
+ try_trailing_slash_on_400: bool = False,
1288
+ parser: Literal[None] = None,
1289
+ ) -> tuple[JsonDict, dict[bytes, list[bytes]]]: ...
1290
+
1291
+ @overload
1292
+ async def get_json_with_headers(
1293
+ self,
1294
+ destination: str,
1295
+ path: str,
1296
+ args: QueryParams | None = ...,
1297
+ retry_on_dns_fail: bool = ...,
1298
+ timeout: int | None = ...,
1299
+ ignore_backoff: bool = ...,
1300
+ try_trailing_slash_on_400: bool = ...,
1301
+ parser: ByteParser[T] = ...,
1302
+ ) -> tuple[T, dict[bytes, list[bytes]]]: ...
1303
+
1304
+ async def get_json_with_headers(
1305
+ self,
1306
+ destination: str,
1307
+ path: str,
1308
+ args: QueryParams | None = None,
1309
+ retry_on_dns_fail: bool = True,
1310
+ timeout: int | None = None,
1311
+ ignore_backoff: bool = False,
1312
+ try_trailing_slash_on_400: bool = False,
1313
+ parser: ByteParser[T] | None = None,
1314
+ ) -> tuple[JsonDict | T, dict[bytes, list[bytes]]]:
1315
+ """GETs some json from the given host homeserver and path
1316
+
1317
+ Args:
1318
+ destination: The remote server to send the HTTP request to.
1319
+
1320
+ path: The HTTP path.
1321
+
1322
+ args: A dictionary used to create query strings, defaults to
1323
+ None.
1324
+
1325
+ retry_on_dns_fail: true if the request should be retried on DNS failures
1326
+
1327
+ timeout: number of milliseconds to wait for the response.
1328
+ self._default_timeout (60s) by default.
1329
+
1330
+ Note that we may make several attempts to send the request; this
1331
+ timeout applies to the time spent waiting for response headers for
1332
+ *each* attempt (including connection time) as well as the time spent
1333
+ reading the response body after a 200 response.
1334
+
1335
+ ignore_backoff: true to ignore the historical backoff data
1336
+ and try the request anyway.
1337
+
1338
+ try_trailing_slash_on_400: True if on a 400 M_UNRECOGNIZED
1339
+ response we should try appending a trailing slash to the end of
1340
+ the request. Workaround for https://github.com/matrix-org/synapse/issues/3622
1341
+ in Synapse <= v0.99.3.
1342
+
1343
+ parser: The parser to use to decode the response. Defaults to
1344
+ parsing as JSON.
1345
+
1346
+ Returns:
1347
+ Succeeds when we get a 2xx HTTP response. The result will be a tuple of the
1348
+ decoded JSON body and a dict of the response headers.
1349
+
1350
+ Raises:
1351
+ HttpResponseException: If we get an HTTP response code >= 300
1352
+ (except 429).
1353
+ NotRetryingDestination: If we are not yet ready to retry this
1354
+ server.
1355
+ FederationDeniedError: If this destination is not on our
1356
+ federation whitelist
1357
+ RequestSendFailed: If there were problems connecting to the
1358
+ remote, due to e.g. DNS failures, connection timeouts etc.
1359
+ """
1360
+ request = MatrixFederationRequest(
1361
+ method="GET", destination=destination, path=path, query=args
1362
+ )
1363
+
1364
+ start_ms = self.clock.time_msec()
1365
+
1366
+ response = await self._send_request_with_optional_trailing_slash(
1367
+ request,
1368
+ try_trailing_slash_on_400,
1369
+ backoff_on_404=False,
1370
+ ignore_backoff=ignore_backoff,
1371
+ retry_on_dns_fail=retry_on_dns_fail,
1372
+ timeout=timeout,
1373
+ )
1374
+
1375
+ headers = dict(response.headers.getAllRawHeaders())
1376
+
1377
+ if timeout is not None:
1378
+ _sec_timeout = timeout / 1000
1379
+ else:
1380
+ _sec_timeout = self.default_timeout_seconds
1381
+
1382
+ if parser is None:
1383
+ parser = cast(ByteParser[T], JsonParser())
1384
+
1385
+ body = await _handle_response(
1386
+ self.clock,
1387
+ self.reactor,
1388
+ _sec_timeout,
1389
+ request,
1390
+ response,
1391
+ start_ms,
1392
+ parser=parser,
1393
+ )
1394
+
1395
+ return body, headers
1396
+
1397
+ async def delete_json(
1398
+ self,
1399
+ destination: str,
1400
+ path: str,
1401
+ long_retries: bool = False,
1402
+ timeout: int | None = None,
1403
+ ignore_backoff: bool = False,
1404
+ args: QueryParams | None = None,
1405
+ ) -> JsonDict:
1406
+ """Send a DELETE request to the remote expecting some json response
1407
+
1408
+ Args:
1409
+ destination: The remote server to send the HTTP request to.
1410
+ path: The HTTP path.
1411
+
1412
+ long_retries: whether to use the long retry algorithm. See
1413
+ docs on _send_request for details.
1414
+
1415
+ timeout: number of milliseconds to wait for the response.
1416
+ self._default_timeout (60s) by default.
1417
+
1418
+ Note that we may make several attempts to send the request; this
1419
+ timeout applies to the time spent waiting for response headers for
1420
+ *each* attempt (including connection time) as well as the time spent
1421
+ reading the response body after a 200 response.
1422
+
1423
+ ignore_backoff: true to ignore the historical backoff data and
1424
+ try the request anyway.
1425
+
1426
+ args: query params
1427
+ Returns:
1428
+ Succeeds when we get a 2xx HTTP response. The
1429
+ result will be the decoded JSON body.
1430
+
1431
+ Raises:
1432
+ HttpResponseException: If we get an HTTP response code >= 300
1433
+ (except 429).
1434
+ NotRetryingDestination: If we are not yet ready to retry this
1435
+ server.
1436
+ FederationDeniedError: If this destination is not on our
1437
+ federation whitelist
1438
+ RequestSendFailed: If there were problems connecting to the
1439
+ remote, due to e.g. DNS failures, connection timeouts etc.
1440
+ """
1441
+ request = MatrixFederationRequest(
1442
+ method="DELETE", destination=destination, path=path, query=args
1443
+ )
1444
+
1445
+ start_ms = self.clock.time_msec()
1446
+
1447
+ response = await self._send_request(
1448
+ request,
1449
+ long_retries=long_retries,
1450
+ timeout=timeout,
1451
+ ignore_backoff=ignore_backoff,
1452
+ )
1453
+
1454
+ if timeout is not None:
1455
+ _sec_timeout = timeout / 1000
1456
+ else:
1457
+ _sec_timeout = self.default_timeout_seconds
1458
+
1459
+ body = await _handle_response(
1460
+ self.clock,
1461
+ self.reactor,
1462
+ _sec_timeout,
1463
+ request,
1464
+ response,
1465
+ start_ms,
1466
+ parser=JsonParser(),
1467
+ )
1468
+ return body
1469
+
1470
+ async def get_file(
1471
+ self,
1472
+ destination: str,
1473
+ path: str,
1474
+ output_stream: BinaryIO,
1475
+ download_ratelimiter: Ratelimiter,
1476
+ ip_address: str,
1477
+ max_size: int,
1478
+ args: QueryParams | None = None,
1479
+ retry_on_dns_fail: bool = True,
1480
+ ignore_backoff: bool = False,
1481
+ follow_redirects: bool = False,
1482
+ ) -> tuple[int, dict[bytes, list[bytes]]]:
1483
+ """GETs a file from a given homeserver
1484
+ Args:
1485
+ destination: The remote server to send the HTTP request to.
1486
+ path: The HTTP path to GET.
1487
+ output_stream: File to write the response body to.
1488
+ download_ratelimiter: a ratelimiter to limit remote media downloads, keyed to
1489
+ requester IP
1490
+ ip_address: IP address of the requester
1491
+ max_size: maximum allowable size in bytes of the file
1492
+ args: Optional dictionary used to create the query string.
1493
+ ignore_backoff: true to ignore the historical backoff data
1494
+ and try the request anyway.
1495
+ follow_redirects: True to follow the Location header of 307/308 redirect
1496
+ responses. This does not recurse.
1497
+
1498
+ Returns:
1499
+ Resolves with an (int,dict) tuple of
1500
+ the file length and a dict of the response headers.
1501
+
1502
+ Raises:
1503
+ HttpResponseException: If we get an HTTP response code >= 300
1504
+ (except 429).
1505
+ NotRetryingDestination: If we are not yet ready to retry this
1506
+ server.
1507
+ FederationDeniedError: If this destination is not on our
1508
+ federation whitelist
1509
+ RequestSendFailed: If there were problems connecting to the
1510
+ remote, due to e.g. DNS failures, connection timeouts etc.
1511
+ SynapseError: If the requested file exceeds ratelimits
1512
+ """
1513
+ request = MatrixFederationRequest(
1514
+ method="GET", destination=destination, path=path, query=args
1515
+ )
1516
+
1517
+ # check for a minimum balance of 1MiB in ratelimiter before initiating request
1518
+ send_req, _ = await download_ratelimiter.can_do_action(
1519
+ requester=None, key=ip_address, n_actions=1048576, update=False
1520
+ )
1521
+
1522
+ if not send_req:
1523
+ msg = "Requested file size exceeds ratelimits"
1524
+ logger.warning(
1525
+ "{%s} [%s] %s",
1526
+ request.txn_id,
1527
+ request.destination,
1528
+ msg,
1529
+ )
1530
+ raise SynapseError(HTTPStatus.TOO_MANY_REQUESTS, msg, Codes.LIMIT_EXCEEDED)
1531
+
1532
+ response = await self._send_request(
1533
+ request,
1534
+ retry_on_dns_fail=retry_on_dns_fail,
1535
+ ignore_backoff=ignore_backoff,
1536
+ follow_redirects=follow_redirects,
1537
+ )
1538
+
1539
+ headers = dict(response.headers.getAllRawHeaders())
1540
+ expected_size = response.length
1541
+
1542
+ if expected_size == UNKNOWN_LENGTH:
1543
+ expected_size = max_size
1544
+ else:
1545
+ if int(expected_size) > max_size:
1546
+ msg = "Requested file is too large > %r bytes" % (max_size,)
1547
+ logger.warning(
1548
+ "{%s} [%s] %s",
1549
+ request.txn_id,
1550
+ request.destination,
1551
+ msg,
1552
+ )
1553
+ raise SynapseError(HTTPStatus.BAD_GATEWAY, msg, Codes.TOO_LARGE)
1554
+
1555
+ read_body, _ = await download_ratelimiter.can_do_action(
1556
+ requester=None,
1557
+ key=ip_address,
1558
+ n_actions=expected_size,
1559
+ )
1560
+ if not read_body:
1561
+ msg = "Requested file size exceeds ratelimits"
1562
+ logger.warning(
1563
+ "{%s} [%s] %s",
1564
+ request.txn_id,
1565
+ request.destination,
1566
+ msg,
1567
+ )
1568
+ raise SynapseError(
1569
+ HTTPStatus.TOO_MANY_REQUESTS, msg, Codes.LIMIT_EXCEEDED
1570
+ )
1571
+
1572
+ try:
1573
+ async with self.remote_download_linearizer.queue(ip_address):
1574
+ # add a byte of headroom to max size as function errs at >=
1575
+ d = read_body_with_max_size(response, output_stream, expected_size + 1)
1576
+ d.addTimeout(self.default_timeout_seconds, self.reactor)
1577
+ length = await make_deferred_yieldable(d)
1578
+ except BodyExceededMaxSize:
1579
+ msg = "Requested file is too large > %r bytes" % (expected_size,)
1580
+ logger.warning(
1581
+ "{%s} [%s] %s",
1582
+ request.txn_id,
1583
+ request.destination,
1584
+ msg,
1585
+ )
1586
+ raise SynapseError(HTTPStatus.BAD_GATEWAY, msg, Codes.TOO_LARGE)
1587
+ except defer.TimeoutError as e:
1588
+ logger.warning(
1589
+ "{%s} [%s] Timed out reading response - %s %s",
1590
+ request.txn_id,
1591
+ request.destination,
1592
+ request.method,
1593
+ request.uri.decode("ascii"),
1594
+ )
1595
+ raise RequestSendFailed(e, can_retry=True) from e
1596
+ except ResponseFailed as e:
1597
+ logger.warning(
1598
+ "{%s} [%s] Failed to read response - %s %s",
1599
+ request.txn_id,
1600
+ request.destination,
1601
+ request.method,
1602
+ request.uri.decode("ascii"),
1603
+ )
1604
+ raise RequestSendFailed(e, can_retry=True) from e
1605
+ except Exception as e:
1606
+ logger.warning(
1607
+ "{%s} [%s] Error reading response: %s",
1608
+ request.txn_id,
1609
+ request.destination,
1610
+ e,
1611
+ )
1612
+ raise
1613
+ logger.info(
1614
+ "{%s} [%s] Completed: %d %s [%d bytes] %s %s",
1615
+ request.txn_id,
1616
+ request.destination,
1617
+ response.code,
1618
+ response.phrase.decode("ascii", errors="replace"),
1619
+ length,
1620
+ request.method,
1621
+ request.uri.decode("ascii"),
1622
+ )
1623
+
1624
+ # if we didn't know the length upfront, decrement the actual size from ratelimiter
1625
+ if response.length == UNKNOWN_LENGTH:
1626
+ download_ratelimiter.record_action(
1627
+ requester=None, key=ip_address, n_actions=length
1628
+ )
1629
+
1630
+ return length, headers
1631
+
1632
+ async def federation_get_file(
1633
+ self,
1634
+ destination: str,
1635
+ path: str,
1636
+ output_stream: BinaryIO,
1637
+ download_ratelimiter: Ratelimiter,
1638
+ ip_address: str,
1639
+ max_size: int,
1640
+ args: QueryParams | None = None,
1641
+ retry_on_dns_fail: bool = True,
1642
+ ignore_backoff: bool = False,
1643
+ ) -> tuple[int, dict[bytes, list[bytes]], bytes]:
1644
+ """GETs a file from a given homeserver over the federation /download endpoint
1645
+ Args:
1646
+ destination: The remote server to send the HTTP request to.
1647
+ path: The HTTP path to GET.
1648
+ output_stream: File to write the response body to.
1649
+ download_ratelimiter: a ratelimiter to limit remote media downloads, keyed to
1650
+ requester IP
1651
+ ip_address: IP address of the requester
1652
+ max_size: maximum allowable size in bytes of the file
1653
+ args: Optional dictionary used to create the query string.
1654
+ ignore_backoff: true to ignore the historical backoff data
1655
+ and try the request anyway.
1656
+
1657
+ Returns:
1658
+ Resolves to an (int, dict, bytes) tuple of
1659
+ the file length, a dict of the response headers, and the file json
1660
+
1661
+ Raises:
1662
+ HttpResponseException: If we get an HTTP response code >= 300
1663
+ (except 429).
1664
+ NotRetryingDestination: If we are not yet ready to retry this
1665
+ server.
1666
+ FederationDeniedError: If this destination is not on our
1667
+ federation whitelist
1668
+ RequestSendFailed: If there were problems connecting to the
1669
+ remote, due to e.g. DNS failures, connection timeouts etc.
1670
+ SynapseError: If the requested file exceeds ratelimits or the response from the
1671
+ remote server is not a multipart response
1672
+ AssertionError: if the resolved multipart response's length is None
1673
+ """
1674
+ request = MatrixFederationRequest(
1675
+ method="GET", destination=destination, path=path, query=args
1676
+ )
1677
+
1678
+ # check for a minimum balance of 1MiB in ratelimiter before initiating request
1679
+ send_req, _ = await download_ratelimiter.can_do_action(
1680
+ requester=None, key=ip_address, n_actions=1048576, update=False
1681
+ )
1682
+
1683
+ if not send_req:
1684
+ msg = "Requested file size exceeds ratelimits"
1685
+ logger.warning(
1686
+ "{%s} [%s] %s",
1687
+ request.txn_id,
1688
+ request.destination,
1689
+ msg,
1690
+ )
1691
+ raise SynapseError(HTTPStatus.TOO_MANY_REQUESTS, msg, Codes.LIMIT_EXCEEDED)
1692
+
1693
+ response = await self._send_request(
1694
+ request,
1695
+ retry_on_dns_fail=retry_on_dns_fail,
1696
+ ignore_backoff=ignore_backoff,
1697
+ )
1698
+
1699
+ headers = dict(response.headers.getAllRawHeaders())
1700
+ expected_size = response.length
1701
+
1702
+ if expected_size == UNKNOWN_LENGTH:
1703
+ expected_size = max_size
1704
+ else:
1705
+ if int(expected_size) > max_size:
1706
+ msg = "Requested file is too large > %r bytes" % (max_size,)
1707
+ logger.warning(
1708
+ "{%s} [%s] %s",
1709
+ request.txn_id,
1710
+ request.destination,
1711
+ msg,
1712
+ )
1713
+ raise SynapseError(HTTPStatus.BAD_GATEWAY, msg, Codes.TOO_LARGE)
1714
+
1715
+ read_body, _ = await download_ratelimiter.can_do_action(
1716
+ requester=None,
1717
+ key=ip_address,
1718
+ n_actions=expected_size,
1719
+ )
1720
+ if not read_body:
1721
+ msg = "Requested file size exceeds ratelimits"
1722
+ logger.warning(
1723
+ "{%s} [%s] %s",
1724
+ request.txn_id,
1725
+ request.destination,
1726
+ msg,
1727
+ )
1728
+ raise SynapseError(
1729
+ HTTPStatus.TOO_MANY_REQUESTS, msg, Codes.LIMIT_EXCEEDED
1730
+ )
1731
+
1732
+ # this should be a multipart/mixed response with the boundary string in the header
1733
+ try:
1734
+ raw_content_type = headers.get(b"Content-Type")
1735
+ assert raw_content_type is not None
1736
+ content_type = raw_content_type[0].decode("UTF-8")
1737
+ content_type_parts = content_type.split("boundary=")
1738
+ boundary = content_type_parts[1]
1739
+ except Exception:
1740
+ msg = "Remote response is malformed: expected Content-Type of multipart/mixed with a boundary present."
1741
+ logger.warning(
1742
+ "{%s} [%s] %s",
1743
+ request.txn_id,
1744
+ request.destination,
1745
+ msg,
1746
+ )
1747
+ raise SynapseError(HTTPStatus.BAD_GATEWAY, msg)
1748
+
1749
+ try:
1750
+ async with self.remote_download_linearizer.queue(ip_address):
1751
+ # add a byte of headroom to max size as `_MultipartParserProtocol.dataReceived` errs at >=
1752
+ deferred = read_multipart_response(
1753
+ response, output_stream, boundary, expected_size + 1
1754
+ )
1755
+ deferred.addTimeout(self.default_timeout_seconds, self.reactor)
1756
+ multipart_response = await make_deferred_yieldable(deferred)
1757
+ except BodyExceededMaxSize:
1758
+ msg = "Requested file is too large > %r bytes" % (expected_size,)
1759
+ logger.warning(
1760
+ "{%s} [%s] %s",
1761
+ request.txn_id,
1762
+ request.destination,
1763
+ msg,
1764
+ )
1765
+ raise SynapseError(HTTPStatus.BAD_GATEWAY, msg, Codes.TOO_LARGE)
1766
+ except defer.TimeoutError as e:
1767
+ logger.warning(
1768
+ "{%s} [%s] Timed out reading response - %s %s",
1769
+ request.txn_id,
1770
+ request.destination,
1771
+ request.method,
1772
+ request.uri.decode("ascii"),
1773
+ )
1774
+ raise RequestSendFailed(e, can_retry=True) from e
1775
+ except ResponseFailed as e:
1776
+ logger.warning(
1777
+ "{%s} [%s] Failed to read response - %s %s",
1778
+ request.txn_id,
1779
+ request.destination,
1780
+ request.method,
1781
+ request.uri.decode("ascii"),
1782
+ )
1783
+ raise RequestSendFailed(e, can_retry=True) from e
1784
+ except Exception as e:
1785
+ logger.warning(
1786
+ "{%s} [%s] Error reading response: %s",
1787
+ request.txn_id,
1788
+ request.destination,
1789
+ e,
1790
+ )
1791
+ raise
1792
+
1793
+ if not multipart_response.url:
1794
+ assert multipart_response.length is not None
1795
+ length = multipart_response.length
1796
+ headers[b"Content-Type"] = [multipart_response.content_type]
1797
+ headers[b"Content-Disposition"] = [multipart_response.disposition]
1798
+
1799
+ # the response contained a redirect url to download the file from
1800
+ else:
1801
+ str_url = multipart_response.url.decode("utf-8")
1802
+ logger.info(
1803
+ "{%s} [%s] File download redirected, now downloading from: %s",
1804
+ request.txn_id,
1805
+ request.destination,
1806
+ str_url,
1807
+ )
1808
+ # We don't know how large the response will be upfront, so limit it to
1809
+ # the `max_size` config value.
1810
+ length, headers, _, _ = await self._simple_http_client.get_file(
1811
+ str_url, output_stream, max_size
1812
+ )
1813
+
1814
+ logger.info(
1815
+ "{%s} [%s] Completed: %d %s [%d bytes] %s %s",
1816
+ request.txn_id,
1817
+ request.destination,
1818
+ response.code,
1819
+ response.phrase.decode("ascii", errors="replace"),
1820
+ length,
1821
+ request.method,
1822
+ request.uri.decode("ascii"),
1823
+ )
1824
+
1825
+ # if we didn't know the length upfront, decrement the actual size from ratelimiter
1826
+ if response.length == UNKNOWN_LENGTH:
1827
+ download_ratelimiter.record_action(
1828
+ requester=None, key=ip_address, n_actions=length
1829
+ )
1830
+
1831
+ return length, headers, multipart_response.json
1832
+
1833
+
1834
+ def _flatten_response_never_received(e: BaseException) -> str:
1835
+ if hasattr(e, "reasons"):
1836
+ reasons = ", ".join(
1837
+ _flatten_response_never_received(f.value) for f in e.reasons
1838
+ )
1839
+
1840
+ return "%s:[%s]" % (type(e).__name__, reasons)
1841
+ else:
1842
+ return repr(e)
1843
+
1844
+
1845
+ def check_content_type_is(headers: Headers, expected_content_type: str) -> None:
1846
+ """
1847
+ Check that a set of HTTP headers have a Content-Type header, and that it
1848
+ is the expected value..
1849
+
1850
+ Args:
1851
+ headers: headers to check
1852
+
1853
+ Raises:
1854
+ RequestSendFailed: if the Content-Type header is missing or doesn't match
1855
+
1856
+ """
1857
+ content_type_headers = headers.getRawHeaders(b"Content-Type")
1858
+ if content_type_headers is None:
1859
+ raise RequestSendFailed(
1860
+ RuntimeError("No Content-Type header received from remote server"),
1861
+ can_retry=False,
1862
+ )
1863
+
1864
+ c_type = content_type_headers[0].decode("ascii") # only the first header
1865
+ # Extract the 'essence' of the mimetype, removing any parameter
1866
+ c_type_parsed = c_type.split(";", 1)[0].strip()
1867
+ if c_type_parsed != expected_content_type:
1868
+ raise RequestSendFailed(
1869
+ RuntimeError(
1870
+ f"Remote server sent Content-Type header of '{c_type}', not '{expected_content_type}'",
1871
+ ),
1872
+ can_retry=False,
1873
+ )