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
synapse/http/server.py ADDED
@@ -0,0 +1,1110 @@
1
+ #
2
+ # This file is licensed under the Affero General Public License (AGPL) version 3.
3
+ #
4
+ # Copyright 2014-2016 OpenMarket Ltd
5
+ # Copyright (C) 2023 New Vector, Ltd
6
+ #
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Affero General Public License as
9
+ # published by the Free Software Foundation, either version 3 of the
10
+ # License, or (at your option) any later version.
11
+ #
12
+ # See the GNU Affero General Public License for more details:
13
+ # <https://www.gnu.org/licenses/agpl-3.0.html>.
14
+ #
15
+ # Originally licensed under the Apache License, Version 2.0:
16
+ # <http://www.apache.org/licenses/LICENSE-2.0>.
17
+ #
18
+ # [This file includes modifications made by New Vector Limited]
19
+ #
20
+ #
21
+
22
+ import abc
23
+ import html
24
+ import logging
25
+ import types
26
+ import urllib
27
+ import urllib.parse
28
+ from http import HTTPStatus
29
+ from http.client import FOUND
30
+ from inspect import isawaitable
31
+ from typing import (
32
+ TYPE_CHECKING,
33
+ Any,
34
+ Awaitable,
35
+ Callable,
36
+ Iterable,
37
+ Iterator,
38
+ Pattern,
39
+ Protocol,
40
+ cast,
41
+ )
42
+
43
+ import attr
44
+ import jinja2
45
+ from canonicaljson import encode_canonical_json
46
+ from zope.interface import implementer
47
+
48
+ from twisted.internet import defer, interfaces, reactor
49
+ from twisted.internet.defer import CancelledError
50
+ from twisted.python import failure
51
+ from twisted.web import resource
52
+
53
+ from synapse.types import ISynapseThreadlessReactor
54
+
55
+ try:
56
+ from twisted.web.pages import notFound
57
+ except ImportError:
58
+ from twisted.web.resource import NoResource as notFound # type: ignore[assignment]
59
+
60
+ from twisted.web.resource import IResource
61
+ from twisted.web.server import NOT_DONE_YET, Request
62
+ from twisted.web.static import File
63
+ from twisted.web.util import redirectTo
64
+
65
+ from synapse.api.errors import (
66
+ CodeMessageException,
67
+ Codes,
68
+ LimitExceededError,
69
+ RedirectException,
70
+ SynapseError,
71
+ UnrecognizedRequestError,
72
+ )
73
+ from synapse.config.homeserver import HomeServerConfig
74
+ from synapse.logging.context import defer_to_thread, preserve_fn, run_in_background
75
+ from synapse.logging.opentracing import active_span, start_active_span, trace_servlet
76
+ from synapse.util.caches import intern_dict
77
+ from synapse.util.cancellation import is_function_cancellable
78
+ from synapse.util.clock import Clock
79
+ from synapse.util.iterutils import chunk_seq
80
+ from synapse.util.json import json_encoder
81
+
82
+ if TYPE_CHECKING:
83
+ import opentracing
84
+
85
+ from synapse.http.site import SynapseRequest
86
+ from synapse.server import HomeServer
87
+
88
+ logger = logging.getLogger(__name__)
89
+
90
+ HTML_ERROR_TEMPLATE = """<!DOCTYPE html>
91
+ <html lang=en>
92
+ <head>
93
+ <meta charset="utf-8">
94
+ <title>Error {code}</title>
95
+ </head>
96
+ <body>
97
+ <p>{msg}</p>
98
+ </body>
99
+ </html>
100
+ """
101
+
102
+ # A fictional HTTP status code for requests where the client has disconnected and we
103
+ # successfully cancelled the request. Used only for logging purposes. Clients will never
104
+ # observe this code unless cancellations leak across requests or we raise a
105
+ # `CancelledError` ourselves.
106
+ # Analogous to nginx's 499 status code:
107
+ # https://github.com/nginx/nginx/blob/release-1.21.6/src/http/ngx_http_request.h#L128-L134
108
+ HTTP_STATUS_REQUEST_CANCELLED = 499
109
+
110
+
111
+ def return_json_error(
112
+ f: failure.Failure, request: "SynapseRequest", config: HomeServerConfig | None
113
+ ) -> None:
114
+ """Sends a JSON error response to clients."""
115
+
116
+ if f.check(SynapseError):
117
+ # mypy doesn't understand that f.check asserts the type.
118
+ exc: SynapseError = f.value
119
+ error_code = exc.code
120
+ error_dict = exc.error_dict(config)
121
+ if exc.headers is not None:
122
+ for header, value in exc.headers.items():
123
+ request.setHeader(header, value)
124
+ error_ctx = exc.debug_context
125
+ if error_ctx:
126
+ logger.info(
127
+ "%s SynapseError: %s - %s (%s)", request, error_code, exc.msg, error_ctx
128
+ )
129
+ else:
130
+ logger.info("%s SynapseError: %s - %s", request, error_code, exc.msg)
131
+ elif f.check(CancelledError):
132
+ error_code = HTTP_STATUS_REQUEST_CANCELLED
133
+ error_dict = {"error": "Request cancelled", "errcode": Codes.UNKNOWN}
134
+
135
+ if not request._disconnected:
136
+ logger.error(
137
+ "Got cancellation before client disconnection from %r: %r",
138
+ request.request_metrics.name,
139
+ request,
140
+ exc_info=(f.type, f.value, f.getTracebackObject()),
141
+ )
142
+ else:
143
+ error_code = 500
144
+ error_dict = {"error": "Internal server error", "errcode": Codes.UNKNOWN}
145
+
146
+ logger.error(
147
+ "Failed handle request via %r: %r",
148
+ request.request_metrics.name,
149
+ request,
150
+ exc_info=(f.type, f.value, f.getTracebackObject()),
151
+ )
152
+
153
+ # Only respond with an error response if we haven't already started writing,
154
+ # otherwise lets just kill the connection
155
+ if request.startedWriting:
156
+ if request.channel:
157
+ try:
158
+ request.channel.forceAbortClient()
159
+ except Exception:
160
+ # abortConnection throws if the connection is already closed
161
+ pass
162
+ else:
163
+ respond_with_json(
164
+ request,
165
+ error_code,
166
+ error_dict,
167
+ send_cors=True,
168
+ )
169
+
170
+
171
+ def return_html_error(
172
+ f: failure.Failure,
173
+ request: Request,
174
+ error_template: str | jinja2.Template,
175
+ ) -> None:
176
+ """Sends an HTML error page corresponding to the given failure.
177
+
178
+ Handles RedirectException and other CodeMessageExceptions (such as SynapseError)
179
+
180
+ Args:
181
+ f: the error to report
182
+ request: the failing request
183
+ error_template: the HTML template. Can be either a string (with `{code}`,
184
+ `{msg}` placeholders), or a jinja2 template
185
+ """
186
+ if f.check(CodeMessageException):
187
+ # mypy doesn't understand that f.check asserts the type.
188
+ cme: CodeMessageException = f.value
189
+ code = cme.code
190
+ msg = cme.msg
191
+ if cme.headers is not None:
192
+ for header, value in cme.headers.items():
193
+ request.setHeader(header, value)
194
+
195
+ if isinstance(cme, RedirectException):
196
+ logger.info("%s redirect to %s", request, cme.location)
197
+ request.setHeader(b"location", cme.location)
198
+ request.cookies.extend(cme.cookies)
199
+ elif isinstance(cme, SynapseError):
200
+ logger.info("%s SynapseError: %s - %s", request, code, msg)
201
+ else:
202
+ logger.error(
203
+ "Failed handle request %r",
204
+ request,
205
+ exc_info=(f.type, f.value, f.getTracebackObject()),
206
+ )
207
+ elif f.check(CancelledError):
208
+ code = HTTP_STATUS_REQUEST_CANCELLED
209
+ msg = "Request cancelled"
210
+
211
+ if not request._disconnected:
212
+ logger.error(
213
+ "Got cancellation before client disconnection when handling request %r",
214
+ request,
215
+ exc_info=(f.type, f.value, f.getTracebackObject()),
216
+ )
217
+ else:
218
+ code = HTTPStatus.INTERNAL_SERVER_ERROR
219
+ msg = "Internal server error"
220
+
221
+ logger.error(
222
+ "Failed handle request %r",
223
+ request,
224
+ exc_info=(f.type, f.value, f.getTracebackObject()),
225
+ )
226
+
227
+ if isinstance(error_template, str):
228
+ body = error_template.format(code=code, msg=html.escape(msg))
229
+ else:
230
+ body = error_template.render(code=code, msg=msg)
231
+
232
+ respond_with_html(request, code, body)
233
+
234
+
235
+ def wrap_async_request_handler(
236
+ h: Callable[["_AsyncResource", "SynapseRequest"], Awaitable[None]],
237
+ ) -> Callable[["_AsyncResource", "SynapseRequest"], "defer.Deferred[None]"]:
238
+ """Wraps an async request handler so that it calls request.processing.
239
+
240
+ This helps ensure that work done by the request handler after the request is completed
241
+ is correctly recorded against the request metrics/logs.
242
+
243
+ The handler method must have a signature of "handle_foo(self, request)",
244
+ where "request" must be a SynapseRequest.
245
+
246
+ The handler may return a deferred, in which case the completion of the request isn't
247
+ logged until the deferred completes.
248
+ """
249
+
250
+ async def wrapped_async_request_handler(
251
+ self: "_AsyncResource", request: "SynapseRequest"
252
+ ) -> None:
253
+ with request.processing():
254
+ await h(self, request)
255
+
256
+ # we need to preserve_fn here, because the synchronous render method won't yield for
257
+ # us (obviously)
258
+ return preserve_fn(wrapped_async_request_handler)
259
+
260
+
261
+ # Type of a callback method for processing requests
262
+ # it is actually called with a SynapseRequest and a kwargs dict for the params,
263
+ # but I can't figure out how to represent that.
264
+ ServletCallback = Callable[
265
+ ..., None | Awaitable[None] | tuple[int, Any] | Awaitable[tuple[int, Any]]
266
+ ]
267
+
268
+
269
+ class HttpServer(Protocol):
270
+ """Interface for registering callbacks on a HTTP server"""
271
+
272
+ def register_paths(
273
+ self,
274
+ method: str,
275
+ path_patterns: Iterable[Pattern[str]],
276
+ callback: ServletCallback,
277
+ servlet_classname: str,
278
+ ) -> None:
279
+ """Register a callback that gets fired if we receive a http request
280
+ with the given method for a path that matches the given regex.
281
+
282
+ If the regex contains groups these gets passed to the callback via
283
+ an unpacked tuple.
284
+
285
+ The callback may be marked with the `@cancellable` decorator, which will
286
+ cause request processing to be cancelled when clients disconnect early.
287
+
288
+ Args:
289
+ method: The HTTP method to listen to.
290
+ path_patterns: The regex used to match requests.
291
+ callback: The function to fire if we receive a matched
292
+ request. The first argument will be the request object and
293
+ subsequent arguments will be any matched groups from the regex.
294
+ This should return either tuple of (code, response), or None.
295
+ servlet_classname: The name of the handler to be used in prometheus
296
+ and opentracing logs.
297
+ """
298
+
299
+
300
+ class _AsyncResource(resource.Resource, metaclass=abc.ABCMeta):
301
+ """Base class for resources that have async handlers.
302
+
303
+ Sub classes can either implement `_async_render_<METHOD>` to handle
304
+ requests by method, or override `_async_render` to handle all requests.
305
+
306
+ Args:
307
+ extract_context: Whether to attempt to extract the opentracing
308
+ context from the request the servlet is handling.
309
+ """
310
+
311
+ def __init__(self, clock: Clock, extract_context: bool = False):
312
+ super().__init__()
313
+
314
+ self._clock = clock
315
+ self._extract_context = extract_context
316
+
317
+ def render(self, request: "SynapseRequest") -> int:
318
+ """This gets called by twisted every time someone sends us a request."""
319
+ request.render_deferred = defer.ensureDeferred(
320
+ self._async_render_wrapper(request)
321
+ )
322
+ return NOT_DONE_YET
323
+
324
+ @wrap_async_request_handler
325
+ async def _async_render_wrapper(self, request: "SynapseRequest") -> None:
326
+ """This is a wrapper that delegates to `_async_render` and handles
327
+ exceptions, return values, metrics, etc.
328
+ """
329
+ try:
330
+ request.request_metrics.name = self.__class__.__name__
331
+
332
+ with trace_servlet(request, self._extract_context):
333
+ try:
334
+ callback_return = await self._async_render(request)
335
+ except LimitExceededError as e:
336
+ if e.pause:
337
+ await self._clock.sleep(e.pause)
338
+ raise
339
+
340
+ if callback_return is not None:
341
+ code, response = callback_return
342
+ self._send_response(request, code, response)
343
+ except Exception:
344
+ # failure.Failure() fishes the original Failure out
345
+ # of our stack, and thus gives us a sensible stack
346
+ # trace.
347
+ f = failure.Failure()
348
+ self._send_error_response(f, request)
349
+
350
+ async def _async_render(self, request: "SynapseRequest") -> tuple[int, Any] | None:
351
+ """Delegates to `_async_render_<METHOD>` methods, or returns a 400 if
352
+ no appropriate method exists. Can be overridden in sub classes for
353
+ different routing.
354
+ """
355
+ # Treat HEAD requests as GET requests.
356
+ request_method = request.method.decode("ascii")
357
+ if request_method == "HEAD":
358
+ request_method = "GET"
359
+
360
+ method_handler = getattr(self, "_async_render_%s" % (request_method,), None)
361
+ if method_handler:
362
+ request.is_render_cancellable = is_function_cancellable(method_handler)
363
+
364
+ raw_callback_return = method_handler(request)
365
+
366
+ # Is it synchronous? We'll allow this for now.
367
+ if isawaitable(raw_callback_return):
368
+ callback_return = await raw_callback_return
369
+ else:
370
+ callback_return = raw_callback_return
371
+
372
+ return callback_return
373
+
374
+ # A request with an unknown method (for a known endpoint) was received.
375
+ raise UnrecognizedRequestError(code=405)
376
+
377
+ @abc.abstractmethod
378
+ def _send_response(
379
+ self,
380
+ request: "SynapseRequest",
381
+ code: int,
382
+ response_object: Any,
383
+ ) -> None:
384
+ raise NotImplementedError()
385
+
386
+ @abc.abstractmethod
387
+ def _send_error_response(
388
+ self,
389
+ f: failure.Failure,
390
+ request: "SynapseRequest",
391
+ ) -> None:
392
+ raise NotImplementedError()
393
+
394
+
395
+ class DirectServeJsonResource(_AsyncResource):
396
+ """A resource that will call `self._async_on_<METHOD>` on new requests,
397
+ formatting responses and errors as JSON.
398
+ """
399
+
400
+ def __init__(
401
+ self,
402
+ canonical_json: bool = False,
403
+ extract_context: bool = False,
404
+ # Clock is optional as this class is exposed to the module API.
405
+ clock: Clock | None = None,
406
+ ):
407
+ """
408
+ Args:
409
+ canonical_json: TODO
410
+ extract_context: TODO
411
+ clock: This is expected to be passed in by any Synapse code.
412
+ Only optional for the Module API.
413
+ """
414
+
415
+ if clock is None:
416
+ # Ideally we wouldn't ignore the linter error here and instead enforce a
417
+ # required `Clock` be passed into the `__init__` function.
418
+ # However, this would change the function signature which is currently being
419
+ # exported to the module api. Since we don't want to break that api, we have
420
+ # to settle with ignoring the linter error here.
421
+ # As of the time of writing this, all Synapse internal usages of
422
+ # `DirectServeJsonResource` pass in the existing homeserver clock instance.
423
+ clock = Clock( # type: ignore[multiple-internal-clocks]
424
+ cast(ISynapseThreadlessReactor, reactor),
425
+ server_name="synapse_module_running_from_unknown_server",
426
+ )
427
+
428
+ super().__init__(clock, extract_context)
429
+ self.canonical_json = canonical_json
430
+
431
+ def _send_response(
432
+ self,
433
+ request: "SynapseRequest",
434
+ code: int,
435
+ response_object: Any,
436
+ ) -> None:
437
+ """Implements _AsyncResource._send_response"""
438
+ # TODO: Only enable CORS for the requests that need it.
439
+ respond_with_json(
440
+ request,
441
+ code,
442
+ response_object,
443
+ send_cors=True,
444
+ canonical_json=self.canonical_json,
445
+ )
446
+
447
+ def _send_error_response(
448
+ self,
449
+ f: failure.Failure,
450
+ request: "SynapseRequest",
451
+ ) -> None:
452
+ """Implements _AsyncResource._send_error_response"""
453
+ return_json_error(f, request, None)
454
+
455
+
456
+ @attr.s(slots=True, frozen=True, auto_attribs=True)
457
+ class _PathEntry:
458
+ callback: ServletCallback
459
+ servlet_classname: str
460
+
461
+
462
+ class JsonResource(DirectServeJsonResource):
463
+ """This implements the HttpServer interface and provides JSON support for
464
+ Resources.
465
+
466
+ Register callbacks via register_paths()
467
+
468
+ Callbacks can return a tuple of status code and a dict in which case the
469
+ the dict will automatically be sent to the client as a JSON object.
470
+
471
+ The JsonResource is primarily intended for returning JSON, but callbacks
472
+ may send something other than JSON, they may do so by using the methods
473
+ on the request object and instead returning None.
474
+ """
475
+
476
+ isLeaf = True
477
+
478
+ def __init__(
479
+ self,
480
+ hs: "HomeServer",
481
+ canonical_json: bool = True,
482
+ extract_context: bool = False,
483
+ ):
484
+ self.clock = hs.get_clock()
485
+ super().__init__(canonical_json, extract_context, clock=self.clock)
486
+ # Map of path regex -> method -> callback.
487
+ self._routes: dict[Pattern[str], dict[bytes, _PathEntry]] = {}
488
+ self.hs = hs
489
+
490
+ def register_paths(
491
+ self,
492
+ method: str,
493
+ path_patterns: Iterable[Pattern[str]],
494
+ callback: ServletCallback,
495
+ servlet_classname: str,
496
+ ) -> None:
497
+ """
498
+ Registers a request handler against a regular expression. Later request URLs are
499
+ checked against these regular expressions in order to identify an appropriate
500
+ handler for that request.
501
+
502
+ Args:
503
+ method: GET, POST etc
504
+
505
+ path_patterns: A list of regular expressions to which the request
506
+ URLs are compared.
507
+
508
+ callback: The handler for the request. Usually a Servlet
509
+
510
+ servlet_classname: The name of the handler to be used in prometheus
511
+ and opentracing logs.
512
+ """
513
+ method_bytes = method.encode("utf-8")
514
+
515
+ for path_pattern in path_patterns:
516
+ logger.debug("Registering for %s %s", method, path_pattern.pattern)
517
+ self._routes.setdefault(path_pattern, {})[method_bytes] = _PathEntry(
518
+ callback, servlet_classname
519
+ )
520
+
521
+ def _get_handler_for_request(
522
+ self, request: "SynapseRequest"
523
+ ) -> tuple[ServletCallback, str, dict[str, str]]:
524
+ """Finds a callback method to handle the given request.
525
+
526
+ Returns:
527
+ A tuple of the callback to use, the name of the servlet, and the
528
+ key word arguments to pass to the callback
529
+ """
530
+ # At this point the path must be bytes.
531
+ request_path_bytes: bytes = request.path
532
+ request_path = request_path_bytes.decode("ascii")
533
+ # Treat HEAD requests as GET requests.
534
+ request_method = request.method
535
+ if request_method == b"HEAD":
536
+ request_method = b"GET"
537
+
538
+ # Loop through all the registered callbacks to check if the method
539
+ # and path regex match
540
+ for path_pattern, methods in self._routes.items():
541
+ m = path_pattern.match(request_path)
542
+ if m:
543
+ # We found a matching path!
544
+ path_entry = methods.get(request_method)
545
+ if not path_entry:
546
+ raise UnrecognizedRequestError(code=405)
547
+ return path_entry.callback, path_entry.servlet_classname, m.groupdict()
548
+
549
+ # Huh. No one wanted to handle that? Fiiiiiine.
550
+ raise UnrecognizedRequestError(code=404)
551
+
552
+ async def _async_render(self, request: "SynapseRequest") -> tuple[int, Any]:
553
+ callback, servlet_classname, group_dict = self._get_handler_for_request(request)
554
+
555
+ request.is_render_cancellable = is_function_cancellable(callback)
556
+
557
+ # Make sure we have an appropriate name for this handler in prometheus
558
+ # (rather than the default of JsonResource).
559
+ request.request_metrics.name = servlet_classname
560
+
561
+ # Now trigger the callback. If it returns a response, we send it
562
+ # here. If it throws an exception, that is handled by the wrapper
563
+ # installed by @request_handler.
564
+ kwargs = intern_dict(
565
+ {
566
+ name: urllib.parse.unquote(value) if value else value
567
+ for name, value in group_dict.items()
568
+ }
569
+ )
570
+
571
+ raw_callback_return = callback(request, **kwargs)
572
+
573
+ # Is it synchronous? We'll allow this for now.
574
+ if isinstance(raw_callback_return, (defer.Deferred, types.CoroutineType)):
575
+ callback_return = await raw_callback_return
576
+ else:
577
+ callback_return = raw_callback_return
578
+
579
+ return callback_return
580
+
581
+ def _send_error_response(
582
+ self,
583
+ f: failure.Failure,
584
+ request: "SynapseRequest",
585
+ ) -> None:
586
+ """Implements _AsyncResource._send_error_response"""
587
+ return_json_error(f, request, self.hs.config)
588
+
589
+
590
+ class DirectServeHtmlResource(_AsyncResource):
591
+ """A resource that will call `self._async_on_<METHOD>` on new requests,
592
+ formatting responses and errors as HTML.
593
+ """
594
+
595
+ # The error template to use for this resource
596
+ ERROR_TEMPLATE = HTML_ERROR_TEMPLATE
597
+
598
+ def __init__(
599
+ self,
600
+ extract_context: bool = False,
601
+ # Clock is optional as this class is exposed to the module API.
602
+ clock: Clock | None = None,
603
+ ):
604
+ """
605
+ Args:
606
+ extract_context: TODO
607
+ clock: This is expected to be passed in by any Synapse code.
608
+ Only optional for the Module API.
609
+ """
610
+ if clock is None:
611
+ # Ideally we wouldn't ignore the linter error here and instead enforce a
612
+ # required `Clock` be passed into the `__init__` function.
613
+ # However, this would change the function signature which is currently being
614
+ # exported to the module api. Since we don't want to break that api, we have
615
+ # to settle with ignoring the linter error here.
616
+ # As of the time of writing this, all Synapse internal usages of
617
+ # `DirectServeHtmlResource` pass in the existing homeserver clock instance.
618
+ clock = Clock( # type: ignore[multiple-internal-clocks]
619
+ cast(ISynapseThreadlessReactor, reactor),
620
+ server_name="synapse_module_running_from_unknown_server",
621
+ )
622
+
623
+ super().__init__(clock, extract_context)
624
+
625
+ def _send_response(
626
+ self,
627
+ request: "SynapseRequest",
628
+ code: int,
629
+ response_object: Any,
630
+ ) -> None:
631
+ """Implements _AsyncResource._send_response"""
632
+ # We expect to get bytes for us to write
633
+ assert isinstance(response_object, bytes)
634
+ html_bytes = response_object
635
+
636
+ respond_with_html_bytes(request, code, html_bytes)
637
+
638
+ def _send_error_response(
639
+ self,
640
+ f: failure.Failure,
641
+ request: "SynapseRequest",
642
+ ) -> None:
643
+ """Implements _AsyncResource._send_error_response"""
644
+ return_html_error(f, request, self.ERROR_TEMPLATE)
645
+
646
+
647
+ class StaticResource(File):
648
+ """
649
+ A resource that represents a plain non-interpreted file or directory.
650
+
651
+ Differs from the File resource by adding clickjacking protection.
652
+ """
653
+
654
+ def render_GET(self, request: Request) -> bytes:
655
+ set_clickjacking_protection_headers(request)
656
+ return super().render_GET(request)
657
+
658
+ def directoryListing(self) -> IResource:
659
+ return notFound()
660
+
661
+
662
+ class UnrecognizedRequestResource(resource.Resource):
663
+ """
664
+ Similar to twisted.web.resource.NoResource, but returns a JSON 404 with an
665
+ errcode of M_UNRECOGNIZED.
666
+ """
667
+
668
+ def render(self, request: "SynapseRequest") -> int:
669
+ f = failure.Failure(UnrecognizedRequestError(code=404))
670
+ return_json_error(f, request, None)
671
+ # A response has already been sent but Twisted requires either NOT_DONE_YET
672
+ # or the response bytes as a return value.
673
+ return NOT_DONE_YET
674
+
675
+ def getChild(self, name: str, request: Request) -> resource.Resource:
676
+ return self
677
+
678
+
679
+ class RootRedirect(resource.Resource):
680
+ """Redirects the root '/' path to another path."""
681
+
682
+ def __init__(self, path: str):
683
+ super().__init__()
684
+ self.url = path
685
+
686
+ def render_GET(self, request: Request) -> bytes:
687
+ return redirectTo(self.url.encode("ascii"), request)
688
+
689
+ def getChild(self, name: str, request: Request) -> resource.Resource:
690
+ if len(name) == 0:
691
+ return self # select ourselves as the child to render
692
+ return super().getChild(name, request)
693
+
694
+
695
+ class OptionsResource(resource.Resource):
696
+ """Responds to OPTION requests for itself and all children."""
697
+
698
+ def render_OPTIONS(self, request: "SynapseRequest") -> bytes:
699
+ request.setResponseCode(204)
700
+ request.setHeader(b"Content-Length", b"0")
701
+
702
+ set_cors_headers(request)
703
+
704
+ return b""
705
+
706
+ def getChildWithDefault(self, path: str, request: Request) -> resource.Resource:
707
+ if request.method == b"OPTIONS":
708
+ return self # select ourselves as the child to render
709
+ return super().getChildWithDefault(path, request)
710
+
711
+
712
+ class RootOptionsRedirectResource(OptionsResource, RootRedirect):
713
+ pass
714
+
715
+
716
+ @implementer(interfaces.IPushProducer)
717
+ class _ByteProducer:
718
+ """
719
+ Iteratively write bytes to the request.
720
+ """
721
+
722
+ # The minimum number of bytes for each chunk. Note that the last chunk will
723
+ # usually be smaller than this.
724
+ min_chunk_size = 1024
725
+
726
+ def __init__(
727
+ self,
728
+ request: Request,
729
+ iterator: Iterator[bytes],
730
+ ):
731
+ self._request: Request | None = request
732
+ self._iterator = iterator
733
+ self._paused = False
734
+ self.tracing_scope = start_active_span(
735
+ "write_bytes_to_request",
736
+ )
737
+ self.tracing_scope.__enter__()
738
+
739
+ try:
740
+ self._request.registerProducer(self, True)
741
+ except AttributeError as e:
742
+ # Calling self._request.registerProducer might raise an AttributeError since
743
+ # the underlying Twisted code calls self._request.channel.registerProducer,
744
+ # however self._request.channel will be None if the connection was lost.
745
+ logger.info("Connection disconnected before response was written: %r", e)
746
+
747
+ # We drop our references to data we'll not use.
748
+ self._iterator = iter(())
749
+ self.tracing_scope.__exit__(type(e), None, e.__traceback__)
750
+ else:
751
+ # Start producing if `registerProducer` was successful
752
+ self.resumeProducing()
753
+
754
+ def _send_data(self, data: list[bytes]) -> None:
755
+ """
756
+ Send a list of bytes as a chunk of a response.
757
+ """
758
+ if not data or not self._request:
759
+ return
760
+ self._request.write(b"".join(data))
761
+
762
+ def pauseProducing(self) -> None:
763
+ opentracing_span = active_span()
764
+ if opentracing_span is not None:
765
+ opentracing_span.log_kv({"event": "producer_paused"})
766
+ self._paused = True
767
+
768
+ def resumeProducing(self) -> None:
769
+ # We've stopped producing in the meantime (note that this might be
770
+ # re-entrant after calling write).
771
+ if not self._request:
772
+ return
773
+
774
+ self._paused = False
775
+
776
+ opentracing_span = active_span()
777
+ if opentracing_span is not None:
778
+ opentracing_span.log_kv({"event": "producer_resumed"})
779
+
780
+ # Write until there's backpressure telling us to stop.
781
+ while not self._paused:
782
+ # Get the next chunk and write it to the request.
783
+ #
784
+ # The output of the JSON encoder is buffered and coalesced until
785
+ # min_chunk_size is reached. This is because JSON encoders produce
786
+ # very small output per iteration and the Request object converts
787
+ # each call to write() to a separate chunk. Without this there would
788
+ # be an explosion in bytes written (e.g. b"{" becoming "1\r\n{\r\n").
789
+ #
790
+ # Note that buffer stores a list of bytes (instead of appending to
791
+ # bytes) to hopefully avoid many allocations.
792
+ buffer = []
793
+ buffered_bytes = 0
794
+ while buffered_bytes < self.min_chunk_size:
795
+ try:
796
+ data = next(self._iterator)
797
+ buffer.append(data)
798
+ buffered_bytes += len(data)
799
+ except StopIteration:
800
+ # The entire JSON object has been serialized, write any
801
+ # remaining data, finalize the producer and the request, and
802
+ # clean-up any references.
803
+ self._send_data(buffer)
804
+ self._request.unregisterProducer()
805
+ self._request.finish()
806
+ self.stopProducing()
807
+ return
808
+
809
+ self._send_data(buffer)
810
+
811
+ def stopProducing(self) -> None:
812
+ # Clear a circular reference.
813
+ self._request = None
814
+ self.tracing_scope.__exit__(None, None, None)
815
+
816
+
817
+ def _encode_json_bytes(json_object: object) -> bytes:
818
+ """
819
+ Encode an object into JSON. Returns an iterator of bytes.
820
+ """
821
+ return json_encoder.encode(json_object).encode("utf-8")
822
+
823
+
824
+ def respond_with_json(
825
+ request: "SynapseRequest",
826
+ code: int,
827
+ json_object: Any,
828
+ send_cors: bool = False,
829
+ canonical_json: bool = True,
830
+ ) -> int | None:
831
+ """Sends encoded JSON in response to the given request.
832
+
833
+ Args:
834
+ request: The http request to respond to.
835
+ code: The HTTP response code.
836
+ json_object: The object to serialize to JSON.
837
+ send_cors: Whether to send Cross-Origin Resource Sharing headers
838
+ https://fetch.spec.whatwg.org/#http-cors-protocol
839
+ canonical_json: Whether to use the canonicaljson algorithm when encoding
840
+ the JSON bytes.
841
+
842
+ Returns:
843
+ twisted.web.server.NOT_DONE_YET if the request is still active.
844
+ """
845
+ # The response code must always be set, for logging purposes.
846
+ request.setResponseCode(code)
847
+
848
+ # could alternatively use request.notifyFinish() and flip a flag when
849
+ # the Deferred fires, but since the flag is RIGHT THERE it seems like
850
+ # a waste.
851
+ if request._disconnected:
852
+ logger.warning(
853
+ "Not sending response to request %s, already disconnected.", request
854
+ )
855
+ return None
856
+
857
+ if canonical_json:
858
+ encoder: Callable[[object], bytes] = encode_canonical_json
859
+ else:
860
+ encoder = _encode_json_bytes
861
+
862
+ request.setHeader(b"Content-Type", b"application/json")
863
+ request.setHeader(b"Cache-Control", b"no-cache, no-store, must-revalidate")
864
+
865
+ if send_cors:
866
+ set_cors_headers(request)
867
+
868
+ run_in_background(
869
+ _async_write_json_to_request_in_thread, request, encoder, json_object
870
+ )
871
+ return NOT_DONE_YET
872
+
873
+
874
+ def respond_with_json_bytes(
875
+ request: "SynapseRequest",
876
+ code: int,
877
+ json_bytes: bytes,
878
+ send_cors: bool = False,
879
+ ) -> int | None:
880
+ """Sends encoded JSON in response to the given request.
881
+
882
+ Args:
883
+ request: The http request to respond to.
884
+ code: The HTTP response code.
885
+ json_bytes: The json bytes to use as the response body.
886
+ send_cors: Whether to send Cross-Origin Resource Sharing headers
887
+ https://fetch.spec.whatwg.org/#http-cors-protocol
888
+
889
+ Returns:
890
+ twisted.web.server.NOT_DONE_YET if the request is still active.
891
+ """
892
+ # The response code must always be set, for logging purposes.
893
+ request.setResponseCode(code)
894
+
895
+ if request._disconnected:
896
+ logger.warning(
897
+ "Not sending response to request %s, already disconnected.", request
898
+ )
899
+ return None
900
+
901
+ request.setHeader(b"Content-Type", b"application/json")
902
+ request.setHeader(b"Content-Length", b"%d" % (len(json_bytes),))
903
+ request.setHeader(b"Cache-Control", b"no-cache, no-store, must-revalidate")
904
+
905
+ if send_cors:
906
+ set_cors_headers(request)
907
+
908
+ _write_bytes_to_request(request, json_bytes)
909
+ return NOT_DONE_YET
910
+
911
+
912
+ async def _async_write_json_to_request_in_thread(
913
+ request: "SynapseRequest",
914
+ json_encoder: Callable[[Any], bytes],
915
+ json_object: Any,
916
+ ) -> None:
917
+ """Encodes the given JSON object on a thread and then writes it to the
918
+ request.
919
+
920
+ This is done so that encoding large JSON objects doesn't block the reactor
921
+ thread.
922
+
923
+ Note: We don't use JsonEncoder.iterencode here as that falls back to the
924
+ Python implementation (rather than the C backend), which is *much* more
925
+ expensive.
926
+ """
927
+
928
+ def encode(opentracing_span: "opentracing.Span | None") -> bytes:
929
+ # it might take a while for the threadpool to schedule us, so we write
930
+ # opentracing logs once we actually get scheduled, so that we can see how
931
+ # much that contributed.
932
+ if opentracing_span:
933
+ opentracing_span.log_kv({"event": "scheduled"})
934
+ res = json_encoder(json_object)
935
+ if opentracing_span:
936
+ opentracing_span.log_kv({"event": "encoded"})
937
+ return res
938
+
939
+ with start_active_span("encode_json_response"):
940
+ span = active_span()
941
+ json_str = await defer_to_thread(request.reactor, encode, span)
942
+
943
+ _write_bytes_to_request(request, json_str)
944
+
945
+
946
+ def _write_bytes_to_request(request: Request, bytes_to_write: bytes) -> None:
947
+ """Writes the bytes to the request using an appropriate producer.
948
+
949
+ Note: This should be used instead of `Request.write` to correctly handle
950
+ large response bodies.
951
+ """
952
+
953
+ # The problem with dumping all of the response into the `Request` object at
954
+ # once (via `Request.write`) is that doing so starts the timeout for the
955
+ # next request to be received: so if it takes longer than 60s to stream back
956
+ # the response to the client, the client never gets it.
957
+ # c.f https://github.com/twisted/twisted/issues/12498
958
+ #
959
+ # One workaround is to use a `Producer`; then the timeout is only
960
+ # started once all of the content is sent over the TCP connection.
961
+
962
+ # To make sure we don't write all of the bytes at once we split it up into
963
+ # chunks.
964
+ chunk_size = 4096
965
+ bytes_generator = chunk_seq(bytes_to_write, chunk_size)
966
+
967
+ # We use a `_ByteProducer` here rather than `NoRangeStaticProducer` as the
968
+ # unit tests can't cope with being given a pull producer.
969
+ _ByteProducer(request, bytes_generator)
970
+
971
+
972
+ def set_cors_headers(request: "SynapseRequest") -> None:
973
+ """Set the CORS headers so that javascript running in a web browsers can
974
+ use this API
975
+
976
+ Args:
977
+ request: The http request to add CORS to.
978
+ """
979
+ request.setHeader(b"Access-Control-Allow-Origin", b"*")
980
+ request.setHeader(
981
+ b"Access-Control-Allow-Methods", b"GET, HEAD, POST, PUT, DELETE, OPTIONS"
982
+ )
983
+ if request.path is not None and (
984
+ request.path == b"/_matrix/client/unstable/org.matrix.msc4108/rendezvous"
985
+ or request.path.startswith(b"/_synapse/client/rendezvous")
986
+ ):
987
+ request.setHeader(
988
+ b"Access-Control-Allow-Headers",
989
+ b"Content-Type, If-Match, If-None-Match",
990
+ )
991
+ request.setHeader(
992
+ b"Access-Control-Expose-Headers",
993
+ b"Synapse-Trace-Id, Server, ETag",
994
+ )
995
+ else:
996
+ request.setHeader(
997
+ b"Access-Control-Allow-Headers",
998
+ b"X-Requested-With, Content-Type, Authorization, Date",
999
+ )
1000
+ request.setHeader(
1001
+ b"Access-Control-Expose-Headers",
1002
+ b"Synapse-Trace-Id, Server",
1003
+ )
1004
+
1005
+
1006
+ def set_corp_headers(request: Request) -> None:
1007
+ """Set the CORP headers so that javascript running in a web browsers can
1008
+ embed the resource returned from this request when their client requires
1009
+ the `Cross-Origin-Embedder-Policy: require-corp` header.
1010
+
1011
+ Args:
1012
+ request: The http request to add the CORP header to.
1013
+ """
1014
+ request.setHeader(b"Cross-Origin-Resource-Policy", b"cross-origin")
1015
+
1016
+
1017
+ def respond_with_html(request: Request, code: int, html: str) -> None:
1018
+ """
1019
+ Wraps `respond_with_html_bytes` by first encoding HTML from a str to UTF-8 bytes.
1020
+ """
1021
+ respond_with_html_bytes(request, code, html.encode("utf-8"))
1022
+
1023
+
1024
+ def respond_with_html_bytes(request: Request, code: int, html_bytes: bytes) -> None:
1025
+ """
1026
+ Sends HTML (encoded as UTF-8 bytes) as the response to the given request.
1027
+
1028
+ Note that this adds clickjacking protection headers and finishes the request.
1029
+
1030
+ Args:
1031
+ request: The http request to respond to.
1032
+ code: The HTTP response code.
1033
+ html_bytes: The HTML bytes to use as the response body.
1034
+ """
1035
+ # The response code must always be set, for logging purposes.
1036
+ request.setResponseCode(code)
1037
+
1038
+ # could alternatively use request.notifyFinish() and flip a flag when
1039
+ # the Deferred fires, but since the flag is RIGHT THERE it seems like
1040
+ # a waste.
1041
+ if request._disconnected:
1042
+ logger.warning(
1043
+ "Not sending response to request %s, already disconnected.", request
1044
+ )
1045
+ return None
1046
+
1047
+ request.setHeader(b"Content-Type", b"text/html; charset=utf-8")
1048
+ request.setHeader(b"Content-Length", b"%d" % (len(html_bytes),))
1049
+
1050
+ # Ensure this content cannot be embedded.
1051
+ set_clickjacking_protection_headers(request)
1052
+
1053
+ request.write(html_bytes)
1054
+ finish_request(request)
1055
+
1056
+
1057
+ def set_clickjacking_protection_headers(request: Request) -> None:
1058
+ """
1059
+ Set headers to guard against clickjacking of embedded content.
1060
+
1061
+ This sets the X-Frame-Options and Content-Security-Policy headers which instructs
1062
+ browsers to not allow the HTML of the response to be embedded onto another
1063
+ page.
1064
+
1065
+ Args:
1066
+ request: The http request to add the headers to.
1067
+ """
1068
+ request.setHeader(b"X-Frame-Options", b"DENY")
1069
+ request.setHeader(b"Content-Security-Policy", b"frame-ancestors 'none';")
1070
+
1071
+
1072
+ def respond_with_redirect(
1073
+ request: "SynapseRequest", url: bytes, statusCode: int = FOUND, cors: bool = False
1074
+ ) -> None:
1075
+ """
1076
+ Write a 302 (or other specified status code) response to the request, if it is still alive.
1077
+
1078
+ Args:
1079
+ request: The http request to respond to.
1080
+ url: The URL to redirect to.
1081
+ statusCode: The HTTP status code to use for the redirect (defaults to 302).
1082
+ cors: Whether to set CORS headers on the response.
1083
+ """
1084
+ logger.debug("Redirect to %s", url.decode("utf-8"))
1085
+
1086
+ if cors:
1087
+ set_cors_headers(request)
1088
+
1089
+ request.setResponseCode(statusCode)
1090
+ request.setHeader(b"location", url)
1091
+ finish_request(request)
1092
+
1093
+
1094
+ def finish_request(request: Request) -> None:
1095
+ """Finish writing the response to the request.
1096
+
1097
+ Twisted throws a RuntimeException if the connection closed before the
1098
+ response was written but doesn't provide a convenient or reliable way to
1099
+ determine if the connection was closed. So we catch and log the RuntimeException
1100
+
1101
+ You might think that ``request.notifyFinish`` could be used to tell if the
1102
+ request was finished. However the deferred it returns won't fire if the
1103
+ connection was already closed, meaning we'd have to have called the method
1104
+ right at the start of the request. By the time we want to write the response
1105
+ it will already be too late.
1106
+ """
1107
+ try:
1108
+ request.finish()
1109
+ except RuntimeError as e:
1110
+ logger.info("Connection disconnected before response was written: %r", e)