matrix-synapse 1.142.0rc3__cp314-abi3-musllinux_1_2_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.

Potentially problematic release.


This version of matrix-synapse might be problematic. Click here for more details.

Files changed (1057) hide show
  1. matrix_synapse-1.142.0rc3.dist-info/AUTHORS.rst +51 -0
  2. matrix_synapse-1.142.0rc3.dist-info/LICENSE-AGPL-3.0 +661 -0
  3. matrix_synapse-1.142.0rc3.dist-info/LICENSE-COMMERCIAL +6 -0
  4. matrix_synapse-1.142.0rc3.dist-info/METADATA +375 -0
  5. matrix_synapse-1.142.0rc3.dist-info/RECORD +1057 -0
  6. matrix_synapse-1.142.0rc3.dist-info/WHEEL +4 -0
  7. matrix_synapse-1.142.0rc3.dist-info/entry_points.txt +14 -0
  8. matrix_synapse.libs/libgcc_s-2d945d6c.so.1 +0 -0
  9. synapse/__init__.py +97 -0
  10. synapse/_scripts/__init__.py +0 -0
  11. synapse/_scripts/export_signing_key.py +109 -0
  12. synapse/_scripts/generate_config.py +83 -0
  13. synapse/_scripts/generate_log_config.py +56 -0
  14. synapse/_scripts/generate_signing_key.py +55 -0
  15. synapse/_scripts/generate_workers_map.py +318 -0
  16. synapse/_scripts/hash_password.py +95 -0
  17. synapse/_scripts/move_remote_media_to_new_store.py +128 -0
  18. synapse/_scripts/register_new_matrix_user.py +374 -0
  19. synapse/_scripts/review_recent_signups.py +212 -0
  20. synapse/_scripts/synapse_port_db.py +1603 -0
  21. synapse/_scripts/synctl.py +365 -0
  22. synapse/_scripts/update_synapse_database.py +130 -0
  23. synapse/api/__init__.py +20 -0
  24. synapse/api/auth/__init__.py +207 -0
  25. synapse/api/auth/base.py +406 -0
  26. synapse/api/auth/internal.py +299 -0
  27. synapse/api/auth/mas.py +457 -0
  28. synapse/api/auth/msc3861_delegated.py +617 -0
  29. synapse/api/auth_blocking.py +144 -0
  30. synapse/api/constants.py +362 -0
  31. synapse/api/errors.py +907 -0
  32. synapse/api/filtering.py +539 -0
  33. synapse/api/presence.py +104 -0
  34. synapse/api/ratelimiting.py +482 -0
  35. synapse/api/room_versions.py +535 -0
  36. synapse/api/urls.py +119 -0
  37. synapse/app/__init__.py +60 -0
  38. synapse/app/_base.py +866 -0
  39. synapse/app/admin_cmd.py +388 -0
  40. synapse/app/appservice.py +30 -0
  41. synapse/app/client_reader.py +30 -0
  42. synapse/app/complement_fork_starter.py +206 -0
  43. synapse/app/event_creator.py +29 -0
  44. synapse/app/federation_reader.py +30 -0
  45. synapse/app/federation_sender.py +30 -0
  46. synapse/app/frontend_proxy.py +30 -0
  47. synapse/app/generic_worker.py +475 -0
  48. synapse/app/homeserver.py +504 -0
  49. synapse/app/media_repository.py +30 -0
  50. synapse/app/phone_stats_home.py +296 -0
  51. synapse/app/pusher.py +30 -0
  52. synapse/app/synchrotron.py +30 -0
  53. synapse/app/user_dir.py +31 -0
  54. synapse/appservice/__init__.py +461 -0
  55. synapse/appservice/api.py +569 -0
  56. synapse/appservice/scheduler.py +567 -0
  57. synapse/config/__init__.py +27 -0
  58. synapse/config/__main__.py +62 -0
  59. synapse/config/_base.py +1108 -0
  60. synapse/config/_base.pyi +217 -0
  61. synapse/config/_util.py +99 -0
  62. synapse/config/account_validity.py +116 -0
  63. synapse/config/api.py +141 -0
  64. synapse/config/appservice.py +210 -0
  65. synapse/config/auth.py +80 -0
  66. synapse/config/auto_accept_invites.py +43 -0
  67. synapse/config/background_updates.py +44 -0
  68. synapse/config/cache.py +231 -0
  69. synapse/config/captcha.py +90 -0
  70. synapse/config/cas.py +116 -0
  71. synapse/config/consent.py +73 -0
  72. synapse/config/database.py +184 -0
  73. synapse/config/emailconfig.py +367 -0
  74. synapse/config/experimental.py +595 -0
  75. synapse/config/federation.py +114 -0
  76. synapse/config/homeserver.py +141 -0
  77. synapse/config/jwt.py +55 -0
  78. synapse/config/key.py +447 -0
  79. synapse/config/logger.py +390 -0
  80. synapse/config/mas.py +191 -0
  81. synapse/config/matrixrtc.py +66 -0
  82. synapse/config/metrics.py +84 -0
  83. synapse/config/modules.py +40 -0
  84. synapse/config/oembed.py +185 -0
  85. synapse/config/oidc.py +509 -0
  86. synapse/config/password_auth_providers.py +82 -0
  87. synapse/config/push.py +64 -0
  88. synapse/config/ratelimiting.py +254 -0
  89. synapse/config/redis.py +74 -0
  90. synapse/config/registration.py +296 -0
  91. synapse/config/repository.py +311 -0
  92. synapse/config/retention.py +162 -0
  93. synapse/config/room.py +88 -0
  94. synapse/config/room_directory.py +165 -0
  95. synapse/config/saml2.py +251 -0
  96. synapse/config/server.py +1170 -0
  97. synapse/config/server_notices.py +84 -0
  98. synapse/config/spam_checker.py +66 -0
  99. synapse/config/sso.py +121 -0
  100. synapse/config/stats.py +54 -0
  101. synapse/config/third_party_event_rules.py +40 -0
  102. synapse/config/tls.py +192 -0
  103. synapse/config/tracer.py +71 -0
  104. synapse/config/user_directory.py +47 -0
  105. synapse/config/user_types.py +44 -0
  106. synapse/config/voip.py +59 -0
  107. synapse/config/workers.py +642 -0
  108. synapse/crypto/__init__.py +20 -0
  109. synapse/crypto/context_factory.py +278 -0
  110. synapse/crypto/event_signing.py +194 -0
  111. synapse/crypto/keyring.py +931 -0
  112. synapse/event_auth.py +1266 -0
  113. synapse/events/__init__.py +668 -0
  114. synapse/events/auto_accept_invites.py +216 -0
  115. synapse/events/builder.py +387 -0
  116. synapse/events/presence_router.py +245 -0
  117. synapse/events/snapshot.py +559 -0
  118. synapse/events/utils.py +928 -0
  119. synapse/events/validator.py +305 -0
  120. synapse/federation/__init__.py +22 -0
  121. synapse/federation/federation_base.py +383 -0
  122. synapse/federation/federation_client.py +2134 -0
  123. synapse/federation/federation_server.py +1544 -0
  124. synapse/federation/persistence.py +71 -0
  125. synapse/federation/send_queue.py +532 -0
  126. synapse/federation/sender/__init__.py +1165 -0
  127. synapse/federation/sender/per_destination_queue.py +884 -0
  128. synapse/federation/sender/transaction_manager.py +210 -0
  129. synapse/federation/transport/__init__.py +28 -0
  130. synapse/federation/transport/client.py +1201 -0
  131. synapse/federation/transport/server/__init__.py +334 -0
  132. synapse/federation/transport/server/_base.py +429 -0
  133. synapse/federation/transport/server/federation.py +912 -0
  134. synapse/federation/units.py +133 -0
  135. synapse/handlers/__init__.py +20 -0
  136. synapse/handlers/account.py +162 -0
  137. synapse/handlers/account_data.py +362 -0
  138. synapse/handlers/account_validity.py +361 -0
  139. synapse/handlers/admin.py +618 -0
  140. synapse/handlers/appservice.py +991 -0
  141. synapse/handlers/auth.py +2494 -0
  142. synapse/handlers/cas.py +413 -0
  143. synapse/handlers/deactivate_account.py +363 -0
  144. synapse/handlers/delayed_events.py +635 -0
  145. synapse/handlers/device.py +1873 -0
  146. synapse/handlers/devicemessage.py +399 -0
  147. synapse/handlers/directory.py +554 -0
  148. synapse/handlers/e2e_keys.py +1834 -0
  149. synapse/handlers/e2e_room_keys.py +455 -0
  150. synapse/handlers/event_auth.py +390 -0
  151. synapse/handlers/events.py +201 -0
  152. synapse/handlers/federation.py +2043 -0
  153. synapse/handlers/federation_event.py +2420 -0
  154. synapse/handlers/identity.py +812 -0
  155. synapse/handlers/initial_sync.py +528 -0
  156. synapse/handlers/jwt.py +120 -0
  157. synapse/handlers/message.py +2347 -0
  158. synapse/handlers/oidc.py +1803 -0
  159. synapse/handlers/pagination.py +768 -0
  160. synapse/handlers/password_policy.py +102 -0
  161. synapse/handlers/presence.py +2638 -0
  162. synapse/handlers/profile.py +655 -0
  163. synapse/handlers/push_rules.py +164 -0
  164. synapse/handlers/read_marker.py +79 -0
  165. synapse/handlers/receipts.py +351 -0
  166. synapse/handlers/register.py +1060 -0
  167. synapse/handlers/relations.py +624 -0
  168. synapse/handlers/reports.py +98 -0
  169. synapse/handlers/room.py +2447 -0
  170. synapse/handlers/room_list.py +632 -0
  171. synapse/handlers/room_member.py +2365 -0
  172. synapse/handlers/room_member_worker.py +146 -0
  173. synapse/handlers/room_policy.py +186 -0
  174. synapse/handlers/room_summary.py +1057 -0
  175. synapse/handlers/saml.py +524 -0
  176. synapse/handlers/search.py +723 -0
  177. synapse/handlers/send_email.py +209 -0
  178. synapse/handlers/set_password.py +71 -0
  179. synapse/handlers/sliding_sync/__init__.py +1701 -0
  180. synapse/handlers/sliding_sync/extensions.py +970 -0
  181. synapse/handlers/sliding_sync/room_lists.py +2266 -0
  182. synapse/handlers/sliding_sync/store.py +128 -0
  183. synapse/handlers/sso.py +1292 -0
  184. synapse/handlers/state_deltas.py +82 -0
  185. synapse/handlers/stats.py +322 -0
  186. synapse/handlers/sync.py +3109 -0
  187. synapse/handlers/thread_subscriptions.py +190 -0
  188. synapse/handlers/typing.py +606 -0
  189. synapse/handlers/ui_auth/__init__.py +48 -0
  190. synapse/handlers/ui_auth/checkers.py +332 -0
  191. synapse/handlers/user_directory.py +783 -0
  192. synapse/handlers/worker_lock.py +365 -0
  193. synapse/http/__init__.py +106 -0
  194. synapse/http/additional_resource.py +62 -0
  195. synapse/http/client.py +1360 -0
  196. synapse/http/connectproxyclient.py +309 -0
  197. synapse/http/federation/__init__.py +19 -0
  198. synapse/http/federation/matrix_federation_agent.py +490 -0
  199. synapse/http/federation/srv_resolver.py +196 -0
  200. synapse/http/federation/well_known_resolver.py +367 -0
  201. synapse/http/matrixfederationclient.py +1875 -0
  202. synapse/http/proxy.py +290 -0
  203. synapse/http/proxyagent.py +497 -0
  204. synapse/http/replicationagent.py +203 -0
  205. synapse/http/request_metrics.py +309 -0
  206. synapse/http/server.py +1114 -0
  207. synapse/http/servlet.py +1019 -0
  208. synapse/http/site.py +825 -0
  209. synapse/http/types.py +27 -0
  210. synapse/logging/__init__.py +31 -0
  211. synapse/logging/_remote.py +261 -0
  212. synapse/logging/_terse_json.py +95 -0
  213. synapse/logging/context.py +1211 -0
  214. synapse/logging/formatter.py +63 -0
  215. synapse/logging/handlers.py +99 -0
  216. synapse/logging/loggers.py +25 -0
  217. synapse/logging/opentracing.py +1132 -0
  218. synapse/logging/scopecontextmanager.py +161 -0
  219. synapse/media/_base.py +827 -0
  220. synapse/media/filepath.py +417 -0
  221. synapse/media/media_repository.py +1580 -0
  222. synapse/media/media_storage.py +704 -0
  223. synapse/media/oembed.py +277 -0
  224. synapse/media/preview_html.py +559 -0
  225. synapse/media/storage_provider.py +195 -0
  226. synapse/media/thumbnailer.py +833 -0
  227. synapse/media/url_previewer.py +875 -0
  228. synapse/metrics/__init__.py +754 -0
  229. synapse/metrics/_gc.py +219 -0
  230. synapse/metrics/_reactor_metrics.py +171 -0
  231. synapse/metrics/_types.py +38 -0
  232. synapse/metrics/background_process_metrics.py +556 -0
  233. synapse/metrics/common_usage_metrics.py +94 -0
  234. synapse/metrics/jemalloc.py +248 -0
  235. synapse/module_api/__init__.py +2154 -0
  236. synapse/module_api/callbacks/__init__.py +50 -0
  237. synapse/module_api/callbacks/account_validity_callbacks.py +106 -0
  238. synapse/module_api/callbacks/media_repository_callbacks.py +160 -0
  239. synapse/module_api/callbacks/ratelimit_callbacks.py +79 -0
  240. synapse/module_api/callbacks/spamchecker_callbacks.py +1113 -0
  241. synapse/module_api/callbacks/third_party_event_rules_callbacks.py +599 -0
  242. synapse/module_api/errors.py +42 -0
  243. synapse/notifier.py +972 -0
  244. synapse/push/__init__.py +212 -0
  245. synapse/push/bulk_push_rule_evaluator.py +637 -0
  246. synapse/push/clientformat.py +126 -0
  247. synapse/push/emailpusher.py +333 -0
  248. synapse/push/httppusher.py +564 -0
  249. synapse/push/mailer.py +1012 -0
  250. synapse/push/presentable_names.py +216 -0
  251. synapse/push/push_tools.py +114 -0
  252. synapse/push/push_types.py +141 -0
  253. synapse/push/pusher.py +87 -0
  254. synapse/push/pusherpool.py +501 -0
  255. synapse/push/rulekinds.py +33 -0
  256. synapse/py.typed +0 -0
  257. synapse/replication/__init__.py +20 -0
  258. synapse/replication/http/__init__.py +68 -0
  259. synapse/replication/http/_base.py +468 -0
  260. synapse/replication/http/account_data.py +297 -0
  261. synapse/replication/http/deactivate_account.py +81 -0
  262. synapse/replication/http/delayed_events.py +62 -0
  263. synapse/replication/http/devices.py +254 -0
  264. synapse/replication/http/federation.py +334 -0
  265. synapse/replication/http/login.py +106 -0
  266. synapse/replication/http/membership.py +364 -0
  267. synapse/replication/http/presence.py +133 -0
  268. synapse/replication/http/push.py +156 -0
  269. synapse/replication/http/register.py +172 -0
  270. synapse/replication/http/send_events.py +182 -0
  271. synapse/replication/http/state.py +82 -0
  272. synapse/replication/http/streams.py +101 -0
  273. synapse/replication/tcp/__init__.py +56 -0
  274. synapse/replication/tcp/client.py +552 -0
  275. synapse/replication/tcp/commands.py +569 -0
  276. synapse/replication/tcp/context.py +41 -0
  277. synapse/replication/tcp/external_cache.py +156 -0
  278. synapse/replication/tcp/handler.py +942 -0
  279. synapse/replication/tcp/protocol.py +608 -0
  280. synapse/replication/tcp/redis.py +509 -0
  281. synapse/replication/tcp/resource.py +348 -0
  282. synapse/replication/tcp/streams/__init__.py +96 -0
  283. synapse/replication/tcp/streams/_base.py +766 -0
  284. synapse/replication/tcp/streams/events.py +287 -0
  285. synapse/replication/tcp/streams/federation.py +92 -0
  286. synapse/replication/tcp/streams/partial_state.py +80 -0
  287. synapse/res/providers.json +29 -0
  288. synapse/res/templates/_base.html +29 -0
  289. synapse/res/templates/account_previously_renewed.html +6 -0
  290. synapse/res/templates/account_renewed.html +6 -0
  291. synapse/res/templates/add_threepid.html +8 -0
  292. synapse/res/templates/add_threepid.txt +6 -0
  293. synapse/res/templates/add_threepid_failure.html +7 -0
  294. synapse/res/templates/add_threepid_success.html +6 -0
  295. synapse/res/templates/already_in_use.html +12 -0
  296. synapse/res/templates/already_in_use.txt +10 -0
  297. synapse/res/templates/auth_success.html +21 -0
  298. synapse/res/templates/invalid_token.html +6 -0
  299. synapse/res/templates/mail-Element.css +7 -0
  300. synapse/res/templates/mail-Vector.css +7 -0
  301. synapse/res/templates/mail-expiry.css +4 -0
  302. synapse/res/templates/mail.css +156 -0
  303. synapse/res/templates/notice_expiry.html +46 -0
  304. synapse/res/templates/notice_expiry.txt +7 -0
  305. synapse/res/templates/notif.html +51 -0
  306. synapse/res/templates/notif.txt +22 -0
  307. synapse/res/templates/notif_mail.html +59 -0
  308. synapse/res/templates/notif_mail.txt +10 -0
  309. synapse/res/templates/password_reset.html +10 -0
  310. synapse/res/templates/password_reset.txt +7 -0
  311. synapse/res/templates/password_reset_confirmation.html +15 -0
  312. synapse/res/templates/password_reset_failure.html +7 -0
  313. synapse/res/templates/password_reset_success.html +6 -0
  314. synapse/res/templates/recaptcha.html +42 -0
  315. synapse/res/templates/registration.html +12 -0
  316. synapse/res/templates/registration.txt +10 -0
  317. synapse/res/templates/registration_failure.html +6 -0
  318. synapse/res/templates/registration_success.html +6 -0
  319. synapse/res/templates/registration_token.html +18 -0
  320. synapse/res/templates/room.html +33 -0
  321. synapse/res/templates/room.txt +9 -0
  322. synapse/res/templates/sso.css +129 -0
  323. synapse/res/templates/sso_account_deactivated.html +25 -0
  324. synapse/res/templates/sso_auth_account_details.html +186 -0
  325. synapse/res/templates/sso_auth_account_details.js +116 -0
  326. synapse/res/templates/sso_auth_bad_user.html +26 -0
  327. synapse/res/templates/sso_auth_confirm.html +27 -0
  328. synapse/res/templates/sso_auth_success.html +26 -0
  329. synapse/res/templates/sso_error.html +71 -0
  330. synapse/res/templates/sso_footer.html +19 -0
  331. synapse/res/templates/sso_login_idp_picker.html +60 -0
  332. synapse/res/templates/sso_new_user_consent.html +30 -0
  333. synapse/res/templates/sso_partial_profile.html +19 -0
  334. synapse/res/templates/sso_redirect_confirm.html +39 -0
  335. synapse/res/templates/style.css +33 -0
  336. synapse/res/templates/terms.html +27 -0
  337. synapse/rest/__init__.py +197 -0
  338. synapse/rest/admin/__init__.py +390 -0
  339. synapse/rest/admin/_base.py +72 -0
  340. synapse/rest/admin/background_updates.py +171 -0
  341. synapse/rest/admin/devices.py +221 -0
  342. synapse/rest/admin/event_reports.py +173 -0
  343. synapse/rest/admin/events.py +69 -0
  344. synapse/rest/admin/experimental_features.py +137 -0
  345. synapse/rest/admin/federation.py +243 -0
  346. synapse/rest/admin/media.py +540 -0
  347. synapse/rest/admin/registration_tokens.py +358 -0
  348. synapse/rest/admin/rooms.py +1061 -0
  349. synapse/rest/admin/scheduled_tasks.py +70 -0
  350. synapse/rest/admin/server_notice_servlet.py +132 -0
  351. synapse/rest/admin/statistics.py +132 -0
  352. synapse/rest/admin/username_available.py +58 -0
  353. synapse/rest/admin/users.py +1608 -0
  354. synapse/rest/client/__init__.py +20 -0
  355. synapse/rest/client/_base.py +113 -0
  356. synapse/rest/client/account.py +930 -0
  357. synapse/rest/client/account_data.py +319 -0
  358. synapse/rest/client/account_validity.py +103 -0
  359. synapse/rest/client/appservice_ping.py +125 -0
  360. synapse/rest/client/auth.py +218 -0
  361. synapse/rest/client/auth_metadata.py +122 -0
  362. synapse/rest/client/capabilities.py +121 -0
  363. synapse/rest/client/delayed_events.py +111 -0
  364. synapse/rest/client/devices.py +587 -0
  365. synapse/rest/client/directory.py +211 -0
  366. synapse/rest/client/events.py +116 -0
  367. synapse/rest/client/filter.py +112 -0
  368. synapse/rest/client/initial_sync.py +65 -0
  369. synapse/rest/client/keys.py +678 -0
  370. synapse/rest/client/knock.py +104 -0
  371. synapse/rest/client/login.py +754 -0
  372. synapse/rest/client/login_token_request.py +127 -0
  373. synapse/rest/client/logout.py +93 -0
  374. synapse/rest/client/matrixrtc.py +52 -0
  375. synapse/rest/client/media.py +286 -0
  376. synapse/rest/client/mutual_rooms.py +93 -0
  377. synapse/rest/client/notifications.py +137 -0
  378. synapse/rest/client/openid.py +109 -0
  379. synapse/rest/client/password_policy.py +69 -0
  380. synapse/rest/client/presence.py +131 -0
  381. synapse/rest/client/profile.py +291 -0
  382. synapse/rest/client/push_rule.py +331 -0
  383. synapse/rest/client/pusher.py +181 -0
  384. synapse/rest/client/read_marker.py +104 -0
  385. synapse/rest/client/receipts.py +165 -0
  386. synapse/rest/client/register.py +1067 -0
  387. synapse/rest/client/relations.py +138 -0
  388. synapse/rest/client/rendezvous.py +76 -0
  389. synapse/rest/client/reporting.py +207 -0
  390. synapse/rest/client/room.py +1669 -0
  391. synapse/rest/client/room_keys.py +426 -0
  392. synapse/rest/client/room_upgrade_rest_servlet.py +112 -0
  393. synapse/rest/client/sendtodevice.py +85 -0
  394. synapse/rest/client/sync.py +1131 -0
  395. synapse/rest/client/tags.py +129 -0
  396. synapse/rest/client/thirdparty.py +130 -0
  397. synapse/rest/client/thread_subscriptions.py +247 -0
  398. synapse/rest/client/tokenrefresh.py +52 -0
  399. synapse/rest/client/transactions.py +149 -0
  400. synapse/rest/client/user_directory.py +90 -0
  401. synapse/rest/client/versions.py +191 -0
  402. synapse/rest/client/voip.py +88 -0
  403. synapse/rest/consent/__init__.py +0 -0
  404. synapse/rest/consent/consent_resource.py +210 -0
  405. synapse/rest/health.py +38 -0
  406. synapse/rest/key/__init__.py +20 -0
  407. synapse/rest/key/v2/__init__.py +40 -0
  408. synapse/rest/key/v2/local_key_resource.py +125 -0
  409. synapse/rest/key/v2/remote_key_resource.py +302 -0
  410. synapse/rest/media/__init__.py +0 -0
  411. synapse/rest/media/config_resource.py +53 -0
  412. synapse/rest/media/create_resource.py +90 -0
  413. synapse/rest/media/download_resource.py +110 -0
  414. synapse/rest/media/media_repository_resource.py +113 -0
  415. synapse/rest/media/preview_url_resource.py +77 -0
  416. synapse/rest/media/thumbnail_resource.py +142 -0
  417. synapse/rest/media/upload_resource.py +187 -0
  418. synapse/rest/media/v1/__init__.py +39 -0
  419. synapse/rest/media/v1/_base.py +23 -0
  420. synapse/rest/media/v1/media_storage.py +23 -0
  421. synapse/rest/media/v1/storage_provider.py +23 -0
  422. synapse/rest/synapse/__init__.py +20 -0
  423. synapse/rest/synapse/client/__init__.py +93 -0
  424. synapse/rest/synapse/client/federation_whitelist.py +66 -0
  425. synapse/rest/synapse/client/jwks.py +77 -0
  426. synapse/rest/synapse/client/new_user_consent.py +115 -0
  427. synapse/rest/synapse/client/oidc/__init__.py +45 -0
  428. synapse/rest/synapse/client/oidc/backchannel_logout_resource.py +42 -0
  429. synapse/rest/synapse/client/oidc/callback_resource.py +48 -0
  430. synapse/rest/synapse/client/password_reset.py +129 -0
  431. synapse/rest/synapse/client/pick_idp.py +107 -0
  432. synapse/rest/synapse/client/pick_username.py +153 -0
  433. synapse/rest/synapse/client/rendezvous.py +58 -0
  434. synapse/rest/synapse/client/saml2/__init__.py +42 -0
  435. synapse/rest/synapse/client/saml2/metadata_resource.py +46 -0
  436. synapse/rest/synapse/client/saml2/response_resource.py +52 -0
  437. synapse/rest/synapse/client/sso_register.py +56 -0
  438. synapse/rest/synapse/client/unsubscribe.py +88 -0
  439. synapse/rest/synapse/mas/__init__.py +71 -0
  440. synapse/rest/synapse/mas/_base.py +55 -0
  441. synapse/rest/synapse/mas/devices.py +239 -0
  442. synapse/rest/synapse/mas/users.py +469 -0
  443. synapse/rest/well_known.py +148 -0
  444. synapse/server.py +1258 -0
  445. synapse/server_notices/__init__.py +0 -0
  446. synapse/server_notices/consent_server_notices.py +136 -0
  447. synapse/server_notices/resource_limits_server_notices.py +215 -0
  448. synapse/server_notices/server_notices_manager.py +388 -0
  449. synapse/server_notices/server_notices_sender.py +67 -0
  450. synapse/server_notices/worker_server_notices_sender.py +46 -0
  451. synapse/spam_checker_api/__init__.py +31 -0
  452. synapse/state/__init__.py +1022 -0
  453. synapse/state/v1.py +370 -0
  454. synapse/state/v2.py +985 -0
  455. synapse/static/client/login/index.html +47 -0
  456. synapse/static/client/login/js/jquery-3.4.1.min.js +2 -0
  457. synapse/static/client/login/js/login.js +291 -0
  458. synapse/static/client/login/spinner.gif +0 -0
  459. synapse/static/client/login/style.css +79 -0
  460. synapse/static/index.html +63 -0
  461. synapse/storage/__init__.py +43 -0
  462. synapse/storage/_base.py +245 -0
  463. synapse/storage/admin_client_config.py +26 -0
  464. synapse/storage/background_updates.py +1189 -0
  465. synapse/storage/controllers/__init__.py +57 -0
  466. synapse/storage/controllers/persist_events.py +1239 -0
  467. synapse/storage/controllers/purge_events.py +456 -0
  468. synapse/storage/controllers/state.py +954 -0
  469. synapse/storage/controllers/stats.py +119 -0
  470. synapse/storage/database.py +2720 -0
  471. synapse/storage/databases/__init__.py +175 -0
  472. synapse/storage/databases/main/__init__.py +424 -0
  473. synapse/storage/databases/main/account_data.py +1060 -0
  474. synapse/storage/databases/main/appservice.py +473 -0
  475. synapse/storage/databases/main/cache.py +911 -0
  476. synapse/storage/databases/main/censor_events.py +225 -0
  477. synapse/storage/databases/main/client_ips.py +817 -0
  478. synapse/storage/databases/main/delayed_events.py +560 -0
  479. synapse/storage/databases/main/deviceinbox.py +1272 -0
  480. synapse/storage/databases/main/devices.py +2581 -0
  481. synapse/storage/databases/main/directory.py +212 -0
  482. synapse/storage/databases/main/e2e_room_keys.py +690 -0
  483. synapse/storage/databases/main/end_to_end_keys.py +1896 -0
  484. synapse/storage/databases/main/event_federation.py +2509 -0
  485. synapse/storage/databases/main/event_push_actions.py +1937 -0
  486. synapse/storage/databases/main/events.py +3746 -0
  487. synapse/storage/databases/main/events_bg_updates.py +2910 -0
  488. synapse/storage/databases/main/events_forward_extremities.py +126 -0
  489. synapse/storage/databases/main/events_worker.py +2784 -0
  490. synapse/storage/databases/main/experimental_features.py +130 -0
  491. synapse/storage/databases/main/filtering.py +231 -0
  492. synapse/storage/databases/main/keys.py +291 -0
  493. synapse/storage/databases/main/lock.py +553 -0
  494. synapse/storage/databases/main/media_repository.py +1070 -0
  495. synapse/storage/databases/main/metrics.py +460 -0
  496. synapse/storage/databases/main/monthly_active_users.py +443 -0
  497. synapse/storage/databases/main/openid.py +61 -0
  498. synapse/storage/databases/main/presence.py +511 -0
  499. synapse/storage/databases/main/profile.py +541 -0
  500. synapse/storage/databases/main/purge_events.py +511 -0
  501. synapse/storage/databases/main/push_rule.py +972 -0
  502. synapse/storage/databases/main/pusher.py +794 -0
  503. synapse/storage/databases/main/receipts.py +1342 -0
  504. synapse/storage/databases/main/registration.py +3076 -0
  505. synapse/storage/databases/main/rejections.py +38 -0
  506. synapse/storage/databases/main/relations.py +1118 -0
  507. synapse/storage/databases/main/room.py +2781 -0
  508. synapse/storage/databases/main/roommember.py +2112 -0
  509. synapse/storage/databases/main/search.py +941 -0
  510. synapse/storage/databases/main/session.py +151 -0
  511. synapse/storage/databases/main/signatures.py +94 -0
  512. synapse/storage/databases/main/sliding_sync.py +603 -0
  513. synapse/storage/databases/main/state.py +1006 -0
  514. synapse/storage/databases/main/state_deltas.py +329 -0
  515. synapse/storage/databases/main/stats.py +791 -0
  516. synapse/storage/databases/main/stream.py +2580 -0
  517. synapse/storage/databases/main/tags.py +360 -0
  518. synapse/storage/databases/main/task_scheduler.py +225 -0
  519. synapse/storage/databases/main/thread_subscriptions.py +591 -0
  520. synapse/storage/databases/main/transactions.py +681 -0
  521. synapse/storage/databases/main/ui_auth.py +420 -0
  522. synapse/storage/databases/main/user_directory.py +1331 -0
  523. synapse/storage/databases/main/user_erasure_store.py +117 -0
  524. synapse/storage/databases/state/__init__.py +22 -0
  525. synapse/storage/databases/state/bg_updates.py +499 -0
  526. synapse/storage/databases/state/deletion.py +558 -0
  527. synapse/storage/databases/state/store.py +949 -0
  528. synapse/storage/engines/__init__.py +70 -0
  529. synapse/storage/engines/_base.py +154 -0
  530. synapse/storage/engines/postgres.py +261 -0
  531. synapse/storage/engines/sqlite.py +199 -0
  532. synapse/storage/invite_rule.py +112 -0
  533. synapse/storage/keys.py +40 -0
  534. synapse/storage/prepare_database.py +731 -0
  535. synapse/storage/push_rule.py +28 -0
  536. synapse/storage/roommember.py +89 -0
  537. synapse/storage/schema/README.md +4 -0
  538. synapse/storage/schema/__init__.py +182 -0
  539. synapse/storage/schema/common/delta/25/00background_updates.sql +40 -0
  540. synapse/storage/schema/common/delta/35/00background_updates_add_col.sql +36 -0
  541. synapse/storage/schema/common/delta/58/00background_update_ordering.sql +38 -0
  542. synapse/storage/schema/common/full_schemas/72/full.sql.postgres +8 -0
  543. synapse/storage/schema/common/full_schemas/72/full.sql.sqlite +6 -0
  544. synapse/storage/schema/common/schema_version.sql +60 -0
  545. synapse/storage/schema/main/delta/12/v12.sql +82 -0
  546. synapse/storage/schema/main/delta/13/v13.sql +38 -0
  547. synapse/storage/schema/main/delta/14/v14.sql +42 -0
  548. synapse/storage/schema/main/delta/15/appservice_txns.sql +50 -0
  549. synapse/storage/schema/main/delta/15/presence_indices.sql +2 -0
  550. synapse/storage/schema/main/delta/15/v15.sql +24 -0
  551. synapse/storage/schema/main/delta/16/events_order_index.sql +4 -0
  552. synapse/storage/schema/main/delta/16/remote_media_cache_index.sql +2 -0
  553. synapse/storage/schema/main/delta/16/remove_duplicates.sql +9 -0
  554. synapse/storage/schema/main/delta/16/room_alias_index.sql +3 -0
  555. synapse/storage/schema/main/delta/16/unique_constraints.sql +72 -0
  556. synapse/storage/schema/main/delta/16/users.sql +56 -0
  557. synapse/storage/schema/main/delta/17/drop_indexes.sql +37 -0
  558. synapse/storage/schema/main/delta/17/server_keys.sql +43 -0
  559. synapse/storage/schema/main/delta/17/user_threepids.sql +9 -0
  560. synapse/storage/schema/main/delta/18/server_keys_bigger_ints.sql +51 -0
  561. synapse/storage/schema/main/delta/19/event_index.sql +38 -0
  562. synapse/storage/schema/main/delta/20/dummy.sql +1 -0
  563. synapse/storage/schema/main/delta/20/pushers.py +93 -0
  564. synapse/storage/schema/main/delta/21/end_to_end_keys.sql +53 -0
  565. synapse/storage/schema/main/delta/21/receipts.sql +57 -0
  566. synapse/storage/schema/main/delta/22/receipts_index.sql +41 -0
  567. synapse/storage/schema/main/delta/22/user_threepids_unique.sql +19 -0
  568. synapse/storage/schema/main/delta/24/stats_reporting.sql +37 -0
  569. synapse/storage/schema/main/delta/25/fts.py +81 -0
  570. synapse/storage/schema/main/delta/25/guest_access.sql +44 -0
  571. synapse/storage/schema/main/delta/25/history_visibility.sql +44 -0
  572. synapse/storage/schema/main/delta/25/tags.sql +57 -0
  573. synapse/storage/schema/main/delta/26/account_data.sql +36 -0
  574. synapse/storage/schema/main/delta/27/account_data.sql +55 -0
  575. synapse/storage/schema/main/delta/27/forgotten_memberships.sql +45 -0
  576. synapse/storage/schema/main/delta/27/ts.py +61 -0
  577. synapse/storage/schema/main/delta/28/event_push_actions.sql +46 -0
  578. synapse/storage/schema/main/delta/28/events_room_stream.sql +39 -0
  579. synapse/storage/schema/main/delta/28/public_roms_index.sql +39 -0
  580. synapse/storage/schema/main/delta/28/receipts_user_id_index.sql +41 -0
  581. synapse/storage/schema/main/delta/28/upgrade_times.sql +40 -0
  582. synapse/storage/schema/main/delta/28/users_is_guest.sql +41 -0
  583. synapse/storage/schema/main/delta/29/push_actions.sql +54 -0
  584. synapse/storage/schema/main/delta/30/alias_creator.sql +35 -0
  585. synapse/storage/schema/main/delta/30/as_users.py +82 -0
  586. synapse/storage/schema/main/delta/30/deleted_pushers.sql +44 -0
  587. synapse/storage/schema/main/delta/30/presence_stream.sql +49 -0
  588. synapse/storage/schema/main/delta/30/public_rooms.sql +42 -0
  589. synapse/storage/schema/main/delta/30/push_rule_stream.sql +57 -0
  590. synapse/storage/schema/main/delta/30/threepid_guest_access_tokens.sql +43 -0
  591. synapse/storage/schema/main/delta/31/invites.sql +61 -0
  592. synapse/storage/schema/main/delta/31/local_media_repository_url_cache.sql +46 -0
  593. synapse/storage/schema/main/delta/31/pushers_0.py +92 -0
  594. synapse/storage/schema/main/delta/31/pushers_index.sql +41 -0
  595. synapse/storage/schema/main/delta/31/search_update.py +65 -0
  596. synapse/storage/schema/main/delta/32/events.sql +35 -0
  597. synapse/storage/schema/main/delta/32/openid.sql +9 -0
  598. synapse/storage/schema/main/delta/32/pusher_throttle.sql +42 -0
  599. synapse/storage/schema/main/delta/32/remove_indices.sql +52 -0
  600. synapse/storage/schema/main/delta/32/reports.sql +44 -0
  601. synapse/storage/schema/main/delta/33/access_tokens_device_index.sql +36 -0
  602. synapse/storage/schema/main/delta/33/devices.sql +40 -0
  603. synapse/storage/schema/main/delta/33/devices_for_e2e_keys.sql +38 -0
  604. synapse/storage/schema/main/delta/33/devices_for_e2e_keys_clear_unknown_device.sql +39 -0
  605. synapse/storage/schema/main/delta/33/event_fields.py +61 -0
  606. synapse/storage/schema/main/delta/33/remote_media_ts.py +43 -0
  607. synapse/storage/schema/main/delta/33/user_ips_index.sql +36 -0
  608. synapse/storage/schema/main/delta/34/appservice_stream.sql +42 -0
  609. synapse/storage/schema/main/delta/34/cache_stream.py +50 -0
  610. synapse/storage/schema/main/delta/34/device_inbox.sql +43 -0
  611. synapse/storage/schema/main/delta/34/push_display_name_rename.sql +39 -0
  612. synapse/storage/schema/main/delta/34/received_txn_purge.py +36 -0
  613. synapse/storage/schema/main/delta/35/contains_url.sql +36 -0
  614. synapse/storage/schema/main/delta/35/device_outbox.sql +58 -0
  615. synapse/storage/schema/main/delta/35/device_stream_id.sql +40 -0
  616. synapse/storage/schema/main/delta/35/event_push_actions_index.sql +36 -0
  617. synapse/storage/schema/main/delta/35/public_room_list_change_stream.sql +52 -0
  618. synapse/storage/schema/main/delta/35/stream_order_to_extrem.sql +56 -0
  619. synapse/storage/schema/main/delta/36/readd_public_rooms.sql +45 -0
  620. synapse/storage/schema/main/delta/37/remove_auth_idx.py +89 -0
  621. synapse/storage/schema/main/delta/37/user_threepids.sql +71 -0
  622. synapse/storage/schema/main/delta/38/postgres_fts_gist.sql +38 -0
  623. synapse/storage/schema/main/delta/39/appservice_room_list.sql +48 -0
  624. synapse/storage/schema/main/delta/39/device_federation_stream_idx.sql +35 -0
  625. synapse/storage/schema/main/delta/39/event_push_index.sql +36 -0
  626. synapse/storage/schema/main/delta/39/federation_out_position.sql +41 -0
  627. synapse/storage/schema/main/delta/39/membership_profile.sql +39 -0
  628. synapse/storage/schema/main/delta/40/current_state_idx.sql +36 -0
  629. synapse/storage/schema/main/delta/40/device_inbox.sql +40 -0
  630. synapse/storage/schema/main/delta/40/device_list_streams.sql +79 -0
  631. synapse/storage/schema/main/delta/40/event_push_summary.sql +57 -0
  632. synapse/storage/schema/main/delta/40/pushers.sql +58 -0
  633. synapse/storage/schema/main/delta/41/device_list_stream_idx.sql +36 -0
  634. synapse/storage/schema/main/delta/41/device_outbound_index.sql +35 -0
  635. synapse/storage/schema/main/delta/41/event_search_event_id_idx.sql +36 -0
  636. synapse/storage/schema/main/delta/41/ratelimit.sql +41 -0
  637. synapse/storage/schema/main/delta/42/current_state_delta.sql +48 -0
  638. synapse/storage/schema/main/delta/42/device_list_last_id.sql +52 -0
  639. synapse/storage/schema/main/delta/42/event_auth_state_only.sql +36 -0
  640. synapse/storage/schema/main/delta/42/user_dir.py +88 -0
  641. synapse/storage/schema/main/delta/43/blocked_rooms.sql +40 -0
  642. synapse/storage/schema/main/delta/43/quarantine_media.sql +36 -0
  643. synapse/storage/schema/main/delta/43/url_cache.sql +35 -0
  644. synapse/storage/schema/main/delta/43/user_share.sql +52 -0
  645. synapse/storage/schema/main/delta/44/expire_url_cache.sql +60 -0
  646. synapse/storage/schema/main/delta/45/group_server.sql +186 -0
  647. synapse/storage/schema/main/delta/45/profile_cache.sql +47 -0
  648. synapse/storage/schema/main/delta/46/drop_refresh_tokens.sql +36 -0
  649. synapse/storage/schema/main/delta/46/drop_unique_deleted_pushers.sql +54 -0
  650. synapse/storage/schema/main/delta/46/group_server.sql +51 -0
  651. synapse/storage/schema/main/delta/46/local_media_repository_url_idx.sql +43 -0
  652. synapse/storage/schema/main/delta/46/user_dir_null_room_ids.sql +54 -0
  653. synapse/storage/schema/main/delta/46/user_dir_typos.sql +43 -0
  654. synapse/storage/schema/main/delta/47/last_access_media.sql +35 -0
  655. synapse/storage/schema/main/delta/47/postgres_fts_gin.sql +36 -0
  656. synapse/storage/schema/main/delta/47/push_actions_staging.sql +47 -0
  657. synapse/storage/schema/main/delta/48/add_user_consent.sql +37 -0
  658. synapse/storage/schema/main/delta/48/add_user_ips_last_seen_index.sql +36 -0
  659. synapse/storage/schema/main/delta/48/deactivated_users.sql +44 -0
  660. synapse/storage/schema/main/delta/48/group_unique_indexes.py +67 -0
  661. synapse/storage/schema/main/delta/48/groups_joinable.sql +41 -0
  662. synapse/storage/schema/main/delta/49/add_user_consent_server_notice_sent.sql +39 -0
  663. synapse/storage/schema/main/delta/49/add_user_daily_visits.sql +40 -0
  664. synapse/storage/schema/main/delta/49/add_user_ips_last_seen_only_index.sql +36 -0
  665. synapse/storage/schema/main/delta/50/add_creation_ts_users_index.sql +38 -0
  666. synapse/storage/schema/main/delta/50/erasure_store.sql +40 -0
  667. synapse/storage/schema/main/delta/50/make_event_content_nullable.py +102 -0
  668. synapse/storage/schema/main/delta/51/e2e_room_keys.sql +58 -0
  669. synapse/storage/schema/main/delta/51/monthly_active_users.sql +46 -0
  670. synapse/storage/schema/main/delta/52/add_event_to_state_group_index.sql +38 -0
  671. synapse/storage/schema/main/delta/52/device_list_streams_unique_idx.sql +55 -0
  672. synapse/storage/schema/main/delta/52/e2e_room_keys.sql +72 -0
  673. synapse/storage/schema/main/delta/53/add_user_type_to_users.sql +38 -0
  674. synapse/storage/schema/main/delta/53/drop_sent_transactions.sql +35 -0
  675. synapse/storage/schema/main/delta/53/event_format_version.sql +35 -0
  676. synapse/storage/schema/main/delta/53/user_dir_populate.sql +49 -0
  677. synapse/storage/schema/main/delta/53/user_ips_index.sql +49 -0
  678. synapse/storage/schema/main/delta/53/user_share.sql +63 -0
  679. synapse/storage/schema/main/delta/53/user_threepid_id.sql +48 -0
  680. synapse/storage/schema/main/delta/53/users_in_public_rooms.sql +47 -0
  681. synapse/storage/schema/main/delta/54/account_validity_with_renewal.sql +49 -0
  682. synapse/storage/schema/main/delta/54/add_validity_to_server_keys.sql +42 -0
  683. synapse/storage/schema/main/delta/54/delete_forward_extremities.sql +42 -0
  684. synapse/storage/schema/main/delta/54/drop_legacy_tables.sql +49 -0
  685. synapse/storage/schema/main/delta/54/drop_presence_list.sql +35 -0
  686. synapse/storage/schema/main/delta/54/relations.sql +46 -0
  687. synapse/storage/schema/main/delta/54/stats.sql +99 -0
  688. synapse/storage/schema/main/delta/54/stats2.sql +47 -0
  689. synapse/storage/schema/main/delta/55/access_token_expiry.sql +37 -0
  690. synapse/storage/schema/main/delta/55/track_threepid_validations.sql +50 -0
  691. synapse/storage/schema/main/delta/55/users_alter_deactivated.sql +38 -0
  692. synapse/storage/schema/main/delta/56/add_spans_to_device_lists.sql +39 -0
  693. synapse/storage/schema/main/delta/56/current_state_events_membership.sql +41 -0
  694. synapse/storage/schema/main/delta/56/current_state_events_membership_mk2.sql +43 -0
  695. synapse/storage/schema/main/delta/56/delete_keys_from_deleted_backups.sql +44 -0
  696. synapse/storage/schema/main/delta/56/destinations_failure_ts.sql +44 -0
  697. synapse/storage/schema/main/delta/56/destinations_retry_interval_type.sql.postgres +18 -0
  698. synapse/storage/schema/main/delta/56/device_stream_id_insert.sql +39 -0
  699. synapse/storage/schema/main/delta/56/devices_last_seen.sql +43 -0
  700. synapse/storage/schema/main/delta/56/drop_unused_event_tables.sql +39 -0
  701. synapse/storage/schema/main/delta/56/event_expiry.sql +40 -0
  702. synapse/storage/schema/main/delta/56/event_labels.sql +49 -0
  703. synapse/storage/schema/main/delta/56/event_labels_background_update.sql +36 -0
  704. synapse/storage/schema/main/delta/56/fix_room_keys_index.sql +37 -0
  705. synapse/storage/schema/main/delta/56/hidden_devices.sql +37 -0
  706. synapse/storage/schema/main/delta/56/hidden_devices_fix.sql.sqlite +42 -0
  707. synapse/storage/schema/main/delta/56/nuke_empty_communities_from_db.sql +48 -0
  708. synapse/storage/schema/main/delta/56/public_room_list_idx.sql +35 -0
  709. synapse/storage/schema/main/delta/56/redaction_censor.sql +35 -0
  710. synapse/storage/schema/main/delta/56/redaction_censor2.sql +41 -0
  711. synapse/storage/schema/main/delta/56/redaction_censor3_fix_update.sql.postgres +25 -0
  712. synapse/storage/schema/main/delta/56/redaction_censor4.sql +35 -0
  713. synapse/storage/schema/main/delta/56/remove_tombstoned_rooms_from_directory.sql +38 -0
  714. synapse/storage/schema/main/delta/56/room_key_etag.sql +36 -0
  715. synapse/storage/schema/main/delta/56/room_membership_idx.sql +37 -0
  716. synapse/storage/schema/main/delta/56/room_retention.sql +52 -0
  717. synapse/storage/schema/main/delta/56/signing_keys.sql +75 -0
  718. synapse/storage/schema/main/delta/56/signing_keys_nonunique_signatures.sql +41 -0
  719. synapse/storage/schema/main/delta/56/stats_separated.sql +175 -0
  720. synapse/storage/schema/main/delta/56/unique_user_filter_index.py +46 -0
  721. synapse/storage/schema/main/delta/56/user_external_ids.sql +43 -0
  722. synapse/storage/schema/main/delta/56/users_in_public_rooms_idx.sql +36 -0
  723. synapse/storage/schema/main/delta/57/delete_old_current_state_events.sql +41 -0
  724. synapse/storage/schema/main/delta/57/device_list_remote_cache_stale.sql +44 -0
  725. synapse/storage/schema/main/delta/57/local_current_membership.py +111 -0
  726. synapse/storage/schema/main/delta/57/remove_sent_outbound_pokes.sql +40 -0
  727. synapse/storage/schema/main/delta/57/rooms_version_column.sql +43 -0
  728. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.postgres +35 -0
  729. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.sqlite +22 -0
  730. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.postgres +39 -0
  731. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.sqlite +23 -0
  732. synapse/storage/schema/main/delta/58/02remove_dup_outbound_pokes.sql +41 -0
  733. synapse/storage/schema/main/delta/58/03persist_ui_auth.sql +55 -0
  734. synapse/storage/schema/main/delta/58/05cache_instance.sql.postgres +30 -0
  735. synapse/storage/schema/main/delta/58/06dlols_unique_idx.py +83 -0
  736. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.postgres +33 -0
  737. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.sqlite +44 -0
  738. synapse/storage/schema/main/delta/58/07persist_ui_auth_ips.sql +44 -0
  739. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.postgres +18 -0
  740. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.sqlite +18 -0
  741. synapse/storage/schema/main/delta/58/09shadow_ban.sql +37 -0
  742. synapse/storage/schema/main/delta/58/10_pushrules_enabled_delete_obsolete.sql +47 -0
  743. synapse/storage/schema/main/delta/58/10drop_local_rejections_stream.sql +41 -0
  744. synapse/storage/schema/main/delta/58/10federation_pos_instance_name.sql +41 -0
  745. synapse/storage/schema/main/delta/58/11dehydration.sql +39 -0
  746. synapse/storage/schema/main/delta/58/11fallback.sql +43 -0
  747. synapse/storage/schema/main/delta/58/11user_id_seq.py +38 -0
  748. synapse/storage/schema/main/delta/58/12room_stats.sql +51 -0
  749. synapse/storage/schema/main/delta/58/13remove_presence_allow_inbound.sql +36 -0
  750. synapse/storage/schema/main/delta/58/14events_instance_name.sql +35 -0
  751. synapse/storage/schema/main/delta/58/14events_instance_name.sql.postgres +28 -0
  752. synapse/storage/schema/main/delta/58/15_catchup_destination_rooms.sql +61 -0
  753. synapse/storage/schema/main/delta/58/15unread_count.sql +45 -0
  754. synapse/storage/schema/main/delta/58/16populate_stats_process_rooms_fix.sql +41 -0
  755. synapse/storage/schema/main/delta/58/17_catchup_last_successful.sql +40 -0
  756. synapse/storage/schema/main/delta/58/18stream_positions.sql +41 -0
  757. synapse/storage/schema/main/delta/58/19instance_map.sql.postgres +25 -0
  758. synapse/storage/schema/main/delta/58/19txn_id.sql +59 -0
  759. synapse/storage/schema/main/delta/58/20instance_name_event_tables.sql +36 -0
  760. synapse/storage/schema/main/delta/58/20user_daily_visits.sql +37 -0
  761. synapse/storage/schema/main/delta/58/21as_device_stream.sql +36 -0
  762. synapse/storage/schema/main/delta/58/21drop_device_max_stream_id.sql +1 -0
  763. synapse/storage/schema/main/delta/58/22puppet_token.sql +36 -0
  764. synapse/storage/schema/main/delta/58/22users_have_local_media.sql +2 -0
  765. synapse/storage/schema/main/delta/58/23e2e_cross_signing_keys_idx.sql +36 -0
  766. synapse/storage/schema/main/delta/58/24drop_event_json_index.sql +38 -0
  767. synapse/storage/schema/main/delta/58/25user_external_ids_user_id_idx.sql +36 -0
  768. synapse/storage/schema/main/delta/58/26access_token_last_validated.sql +37 -0
  769. synapse/storage/schema/main/delta/58/27local_invites.sql +37 -0
  770. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.postgres +16 -0
  771. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.sqlite +62 -0
  772. synapse/storage/schema/main/delta/59/01ignored_user.py +85 -0
  773. synapse/storage/schema/main/delta/59/02shard_send_to_device.sql +37 -0
  774. synapse/storage/schema/main/delta/59/03shard_send_to_device_sequence.sql.postgres +25 -0
  775. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql +71 -0
  776. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql.postgres +16 -0
  777. synapse/storage/schema/main/delta/59/04drop_account_data.sql +36 -0
  778. synapse/storage/schema/main/delta/59/05cache_invalidation.sql +36 -0
  779. synapse/storage/schema/main/delta/59/06chain_cover_index.sql +36 -0
  780. synapse/storage/schema/main/delta/59/06shard_account_data.sql +39 -0
  781. synapse/storage/schema/main/delta/59/06shard_account_data.sql.postgres +32 -0
  782. synapse/storage/schema/main/delta/59/07shard_account_data_fix.sql +37 -0
  783. synapse/storage/schema/main/delta/59/08delete_pushers_for_deactivated_accounts.sql +39 -0
  784. synapse/storage/schema/main/delta/59/08delete_stale_pushers.sql +39 -0
  785. synapse/storage/schema/main/delta/59/09rejected_events_metadata.sql +45 -0
  786. synapse/storage/schema/main/delta/59/10delete_purged_chain_cover.sql +36 -0
  787. synapse/storage/schema/main/delta/59/11add_knock_members_to_stats.sql +39 -0
  788. synapse/storage/schema/main/delta/59/11drop_thumbnail_constraint.sql.postgres +22 -0
  789. synapse/storage/schema/main/delta/59/12account_validity_token_used_ts_ms.sql +37 -0
  790. synapse/storage/schema/main/delta/59/12presence_stream_instance.sql +37 -0
  791. synapse/storage/schema/main/delta/59/12presence_stream_instance_seq.sql.postgres +20 -0
  792. synapse/storage/schema/main/delta/59/13users_to_send_full_presence_to.sql +53 -0
  793. synapse/storage/schema/main/delta/59/14refresh_tokens.sql +53 -0
  794. synapse/storage/schema/main/delta/59/15locks.sql +56 -0
  795. synapse/storage/schema/main/delta/59/16federation_inbound_staging.sql +51 -0
  796. synapse/storage/schema/main/delta/60/01recreate_stream_ordering.sql.postgres +45 -0
  797. synapse/storage/schema/main/delta/60/02change_stream_ordering_columns.sql.postgres +30 -0
  798. synapse/storage/schema/main/delta/61/01change_appservices_txns.sql.postgres +23 -0
  799. synapse/storage/schema/main/delta/61/01insertion_event_lookups.sql +68 -0
  800. synapse/storage/schema/main/delta/61/02drop_redundant_room_depth_index.sql +37 -0
  801. synapse/storage/schema/main/delta/61/03recreate_min_depth.py +74 -0
  802. synapse/storage/schema/main/delta/62/01insertion_event_extremities.sql +43 -0
  803. synapse/storage/schema/main/delta/63/01create_registration_tokens.sql +42 -0
  804. synapse/storage/schema/main/delta/63/02delete_unlinked_email_pushers.sql +39 -0
  805. synapse/storage/schema/main/delta/63/02populate-rooms-creator.sql +36 -0
  806. synapse/storage/schema/main/delta/63/03session_store.sql +42 -0
  807. synapse/storage/schema/main/delta/63/04add_presence_stream_not_offline_index.sql +37 -0
  808. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.postgres +23 -0
  809. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.sqlite +37 -0
  810. synapse/storage/schema/main/delta/65/01msc2716_insertion_event_edges.sql +38 -0
  811. synapse/storage/schema/main/delta/65/03remove_hidden_devices_from_device_inbox.sql +41 -0
  812. synapse/storage/schema/main/delta/65/04_local_group_updates.sql +37 -0
  813. synapse/storage/schema/main/delta/65/05_remove_room_stats_historical_and_user_stats_historical.sql +38 -0
  814. synapse/storage/schema/main/delta/65/06remove_deleted_devices_from_device_inbox.sql +53 -0
  815. synapse/storage/schema/main/delta/65/07_arbitrary_relations.sql +37 -0
  816. synapse/storage/schema/main/delta/65/08_device_inbox_background_updates.sql +37 -0
  817. synapse/storage/schema/main/delta/65/10_expirable_refresh_tokens.sql +47 -0
  818. synapse/storage/schema/main/delta/65/11_devices_auth_provider_session.sql +46 -0
  819. synapse/storage/schema/main/delta/67/01drop_public_room_list_stream.sql +37 -0
  820. synapse/storage/schema/main/delta/68/01event_columns.sql +45 -0
  821. synapse/storage/schema/main/delta/68/02_msc2409_add_device_id_appservice_stream_type.sql +40 -0
  822. synapse/storage/schema/main/delta/68/03_delete_account_data_for_deactivated_accounts.sql +39 -0
  823. synapse/storage/schema/main/delta/68/04_refresh_tokens_index_next_token_id.sql +47 -0
  824. synapse/storage/schema/main/delta/68/04partial_state_rooms.sql +60 -0
  825. synapse/storage/schema/main/delta/68/05_delete_non_strings_from_event_search.sql.sqlite +22 -0
  826. synapse/storage/schema/main/delta/68/05partial_state_rooms_triggers.py +80 -0
  827. synapse/storage/schema/main/delta/68/06_msc3202_add_device_list_appservice_stream_type.sql +42 -0
  828. synapse/storage/schema/main/delta/69/01as_txn_seq.py +54 -0
  829. synapse/storage/schema/main/delta/69/01device_list_oubound_by_room.sql +57 -0
  830. synapse/storage/schema/main/delta/69/02cache_invalidation_index.sql +37 -0
  831. synapse/storage/schema/main/delta/70/01clean_table_purged_rooms.sql +39 -0
  832. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.postgres +43 -0
  833. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.sqlite +47 -0
  834. synapse/storage/schema/main/delta/71/01remove_noop_background_updates.sql +80 -0
  835. synapse/storage/schema/main/delta/71/02event_push_summary_unique.sql +37 -0
  836. synapse/storage/schema/main/delta/72/01add_room_type_to_state_stats.sql +38 -0
  837. synapse/storage/schema/main/delta/72/01event_push_summary_receipt.sql +54 -0
  838. synapse/storage/schema/main/delta/72/02event_push_actions_index.sql +38 -0
  839. synapse/storage/schema/main/delta/72/03bg_populate_events_columns.py +57 -0
  840. synapse/storage/schema/main/delta/72/03drop_event_reference_hashes.sql +36 -0
  841. synapse/storage/schema/main/delta/72/03remove_groups.sql +50 -0
  842. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.postgres +17 -0
  843. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.sqlite +40 -0
  844. synapse/storage/schema/main/delta/72/05receipts_event_stream_ordering.sql +38 -0
  845. synapse/storage/schema/main/delta/72/05remove_unstable_private_read_receipts.sql +38 -0
  846. synapse/storage/schema/main/delta/72/06add_consent_ts_to_users.sql +35 -0
  847. synapse/storage/schema/main/delta/72/06thread_notifications.sql +49 -0
  848. synapse/storage/schema/main/delta/72/07force_update_current_state_events_membership.py +67 -0
  849. synapse/storage/schema/main/delta/72/07thread_receipts.sql.postgres +30 -0
  850. synapse/storage/schema/main/delta/72/07thread_receipts.sql.sqlite +70 -0
  851. synapse/storage/schema/main/delta/72/08begin_cache_invalidation_seq_at_2.sql.postgres +23 -0
  852. synapse/storage/schema/main/delta/72/08thread_receipts.sql +39 -0
  853. synapse/storage/schema/main/delta/72/09partial_indices.sql.sqlite +56 -0
  854. synapse/storage/schema/main/delta/73/01event_failed_pull_attempts.sql +48 -0
  855. synapse/storage/schema/main/delta/73/02add_pusher_enabled.sql +35 -0
  856. synapse/storage/schema/main/delta/73/02room_id_indexes_for_purging.sql +41 -0
  857. synapse/storage/schema/main/delta/73/03pusher_device_id.sql +39 -0
  858. synapse/storage/schema/main/delta/73/03users_approved_column.sql +39 -0
  859. synapse/storage/schema/main/delta/73/04partial_join_details.sql +42 -0
  860. synapse/storage/schema/main/delta/73/04pending_device_list_updates.sql +47 -0
  861. synapse/storage/schema/main/delta/73/05old_push_actions.sql.postgres +22 -0
  862. synapse/storage/schema/main/delta/73/05old_push_actions.sql.sqlite +24 -0
  863. synapse/storage/schema/main/delta/73/06thread_notifications_thread_id_idx.sql +42 -0
  864. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.postgres +23 -0
  865. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.sqlite +76 -0
  866. synapse/storage/schema/main/delta/73/09partial_joined_via_destination.sql +37 -0
  867. synapse/storage/schema/main/delta/73/09threads_table.sql +49 -0
  868. synapse/storage/schema/main/delta/73/10_update_sqlite_fts4_tokenizer.py +71 -0
  869. synapse/storage/schema/main/delta/73/10login_tokens.sql +54 -0
  870. synapse/storage/schema/main/delta/73/11event_search_room_id_n_distinct.sql.postgres +33 -0
  871. synapse/storage/schema/main/delta/73/12refactor_device_list_outbound_pokes.sql +72 -0
  872. synapse/storage/schema/main/delta/73/13add_device_lists_index.sql +39 -0
  873. synapse/storage/schema/main/delta/73/20_un_partial_stated_room_stream.sql +51 -0
  874. synapse/storage/schema/main/delta/73/21_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  875. synapse/storage/schema/main/delta/73/22_rebuild_user_dir_stats.sql +48 -0
  876. synapse/storage/schema/main/delta/73/22_un_partial_stated_event_stream.sql +53 -0
  877. synapse/storage/schema/main/delta/73/23_fix_thread_index.sql +52 -0
  878. synapse/storage/schema/main/delta/73/23_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  879. synapse/storage/schema/main/delta/73/24_events_jump_to_date_index.sql +36 -0
  880. synapse/storage/schema/main/delta/73/25drop_presence.sql +36 -0
  881. synapse/storage/schema/main/delta/74/01_user_directory_stale_remote_users.sql +58 -0
  882. synapse/storage/schema/main/delta/74/02_set_device_id_for_pushers_bg_update.sql +38 -0
  883. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.postgres +29 -0
  884. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.sqlite +23 -0
  885. synapse/storage/schema/main/delta/74/03_room_membership_index.sql +38 -0
  886. synapse/storage/schema/main/delta/74/04_delete_e2e_backup_keys_for_deactivated_users.sql +36 -0
  887. synapse/storage/schema/main/delta/74/04_membership_tables_event_stream_ordering_triggers.py +87 -0
  888. synapse/storage/schema/main/delta/74/05_events_txn_id_device_id.sql +72 -0
  889. synapse/storage/schema/main/delta/74/90COMMENTS_destinations.sql.postgres +52 -0
  890. synapse/storage/schema/main/delta/76/01_add_profiles_full_user_id_column.sql +39 -0
  891. synapse/storage/schema/main/delta/76/02_add_user_filters_full_user_id_column.sql +39 -0
  892. synapse/storage/schema/main/delta/76/03_per_user_experimental_features.sql +46 -0
  893. synapse/storage/schema/main/delta/76/04_add_room_forgetter.sql +43 -0
  894. synapse/storage/schema/main/delta/77/01_add_profiles_not_valid_check.sql.postgres +16 -0
  895. synapse/storage/schema/main/delta/77/02_add_user_filters_not_valid_check.sql.postgres +16 -0
  896. synapse/storage/schema/main/delta/77/03bg_populate_full_user_id_profiles.sql +35 -0
  897. synapse/storage/schema/main/delta/77/04bg_populate_full_user_id_user_filters.sql +35 -0
  898. synapse/storage/schema/main/delta/77/05thread_notifications_backfill.sql +67 -0
  899. synapse/storage/schema/main/delta/77/06thread_notifications_not_null.sql.sqlite +102 -0
  900. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions.sql.postgres +27 -0
  901. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions_staging.sql.postgres +27 -0
  902. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_summary.sql.postgres +29 -0
  903. synapse/storage/schema/main/delta/77/14bg_indices_event_stream_ordering.sql +39 -0
  904. synapse/storage/schema/main/delta/78/01_validate_and_update_profiles.py +99 -0
  905. synapse/storage/schema/main/delta/78/02_validate_and_update_user_filters.py +100 -0
  906. synapse/storage/schema/main/delta/78/03_remove_unused_indexes_user_filters.py +72 -0
  907. synapse/storage/schema/main/delta/78/03event_extremities_constraints.py +65 -0
  908. synapse/storage/schema/main/delta/78/04_add_full_user_id_index_user_filters.py +32 -0
  909. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.postgres +102 -0
  910. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.sqlite +72 -0
  911. synapse/storage/schema/main/delta/79/04_mitigate_stream_ordering_update_race.py +70 -0
  912. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.postgres +69 -0
  913. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.sqlite +65 -0
  914. synapse/storage/schema/main/delta/80/01_users_alter_locked.sql +35 -0
  915. synapse/storage/schema/main/delta/80/02_read_write_locks_unlogged.sql.postgres +30 -0
  916. synapse/storage/schema/main/delta/80/02_scheduled_tasks.sql +47 -0
  917. synapse/storage/schema/main/delta/80/03_read_write_locks_triggers.sql.postgres +37 -0
  918. synapse/storage/schema/main/delta/80/04_read_write_locks_deadlock.sql.postgres +71 -0
  919. synapse/storage/schema/main/delta/82/02_scheduled_tasks_index.sql +35 -0
  920. synapse/storage/schema/main/delta/82/04_add_indices_for_purging_rooms.sql +39 -0
  921. synapse/storage/schema/main/delta/82/05gaps.sql +44 -0
  922. synapse/storage/schema/main/delta/83/01_drop_old_tables.sql +43 -0
  923. synapse/storage/schema/main/delta/83/03_instance_name_receipts.sql.sqlite +17 -0
  924. synapse/storage/schema/main/delta/83/05_cross_signing_key_update_grant.sql +34 -0
  925. synapse/storage/schema/main/delta/83/06_event_push_summary_room.sql +36 -0
  926. synapse/storage/schema/main/delta/84/01_auth_links_stats.sql.postgres +20 -0
  927. synapse/storage/schema/main/delta/84/02_auth_links_index.sql +16 -0
  928. synapse/storage/schema/main/delta/84/03_auth_links_analyze.sql.postgres +16 -0
  929. synapse/storage/schema/main/delta/84/04_access_token_index.sql +15 -0
  930. synapse/storage/schema/main/delta/85/01_add_suspended.sql +14 -0
  931. synapse/storage/schema/main/delta/85/02_add_instance_names.sql +27 -0
  932. synapse/storage/schema/main/delta/85/03_new_sequences.sql.postgres +54 -0
  933. synapse/storage/schema/main/delta/85/04_cleanup_device_federation_outbox.sql +15 -0
  934. synapse/storage/schema/main/delta/85/05_add_instance_names_converted_pos.sql +16 -0
  935. synapse/storage/schema/main/delta/85/06_add_room_reports.sql +20 -0
  936. synapse/storage/schema/main/delta/86/01_authenticate_media.sql +15 -0
  937. synapse/storage/schema/main/delta/86/02_receipts_event_id_index.sql +15 -0
  938. synapse/storage/schema/main/delta/87/01_sliding_sync_memberships.sql +169 -0
  939. synapse/storage/schema/main/delta/87/02_per_connection_state.sql +81 -0
  940. synapse/storage/schema/main/delta/87/03_current_state_index.sql +19 -0
  941. synapse/storage/schema/main/delta/88/01_add_delayed_events.sql +43 -0
  942. synapse/storage/schema/main/delta/88/01_custom_profile_fields.sql +15 -0
  943. synapse/storage/schema/main/delta/88/02_fix_sliding_sync_membership_snapshots_forgotten_column.sql +21 -0
  944. synapse/storage/schema/main/delta/88/03_add_otk_ts_added_index.sql +18 -0
  945. synapse/storage/schema/main/delta/88/04_current_state_delta_index.sql +18 -0
  946. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.postgres +19 -0
  947. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.sqlite +19 -0
  948. synapse/storage/schema/main/delta/88/05_sliding_sync_room_config_index.sql +20 -0
  949. synapse/storage/schema/main/delta/88/06_events_received_ts_index.sql +17 -0
  950. synapse/storage/schema/main/delta/89/01_sliding_sync_membership_snapshot_index.sql +15 -0
  951. synapse/storage/schema/main/delta/90/01_add_column_participant_room_memberships_table.sql +16 -0
  952. synapse/storage/schema/main/delta/91/01_media_hash.sql +28 -0
  953. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.postgres +16 -0
  954. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.sqlite +16 -0
  955. synapse/storage/schema/main/delta/92/02_remove_populate_participant_bg_update.sql +17 -0
  956. synapse/storage/schema/main/delta/92/04_ss_membership_snapshot_idx.sql +16 -0
  957. synapse/storage/schema/main/delta/92/04_thread_subscriptions.sql +59 -0
  958. synapse/storage/schema/main/delta/92/04_thread_subscriptions_seq.sql.postgres +19 -0
  959. synapse/storage/schema/main/delta/92/05_fixup_max_depth_cap.sql +17 -0
  960. synapse/storage/schema/main/delta/92/05_thread_subscriptions_comments.sql.postgres +18 -0
  961. synapse/storage/schema/main/delta/92/06_device_federation_inbox_index.sql +16 -0
  962. synapse/storage/schema/main/delta/92/06_threads_last_sent_stream_ordering_comments.sql.postgres +24 -0
  963. synapse/storage/schema/main/delta/92/07_add_user_reports.sql +22 -0
  964. synapse/storage/schema/main/delta/92/07_event_txn_id_device_id_txn_id2.sql +15 -0
  965. synapse/storage/schema/main/delta/92/08_room_ban_redactions.sql +21 -0
  966. synapse/storage/schema/main/delta/92/08_thread_subscriptions_seq_fixup.sql.postgres +19 -0
  967. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql +20 -0
  968. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql.postgres +18 -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 +185 -0
  986. synapse/storage/util/__init__.py +20 -0
  987. synapse/storage/util/id_generators.py +909 -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 +92 -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 +909 -0
  1005. synapse/types/rest/__init__.py +25 -0
  1006. synapse/types/rest/client/__init__.py +415 -0
  1007. synapse/types/state.py +635 -0
  1008. synapse/types/storage/__init__.py +66 -0
  1009. synapse/util/__init__.py +170 -0
  1010. synapse/util/async_helpers.py +1067 -0
  1011. synapse/util/batching_queue.py +202 -0
  1012. synapse/util/caches/__init__.py +300 -0
  1013. synapse/util/caches/cached_call.py +143 -0
  1014. synapse/util/caches/deferred_cache.py +530 -0
  1015. synapse/util/caches/descriptors.py +694 -0
  1016. synapse/util/caches/dictionary_cache.py +350 -0
  1017. synapse/util/caches/expiringcache.py +251 -0
  1018. synapse/util/caches/lrucache.py +977 -0
  1019. synapse/util/caches/response_cache.py +323 -0
  1020. synapse/util/caches/stream_change_cache.py +370 -0
  1021. synapse/util/caches/treecache.py +189 -0
  1022. synapse/util/caches/ttlcache.py +197 -0
  1023. synapse/util/cancellation.py +63 -0
  1024. synapse/util/check_dependencies.py +335 -0
  1025. synapse/util/clock.py +500 -0
  1026. synapse/util/constants.py +22 -0
  1027. synapse/util/daemonize.py +165 -0
  1028. synapse/util/distributor.py +159 -0
  1029. synapse/util/events.py +134 -0
  1030. synapse/util/file_consumer.py +164 -0
  1031. synapse/util/frozenutils.py +57 -0
  1032. synapse/util/gai_resolver.py +180 -0
  1033. synapse/util/hash.py +38 -0
  1034. synapse/util/httpresourcetree.py +108 -0
  1035. synapse/util/iterutils.py +189 -0
  1036. synapse/util/json.py +56 -0
  1037. synapse/util/linked_list.py +156 -0
  1038. synapse/util/logcontext.py +46 -0
  1039. synapse/util/logformatter.py +28 -0
  1040. synapse/util/macaroons.py +325 -0
  1041. synapse/util/manhole.py +191 -0
  1042. synapse/util/metrics.py +340 -0
  1043. synapse/util/module_loader.py +116 -0
  1044. synapse/util/msisdn.py +51 -0
  1045. synapse/util/patch_inline_callbacks.py +250 -0
  1046. synapse/util/pydantic_models.py +56 -0
  1047. synapse/util/ratelimitutils.py +420 -0
  1048. synapse/util/retryutils.py +339 -0
  1049. synapse/util/rlimit.py +42 -0
  1050. synapse/util/rust.py +134 -0
  1051. synapse/util/sentinel.py +21 -0
  1052. synapse/util/stringutils.py +293 -0
  1053. synapse/util/task_scheduler.py +493 -0
  1054. synapse/util/templates.py +126 -0
  1055. synapse/util/threepids.py +123 -0
  1056. synapse/util/wheel_timer.py +112 -0
  1057. synapse/visibility.py +836 -0
synapse/http/server.py ADDED
@@ -0,0 +1,1114 @@
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
+ Optional,
39
+ Pattern,
40
+ Protocol,
41
+ Union,
42
+ cast,
43
+ )
44
+
45
+ import attr
46
+ import jinja2
47
+ from canonicaljson import encode_canonical_json
48
+ from zope.interface import implementer
49
+
50
+ from twisted.internet import defer, interfaces, reactor
51
+ from twisted.internet.defer import CancelledError
52
+ from twisted.python import failure
53
+ from twisted.web import resource
54
+
55
+ from synapse.types import ISynapseThreadlessReactor
56
+
57
+ try:
58
+ from twisted.web.pages import notFound
59
+ except ImportError:
60
+ from twisted.web.resource import NoResource as notFound # type: ignore[assignment]
61
+
62
+ from twisted.web.resource import IResource
63
+ from twisted.web.server import NOT_DONE_YET, Request
64
+ from twisted.web.static import File
65
+ from twisted.web.util import redirectTo
66
+
67
+ from synapse.api.errors import (
68
+ CodeMessageException,
69
+ Codes,
70
+ LimitExceededError,
71
+ RedirectException,
72
+ SynapseError,
73
+ UnrecognizedRequestError,
74
+ )
75
+ from synapse.config.homeserver import HomeServerConfig
76
+ from synapse.logging.context import defer_to_thread, preserve_fn, run_in_background
77
+ from synapse.logging.opentracing import active_span, start_active_span, trace_servlet
78
+ from synapse.util.caches import intern_dict
79
+ from synapse.util.cancellation import is_function_cancellable
80
+ from synapse.util.clock import Clock
81
+ from synapse.util.iterutils import chunk_seq
82
+ from synapse.util.json import json_encoder
83
+
84
+ if TYPE_CHECKING:
85
+ import opentracing
86
+
87
+ from synapse.http.site import SynapseRequest
88
+ from synapse.server import HomeServer
89
+
90
+ logger = logging.getLogger(__name__)
91
+
92
+ HTML_ERROR_TEMPLATE = """<!DOCTYPE html>
93
+ <html lang=en>
94
+ <head>
95
+ <meta charset="utf-8">
96
+ <title>Error {code}</title>
97
+ </head>
98
+ <body>
99
+ <p>{msg}</p>
100
+ </body>
101
+ </html>
102
+ """
103
+
104
+ # A fictional HTTP status code for requests where the client has disconnected and we
105
+ # successfully cancelled the request. Used only for logging purposes. Clients will never
106
+ # observe this code unless cancellations leak across requests or we raise a
107
+ # `CancelledError` ourselves.
108
+ # Analogous to nginx's 499 status code:
109
+ # https://github.com/nginx/nginx/blob/release-1.21.6/src/http/ngx_http_request.h#L128-L134
110
+ HTTP_STATUS_REQUEST_CANCELLED = 499
111
+
112
+
113
+ def return_json_error(
114
+ f: failure.Failure, request: "SynapseRequest", config: Optional[HomeServerConfig]
115
+ ) -> None:
116
+ """Sends a JSON error response to clients."""
117
+
118
+ if f.check(SynapseError):
119
+ # mypy doesn't understand that f.check asserts the type.
120
+ exc: SynapseError = f.value
121
+ error_code = exc.code
122
+ error_dict = exc.error_dict(config)
123
+ if exc.headers is not None:
124
+ for header, value in exc.headers.items():
125
+ request.setHeader(header, value)
126
+ error_ctx = exc.debug_context
127
+ if error_ctx:
128
+ logger.info(
129
+ "%s SynapseError: %s - %s (%s)", request, error_code, exc.msg, error_ctx
130
+ )
131
+ else:
132
+ logger.info("%s SynapseError: %s - %s", request, error_code, exc.msg)
133
+ elif f.check(CancelledError):
134
+ error_code = HTTP_STATUS_REQUEST_CANCELLED
135
+ error_dict = {"error": "Request cancelled", "errcode": Codes.UNKNOWN}
136
+
137
+ if not request._disconnected:
138
+ logger.error(
139
+ "Got cancellation before client disconnection from %r: %r",
140
+ request.request_metrics.name,
141
+ request,
142
+ exc_info=(f.type, f.value, f.getTracebackObject()),
143
+ )
144
+ else:
145
+ error_code = 500
146
+ error_dict = {"error": "Internal server error", "errcode": Codes.UNKNOWN}
147
+
148
+ logger.error(
149
+ "Failed handle request via %r: %r",
150
+ request.request_metrics.name,
151
+ request,
152
+ exc_info=(f.type, f.value, f.getTracebackObject()),
153
+ )
154
+
155
+ # Only respond with an error response if we haven't already started writing,
156
+ # otherwise lets just kill the connection
157
+ if request.startedWriting:
158
+ if request.channel:
159
+ try:
160
+ request.channel.forceAbortClient()
161
+ except Exception:
162
+ # abortConnection throws if the connection is already closed
163
+ pass
164
+ else:
165
+ respond_with_json(
166
+ request,
167
+ error_code,
168
+ error_dict,
169
+ send_cors=True,
170
+ )
171
+
172
+
173
+ def return_html_error(
174
+ f: failure.Failure,
175
+ request: Request,
176
+ error_template: Union[str, jinja2.Template],
177
+ ) -> None:
178
+ """Sends an HTML error page corresponding to the given failure.
179
+
180
+ Handles RedirectException and other CodeMessageExceptions (such as SynapseError)
181
+
182
+ Args:
183
+ f: the error to report
184
+ request: the failing request
185
+ error_template: the HTML template. Can be either a string (with `{code}`,
186
+ `{msg}` placeholders), or a jinja2 template
187
+ """
188
+ if f.check(CodeMessageException):
189
+ # mypy doesn't understand that f.check asserts the type.
190
+ cme: CodeMessageException = f.value
191
+ code = cme.code
192
+ msg = cme.msg
193
+ if cme.headers is not None:
194
+ for header, value in cme.headers.items():
195
+ request.setHeader(header, value)
196
+
197
+ if isinstance(cme, RedirectException):
198
+ logger.info("%s redirect to %s", request, cme.location)
199
+ request.setHeader(b"location", cme.location)
200
+ request.cookies.extend(cme.cookies)
201
+ elif isinstance(cme, SynapseError):
202
+ logger.info("%s SynapseError: %s - %s", request, code, msg)
203
+ else:
204
+ logger.error(
205
+ "Failed handle request %r",
206
+ request,
207
+ exc_info=(f.type, f.value, f.getTracebackObject()),
208
+ )
209
+ elif f.check(CancelledError):
210
+ code = HTTP_STATUS_REQUEST_CANCELLED
211
+ msg = "Request cancelled"
212
+
213
+ if not request._disconnected:
214
+ logger.error(
215
+ "Got cancellation before client disconnection when handling request %r",
216
+ request,
217
+ exc_info=(f.type, f.value, f.getTracebackObject()),
218
+ )
219
+ else:
220
+ code = HTTPStatus.INTERNAL_SERVER_ERROR
221
+ msg = "Internal server error"
222
+
223
+ logger.error(
224
+ "Failed handle request %r",
225
+ request,
226
+ exc_info=(f.type, f.value, f.getTracebackObject()),
227
+ )
228
+
229
+ if isinstance(error_template, str):
230
+ body = error_template.format(code=code, msg=html.escape(msg))
231
+ else:
232
+ body = error_template.render(code=code, msg=msg)
233
+
234
+ respond_with_html(request, code, body)
235
+
236
+
237
+ def wrap_async_request_handler(
238
+ h: Callable[["_AsyncResource", "SynapseRequest"], Awaitable[None]],
239
+ ) -> Callable[["_AsyncResource", "SynapseRequest"], "defer.Deferred[None]"]:
240
+ """Wraps an async request handler so that it calls request.processing.
241
+
242
+ This helps ensure that work done by the request handler after the request is completed
243
+ is correctly recorded against the request metrics/logs.
244
+
245
+ The handler method must have a signature of "handle_foo(self, request)",
246
+ where "request" must be a SynapseRequest.
247
+
248
+ The handler may return a deferred, in which case the completion of the request isn't
249
+ logged until the deferred completes.
250
+ """
251
+
252
+ async def wrapped_async_request_handler(
253
+ self: "_AsyncResource", request: "SynapseRequest"
254
+ ) -> None:
255
+ with request.processing():
256
+ await h(self, request)
257
+
258
+ # we need to preserve_fn here, because the synchronous render method won't yield for
259
+ # us (obviously)
260
+ return preserve_fn(wrapped_async_request_handler)
261
+
262
+
263
+ # Type of a callback method for processing requests
264
+ # it is actually called with a SynapseRequest and a kwargs dict for the params,
265
+ # but I can't figure out how to represent that.
266
+ ServletCallback = Callable[
267
+ ..., Union[None, Awaitable[None], tuple[int, Any], Awaitable[tuple[int, Any]]]
268
+ ]
269
+
270
+
271
+ class HttpServer(Protocol):
272
+ """Interface for registering callbacks on a HTTP server"""
273
+
274
+ def register_paths(
275
+ self,
276
+ method: str,
277
+ path_patterns: Iterable[Pattern[str]],
278
+ callback: ServletCallback,
279
+ servlet_classname: str,
280
+ ) -> None:
281
+ """Register a callback that gets fired if we receive a http request
282
+ with the given method for a path that matches the given regex.
283
+
284
+ If the regex contains groups these gets passed to the callback via
285
+ an unpacked tuple.
286
+
287
+ The callback may be marked with the `@cancellable` decorator, which will
288
+ cause request processing to be cancelled when clients disconnect early.
289
+
290
+ Args:
291
+ method: The HTTP method to listen to.
292
+ path_patterns: The regex used to match requests.
293
+ callback: The function to fire if we receive a matched
294
+ request. The first argument will be the request object and
295
+ subsequent arguments will be any matched groups from the regex.
296
+ This should return either tuple of (code, response), or None.
297
+ servlet_classname: The name of the handler to be used in prometheus
298
+ and opentracing logs.
299
+ """
300
+
301
+
302
+ class _AsyncResource(resource.Resource, metaclass=abc.ABCMeta):
303
+ """Base class for resources that have async handlers.
304
+
305
+ Sub classes can either implement `_async_render_<METHOD>` to handle
306
+ requests by method, or override `_async_render` to handle all requests.
307
+
308
+ Args:
309
+ extract_context: Whether to attempt to extract the opentracing
310
+ context from the request the servlet is handling.
311
+ """
312
+
313
+ def __init__(self, clock: Clock, extract_context: bool = False):
314
+ super().__init__()
315
+
316
+ self._clock = clock
317
+ self._extract_context = extract_context
318
+
319
+ def render(self, request: "SynapseRequest") -> int:
320
+ """This gets called by twisted every time someone sends us a request."""
321
+ request.render_deferred = defer.ensureDeferred(
322
+ self._async_render_wrapper(request)
323
+ )
324
+ return NOT_DONE_YET
325
+
326
+ @wrap_async_request_handler
327
+ async def _async_render_wrapper(self, request: "SynapseRequest") -> None:
328
+ """This is a wrapper that delegates to `_async_render` and handles
329
+ exceptions, return values, metrics, etc.
330
+ """
331
+ try:
332
+ request.request_metrics.name = self.__class__.__name__
333
+
334
+ with trace_servlet(request, self._extract_context):
335
+ try:
336
+ callback_return = await self._async_render(request)
337
+ except LimitExceededError as e:
338
+ if e.pause:
339
+ await self._clock.sleep(e.pause)
340
+ raise
341
+
342
+ if callback_return is not None:
343
+ code, response = callback_return
344
+ self._send_response(request, code, response)
345
+ except Exception:
346
+ # failure.Failure() fishes the original Failure out
347
+ # of our stack, and thus gives us a sensible stack
348
+ # trace.
349
+ f = failure.Failure()
350
+ self._send_error_response(f, request)
351
+
352
+ async def _async_render(
353
+ self, request: "SynapseRequest"
354
+ ) -> Optional[tuple[int, Any]]:
355
+ """Delegates to `_async_render_<METHOD>` methods, or returns a 400 if
356
+ no appropriate method exists. Can be overridden in sub classes for
357
+ different routing.
358
+ """
359
+ # Treat HEAD requests as GET requests.
360
+ request_method = request.method.decode("ascii")
361
+ if request_method == "HEAD":
362
+ request_method = "GET"
363
+
364
+ method_handler = getattr(self, "_async_render_%s" % (request_method,), None)
365
+ if method_handler:
366
+ request.is_render_cancellable = is_function_cancellable(method_handler)
367
+
368
+ raw_callback_return = method_handler(request)
369
+
370
+ # Is it synchronous? We'll allow this for now.
371
+ if isawaitable(raw_callback_return):
372
+ callback_return = await raw_callback_return
373
+ else:
374
+ callback_return = raw_callback_return
375
+
376
+ return callback_return
377
+
378
+ # A request with an unknown method (for a known endpoint) was received.
379
+ raise UnrecognizedRequestError(code=405)
380
+
381
+ @abc.abstractmethod
382
+ def _send_response(
383
+ self,
384
+ request: "SynapseRequest",
385
+ code: int,
386
+ response_object: Any,
387
+ ) -> None:
388
+ raise NotImplementedError()
389
+
390
+ @abc.abstractmethod
391
+ def _send_error_response(
392
+ self,
393
+ f: failure.Failure,
394
+ request: "SynapseRequest",
395
+ ) -> None:
396
+ raise NotImplementedError()
397
+
398
+
399
+ class DirectServeJsonResource(_AsyncResource):
400
+ """A resource that will call `self._async_on_<METHOD>` on new requests,
401
+ formatting responses and errors as JSON.
402
+ """
403
+
404
+ def __init__(
405
+ self,
406
+ canonical_json: bool = False,
407
+ extract_context: bool = False,
408
+ # Clock is optional as this class is exposed to the module API.
409
+ clock: Optional[Clock] = None,
410
+ ):
411
+ """
412
+ Args:
413
+ canonical_json: TODO
414
+ extract_context: TODO
415
+ clock: This is expected to be passed in by any Synapse code.
416
+ Only optional for the Module API.
417
+ """
418
+
419
+ if clock is None:
420
+ # Ideally we wouldn't ignore the linter error here and instead enforce a
421
+ # required `Clock` be passed into the `__init__` function.
422
+ # However, this would change the function signature which is currently being
423
+ # exported to the module api. Since we don't want to break that api, we have
424
+ # to settle with ignoring the linter error here.
425
+ # As of the time of writing this, all Synapse internal usages of
426
+ # `DirectServeJsonResource` pass in the existing homeserver clock instance.
427
+ clock = Clock( # type: ignore[multiple-internal-clocks]
428
+ cast(ISynapseThreadlessReactor, reactor),
429
+ server_name="synapse_module_running_from_unknown_server",
430
+ )
431
+
432
+ super().__init__(clock, extract_context)
433
+ self.canonical_json = canonical_json
434
+
435
+ def _send_response(
436
+ self,
437
+ request: "SynapseRequest",
438
+ code: int,
439
+ response_object: Any,
440
+ ) -> None:
441
+ """Implements _AsyncResource._send_response"""
442
+ # TODO: Only enable CORS for the requests that need it.
443
+ respond_with_json(
444
+ request,
445
+ code,
446
+ response_object,
447
+ send_cors=True,
448
+ canonical_json=self.canonical_json,
449
+ )
450
+
451
+ def _send_error_response(
452
+ self,
453
+ f: failure.Failure,
454
+ request: "SynapseRequest",
455
+ ) -> None:
456
+ """Implements _AsyncResource._send_error_response"""
457
+ return_json_error(f, request, None)
458
+
459
+
460
+ @attr.s(slots=True, frozen=True, auto_attribs=True)
461
+ class _PathEntry:
462
+ callback: ServletCallback
463
+ servlet_classname: str
464
+
465
+
466
+ class JsonResource(DirectServeJsonResource):
467
+ """This implements the HttpServer interface and provides JSON support for
468
+ Resources.
469
+
470
+ Register callbacks via register_paths()
471
+
472
+ Callbacks can return a tuple of status code and a dict in which case the
473
+ the dict will automatically be sent to the client as a JSON object.
474
+
475
+ The JsonResource is primarily intended for returning JSON, but callbacks
476
+ may send something other than JSON, they may do so by using the methods
477
+ on the request object and instead returning None.
478
+ """
479
+
480
+ isLeaf = True
481
+
482
+ def __init__(
483
+ self,
484
+ hs: "HomeServer",
485
+ canonical_json: bool = True,
486
+ extract_context: bool = False,
487
+ ):
488
+ self.clock = hs.get_clock()
489
+ super().__init__(canonical_json, extract_context, clock=self.clock)
490
+ # Map of path regex -> method -> callback.
491
+ self._routes: dict[Pattern[str], dict[bytes, _PathEntry]] = {}
492
+ self.hs = hs
493
+
494
+ def register_paths(
495
+ self,
496
+ method: str,
497
+ path_patterns: Iterable[Pattern[str]],
498
+ callback: ServletCallback,
499
+ servlet_classname: str,
500
+ ) -> None:
501
+ """
502
+ Registers a request handler against a regular expression. Later request URLs are
503
+ checked against these regular expressions in order to identify an appropriate
504
+ handler for that request.
505
+
506
+ Args:
507
+ method: GET, POST etc
508
+
509
+ path_patterns: A list of regular expressions to which the request
510
+ URLs are compared.
511
+
512
+ callback: The handler for the request. Usually a Servlet
513
+
514
+ servlet_classname: The name of the handler to be used in prometheus
515
+ and opentracing logs.
516
+ """
517
+ method_bytes = method.encode("utf-8")
518
+
519
+ for path_pattern in path_patterns:
520
+ logger.debug("Registering for %s %s", method, path_pattern.pattern)
521
+ self._routes.setdefault(path_pattern, {})[method_bytes] = _PathEntry(
522
+ callback, servlet_classname
523
+ )
524
+
525
+ def _get_handler_for_request(
526
+ self, request: "SynapseRequest"
527
+ ) -> tuple[ServletCallback, str, dict[str, str]]:
528
+ """Finds a callback method to handle the given request.
529
+
530
+ Returns:
531
+ A tuple of the callback to use, the name of the servlet, and the
532
+ key word arguments to pass to the callback
533
+ """
534
+ # At this point the path must be bytes.
535
+ request_path_bytes: bytes = request.path
536
+ request_path = request_path_bytes.decode("ascii")
537
+ # Treat HEAD requests as GET requests.
538
+ request_method = request.method
539
+ if request_method == b"HEAD":
540
+ request_method = b"GET"
541
+
542
+ # Loop through all the registered callbacks to check if the method
543
+ # and path regex match
544
+ for path_pattern, methods in self._routes.items():
545
+ m = path_pattern.match(request_path)
546
+ if m:
547
+ # We found a matching path!
548
+ path_entry = methods.get(request_method)
549
+ if not path_entry:
550
+ raise UnrecognizedRequestError(code=405)
551
+ return path_entry.callback, path_entry.servlet_classname, m.groupdict()
552
+
553
+ # Huh. No one wanted to handle that? Fiiiiiine.
554
+ raise UnrecognizedRequestError(code=404)
555
+
556
+ async def _async_render(self, request: "SynapseRequest") -> tuple[int, Any]:
557
+ callback, servlet_classname, group_dict = self._get_handler_for_request(request)
558
+
559
+ request.is_render_cancellable = is_function_cancellable(callback)
560
+
561
+ # Make sure we have an appropriate name for this handler in prometheus
562
+ # (rather than the default of JsonResource).
563
+ request.request_metrics.name = servlet_classname
564
+
565
+ # Now trigger the callback. If it returns a response, we send it
566
+ # here. If it throws an exception, that is handled by the wrapper
567
+ # installed by @request_handler.
568
+ kwargs = intern_dict(
569
+ {
570
+ name: urllib.parse.unquote(value) if value else value
571
+ for name, value in group_dict.items()
572
+ }
573
+ )
574
+
575
+ raw_callback_return = callback(request, **kwargs)
576
+
577
+ # Is it synchronous? We'll allow this for now.
578
+ if isinstance(raw_callback_return, (defer.Deferred, types.CoroutineType)):
579
+ callback_return = await raw_callback_return
580
+ else:
581
+ callback_return = raw_callback_return
582
+
583
+ return callback_return
584
+
585
+ def _send_error_response(
586
+ self,
587
+ f: failure.Failure,
588
+ request: "SynapseRequest",
589
+ ) -> None:
590
+ """Implements _AsyncResource._send_error_response"""
591
+ return_json_error(f, request, self.hs.config)
592
+
593
+
594
+ class DirectServeHtmlResource(_AsyncResource):
595
+ """A resource that will call `self._async_on_<METHOD>` on new requests,
596
+ formatting responses and errors as HTML.
597
+ """
598
+
599
+ # The error template to use for this resource
600
+ ERROR_TEMPLATE = HTML_ERROR_TEMPLATE
601
+
602
+ def __init__(
603
+ self,
604
+ extract_context: bool = False,
605
+ # Clock is optional as this class is exposed to the module API.
606
+ clock: Optional[Clock] = None,
607
+ ):
608
+ """
609
+ Args:
610
+ extract_context: TODO
611
+ clock: This is expected to be passed in by any Synapse code.
612
+ Only optional for the Module API.
613
+ """
614
+ if clock is None:
615
+ # Ideally we wouldn't ignore the linter error here and instead enforce a
616
+ # required `Clock` be passed into the `__init__` function.
617
+ # However, this would change the function signature which is currently being
618
+ # exported to the module api. Since we don't want to break that api, we have
619
+ # to settle with ignoring the linter error here.
620
+ # As of the time of writing this, all Synapse internal usages of
621
+ # `DirectServeHtmlResource` pass in the existing homeserver clock instance.
622
+ clock = Clock( # type: ignore[multiple-internal-clocks]
623
+ cast(ISynapseThreadlessReactor, reactor),
624
+ server_name="synapse_module_running_from_unknown_server",
625
+ )
626
+
627
+ super().__init__(clock, extract_context)
628
+
629
+ def _send_response(
630
+ self,
631
+ request: "SynapseRequest",
632
+ code: int,
633
+ response_object: Any,
634
+ ) -> None:
635
+ """Implements _AsyncResource._send_response"""
636
+ # We expect to get bytes for us to write
637
+ assert isinstance(response_object, bytes)
638
+ html_bytes = response_object
639
+
640
+ respond_with_html_bytes(request, code, html_bytes)
641
+
642
+ def _send_error_response(
643
+ self,
644
+ f: failure.Failure,
645
+ request: "SynapseRequest",
646
+ ) -> None:
647
+ """Implements _AsyncResource._send_error_response"""
648
+ return_html_error(f, request, self.ERROR_TEMPLATE)
649
+
650
+
651
+ class StaticResource(File):
652
+ """
653
+ A resource that represents a plain non-interpreted file or directory.
654
+
655
+ Differs from the File resource by adding clickjacking protection.
656
+ """
657
+
658
+ def render_GET(self, request: Request) -> bytes:
659
+ set_clickjacking_protection_headers(request)
660
+ return super().render_GET(request)
661
+
662
+ def directoryListing(self) -> IResource:
663
+ return notFound()
664
+
665
+
666
+ class UnrecognizedRequestResource(resource.Resource):
667
+ """
668
+ Similar to twisted.web.resource.NoResource, but returns a JSON 404 with an
669
+ errcode of M_UNRECOGNIZED.
670
+ """
671
+
672
+ def render(self, request: "SynapseRequest") -> int:
673
+ f = failure.Failure(UnrecognizedRequestError(code=404))
674
+ return_json_error(f, request, None)
675
+ # A response has already been sent but Twisted requires either NOT_DONE_YET
676
+ # or the response bytes as a return value.
677
+ return NOT_DONE_YET
678
+
679
+ def getChild(self, name: str, request: Request) -> resource.Resource:
680
+ return self
681
+
682
+
683
+ class RootRedirect(resource.Resource):
684
+ """Redirects the root '/' path to another path."""
685
+
686
+ def __init__(self, path: str):
687
+ super().__init__()
688
+ self.url = path
689
+
690
+ def render_GET(self, request: Request) -> bytes:
691
+ return redirectTo(self.url.encode("ascii"), request)
692
+
693
+ def getChild(self, name: str, request: Request) -> resource.Resource:
694
+ if len(name) == 0:
695
+ return self # select ourselves as the child to render
696
+ return super().getChild(name, request)
697
+
698
+
699
+ class OptionsResource(resource.Resource):
700
+ """Responds to OPTION requests for itself and all children."""
701
+
702
+ def render_OPTIONS(self, request: "SynapseRequest") -> bytes:
703
+ request.setResponseCode(204)
704
+ request.setHeader(b"Content-Length", b"0")
705
+
706
+ set_cors_headers(request)
707
+
708
+ return b""
709
+
710
+ def getChildWithDefault(self, path: str, request: Request) -> resource.Resource:
711
+ if request.method == b"OPTIONS":
712
+ return self # select ourselves as the child to render
713
+ return super().getChildWithDefault(path, request)
714
+
715
+
716
+ class RootOptionsRedirectResource(OptionsResource, RootRedirect):
717
+ pass
718
+
719
+
720
+ @implementer(interfaces.IPushProducer)
721
+ class _ByteProducer:
722
+ """
723
+ Iteratively write bytes to the request.
724
+ """
725
+
726
+ # The minimum number of bytes for each chunk. Note that the last chunk will
727
+ # usually be smaller than this.
728
+ min_chunk_size = 1024
729
+
730
+ def __init__(
731
+ self,
732
+ request: Request,
733
+ iterator: Iterator[bytes],
734
+ ):
735
+ self._request: Optional[Request] = request
736
+ self._iterator = iterator
737
+ self._paused = False
738
+ self.tracing_scope = start_active_span(
739
+ "write_bytes_to_request",
740
+ )
741
+ self.tracing_scope.__enter__()
742
+
743
+ try:
744
+ self._request.registerProducer(self, True)
745
+ except AttributeError as e:
746
+ # Calling self._request.registerProducer might raise an AttributeError since
747
+ # the underlying Twisted code calls self._request.channel.registerProducer,
748
+ # however self._request.channel will be None if the connection was lost.
749
+ logger.info("Connection disconnected before response was written: %r", e)
750
+
751
+ # We drop our references to data we'll not use.
752
+ self._iterator = iter(())
753
+ self.tracing_scope.__exit__(type(e), None, e.__traceback__)
754
+ else:
755
+ # Start producing if `registerProducer` was successful
756
+ self.resumeProducing()
757
+
758
+ def _send_data(self, data: list[bytes]) -> None:
759
+ """
760
+ Send a list of bytes as a chunk of a response.
761
+ """
762
+ if not data or not self._request:
763
+ return
764
+ self._request.write(b"".join(data))
765
+
766
+ def pauseProducing(self) -> None:
767
+ opentracing_span = active_span()
768
+ if opentracing_span is not None:
769
+ opentracing_span.log_kv({"event": "producer_paused"})
770
+ self._paused = True
771
+
772
+ def resumeProducing(self) -> None:
773
+ # We've stopped producing in the meantime (note that this might be
774
+ # re-entrant after calling write).
775
+ if not self._request:
776
+ return
777
+
778
+ self._paused = False
779
+
780
+ opentracing_span = active_span()
781
+ if opentracing_span is not None:
782
+ opentracing_span.log_kv({"event": "producer_resumed"})
783
+
784
+ # Write until there's backpressure telling us to stop.
785
+ while not self._paused:
786
+ # Get the next chunk and write it to the request.
787
+ #
788
+ # The output of the JSON encoder is buffered and coalesced until
789
+ # min_chunk_size is reached. This is because JSON encoders produce
790
+ # very small output per iteration and the Request object converts
791
+ # each call to write() to a separate chunk. Without this there would
792
+ # be an explosion in bytes written (e.g. b"{" becoming "1\r\n{\r\n").
793
+ #
794
+ # Note that buffer stores a list of bytes (instead of appending to
795
+ # bytes) to hopefully avoid many allocations.
796
+ buffer = []
797
+ buffered_bytes = 0
798
+ while buffered_bytes < self.min_chunk_size:
799
+ try:
800
+ data = next(self._iterator)
801
+ buffer.append(data)
802
+ buffered_bytes += len(data)
803
+ except StopIteration:
804
+ # The entire JSON object has been serialized, write any
805
+ # remaining data, finalize the producer and the request, and
806
+ # clean-up any references.
807
+ self._send_data(buffer)
808
+ self._request.unregisterProducer()
809
+ self._request.finish()
810
+ self.stopProducing()
811
+ return
812
+
813
+ self._send_data(buffer)
814
+
815
+ def stopProducing(self) -> None:
816
+ # Clear a circular reference.
817
+ self._request = None
818
+ self.tracing_scope.__exit__(None, None, None)
819
+
820
+
821
+ def _encode_json_bytes(json_object: object) -> bytes:
822
+ """
823
+ Encode an object into JSON. Returns an iterator of bytes.
824
+ """
825
+ return json_encoder.encode(json_object).encode("utf-8")
826
+
827
+
828
+ def respond_with_json(
829
+ request: "SynapseRequest",
830
+ code: int,
831
+ json_object: Any,
832
+ send_cors: bool = False,
833
+ canonical_json: bool = True,
834
+ ) -> Optional[int]:
835
+ """Sends encoded JSON in response to the given request.
836
+
837
+ Args:
838
+ request: The http request to respond to.
839
+ code: The HTTP response code.
840
+ json_object: The object to serialize to JSON.
841
+ send_cors: Whether to send Cross-Origin Resource Sharing headers
842
+ https://fetch.spec.whatwg.org/#http-cors-protocol
843
+ canonical_json: Whether to use the canonicaljson algorithm when encoding
844
+ the JSON bytes.
845
+
846
+ Returns:
847
+ twisted.web.server.NOT_DONE_YET if the request is still active.
848
+ """
849
+ # The response code must always be set, for logging purposes.
850
+ request.setResponseCode(code)
851
+
852
+ # could alternatively use request.notifyFinish() and flip a flag when
853
+ # the Deferred fires, but since the flag is RIGHT THERE it seems like
854
+ # a waste.
855
+ if request._disconnected:
856
+ logger.warning(
857
+ "Not sending response to request %s, already disconnected.", request
858
+ )
859
+ return None
860
+
861
+ if canonical_json:
862
+ encoder: Callable[[object], bytes] = encode_canonical_json
863
+ else:
864
+ encoder = _encode_json_bytes
865
+
866
+ request.setHeader(b"Content-Type", b"application/json")
867
+ request.setHeader(b"Cache-Control", b"no-cache, no-store, must-revalidate")
868
+
869
+ if send_cors:
870
+ set_cors_headers(request)
871
+
872
+ run_in_background(
873
+ _async_write_json_to_request_in_thread, request, encoder, json_object
874
+ )
875
+ return NOT_DONE_YET
876
+
877
+
878
+ def respond_with_json_bytes(
879
+ request: "SynapseRequest",
880
+ code: int,
881
+ json_bytes: bytes,
882
+ send_cors: bool = False,
883
+ ) -> Optional[int]:
884
+ """Sends encoded JSON in response to the given request.
885
+
886
+ Args:
887
+ request: The http request to respond to.
888
+ code: The HTTP response code.
889
+ json_bytes: The json bytes to use as the response body.
890
+ send_cors: Whether to send Cross-Origin Resource Sharing headers
891
+ https://fetch.spec.whatwg.org/#http-cors-protocol
892
+
893
+ Returns:
894
+ twisted.web.server.NOT_DONE_YET if the request is still active.
895
+ """
896
+ # The response code must always be set, for logging purposes.
897
+ request.setResponseCode(code)
898
+
899
+ if request._disconnected:
900
+ logger.warning(
901
+ "Not sending response to request %s, already disconnected.", request
902
+ )
903
+ return None
904
+
905
+ request.setHeader(b"Content-Type", b"application/json")
906
+ request.setHeader(b"Content-Length", b"%d" % (len(json_bytes),))
907
+ request.setHeader(b"Cache-Control", b"no-cache, no-store, must-revalidate")
908
+
909
+ if send_cors:
910
+ set_cors_headers(request)
911
+
912
+ _write_bytes_to_request(request, json_bytes)
913
+ return NOT_DONE_YET
914
+
915
+
916
+ async def _async_write_json_to_request_in_thread(
917
+ request: "SynapseRequest",
918
+ json_encoder: Callable[[Any], bytes],
919
+ json_object: Any,
920
+ ) -> None:
921
+ """Encodes the given JSON object on a thread and then writes it to the
922
+ request.
923
+
924
+ This is done so that encoding large JSON objects doesn't block the reactor
925
+ thread.
926
+
927
+ Note: We don't use JsonEncoder.iterencode here as that falls back to the
928
+ Python implementation (rather than the C backend), which is *much* more
929
+ expensive.
930
+ """
931
+
932
+ def encode(opentracing_span: "Optional[opentracing.Span]") -> bytes:
933
+ # it might take a while for the threadpool to schedule us, so we write
934
+ # opentracing logs once we actually get scheduled, so that we can see how
935
+ # much that contributed.
936
+ if opentracing_span:
937
+ opentracing_span.log_kv({"event": "scheduled"})
938
+ res = json_encoder(json_object)
939
+ if opentracing_span:
940
+ opentracing_span.log_kv({"event": "encoded"})
941
+ return res
942
+
943
+ with start_active_span("encode_json_response"):
944
+ span = active_span()
945
+ json_str = await defer_to_thread(request.reactor, encode, span)
946
+
947
+ _write_bytes_to_request(request, json_str)
948
+
949
+
950
+ def _write_bytes_to_request(request: Request, bytes_to_write: bytes) -> None:
951
+ """Writes the bytes to the request using an appropriate producer.
952
+
953
+ Note: This should be used instead of `Request.write` to correctly handle
954
+ large response bodies.
955
+ """
956
+
957
+ # The problem with dumping all of the response into the `Request` object at
958
+ # once (via `Request.write`) is that doing so starts the timeout for the
959
+ # next request to be received: so if it takes longer than 60s to stream back
960
+ # the response to the client, the client never gets it.
961
+ # c.f https://github.com/twisted/twisted/issues/12498
962
+ #
963
+ # One workaround is to use a `Producer`; then the timeout is only
964
+ # started once all of the content is sent over the TCP connection.
965
+
966
+ # To make sure we don't write all of the bytes at once we split it up into
967
+ # chunks.
968
+ chunk_size = 4096
969
+ bytes_generator = chunk_seq(bytes_to_write, chunk_size)
970
+
971
+ # We use a `_ByteProducer` here rather than `NoRangeStaticProducer` as the
972
+ # unit tests can't cope with being given a pull producer.
973
+ _ByteProducer(request, bytes_generator)
974
+
975
+
976
+ def set_cors_headers(request: "SynapseRequest") -> None:
977
+ """Set the CORS headers so that javascript running in a web browsers can
978
+ use this API
979
+
980
+ Args:
981
+ request: The http request to add CORS to.
982
+ """
983
+ request.setHeader(b"Access-Control-Allow-Origin", b"*")
984
+ request.setHeader(
985
+ b"Access-Control-Allow-Methods", b"GET, HEAD, POST, PUT, DELETE, OPTIONS"
986
+ )
987
+ if request.path is not None and (
988
+ request.path == b"/_matrix/client/unstable/org.matrix.msc4108/rendezvous"
989
+ or request.path.startswith(b"/_synapse/client/rendezvous")
990
+ ):
991
+ request.setHeader(
992
+ b"Access-Control-Allow-Headers",
993
+ b"Content-Type, If-Match, If-None-Match",
994
+ )
995
+ request.setHeader(
996
+ b"Access-Control-Expose-Headers",
997
+ b"Synapse-Trace-Id, Server, ETag",
998
+ )
999
+ else:
1000
+ request.setHeader(
1001
+ b"Access-Control-Allow-Headers",
1002
+ b"X-Requested-With, Content-Type, Authorization, Date",
1003
+ )
1004
+ request.setHeader(
1005
+ b"Access-Control-Expose-Headers",
1006
+ b"Synapse-Trace-Id, Server",
1007
+ )
1008
+
1009
+
1010
+ def set_corp_headers(request: Request) -> None:
1011
+ """Set the CORP headers so that javascript running in a web browsers can
1012
+ embed the resource returned from this request when their client requires
1013
+ the `Cross-Origin-Embedder-Policy: require-corp` header.
1014
+
1015
+ Args:
1016
+ request: The http request to add the CORP header to.
1017
+ """
1018
+ request.setHeader(b"Cross-Origin-Resource-Policy", b"cross-origin")
1019
+
1020
+
1021
+ def respond_with_html(request: Request, code: int, html: str) -> None:
1022
+ """
1023
+ Wraps `respond_with_html_bytes` by first encoding HTML from a str to UTF-8 bytes.
1024
+ """
1025
+ respond_with_html_bytes(request, code, html.encode("utf-8"))
1026
+
1027
+
1028
+ def respond_with_html_bytes(request: Request, code: int, html_bytes: bytes) -> None:
1029
+ """
1030
+ Sends HTML (encoded as UTF-8 bytes) as the response to the given request.
1031
+
1032
+ Note that this adds clickjacking protection headers and finishes the request.
1033
+
1034
+ Args:
1035
+ request: The http request to respond to.
1036
+ code: The HTTP response code.
1037
+ html_bytes: The HTML bytes to use as the response body.
1038
+ """
1039
+ # The response code must always be set, for logging purposes.
1040
+ request.setResponseCode(code)
1041
+
1042
+ # could alternatively use request.notifyFinish() and flip a flag when
1043
+ # the Deferred fires, but since the flag is RIGHT THERE it seems like
1044
+ # a waste.
1045
+ if request._disconnected:
1046
+ logger.warning(
1047
+ "Not sending response to request %s, already disconnected.", request
1048
+ )
1049
+ return None
1050
+
1051
+ request.setHeader(b"Content-Type", b"text/html; charset=utf-8")
1052
+ request.setHeader(b"Content-Length", b"%d" % (len(html_bytes),))
1053
+
1054
+ # Ensure this content cannot be embedded.
1055
+ set_clickjacking_protection_headers(request)
1056
+
1057
+ request.write(html_bytes)
1058
+ finish_request(request)
1059
+
1060
+
1061
+ def set_clickjacking_protection_headers(request: Request) -> None:
1062
+ """
1063
+ Set headers to guard against clickjacking of embedded content.
1064
+
1065
+ This sets the X-Frame-Options and Content-Security-Policy headers which instructs
1066
+ browsers to not allow the HTML of the response to be embedded onto another
1067
+ page.
1068
+
1069
+ Args:
1070
+ request: The http request to add the headers to.
1071
+ """
1072
+ request.setHeader(b"X-Frame-Options", b"DENY")
1073
+ request.setHeader(b"Content-Security-Policy", b"frame-ancestors 'none';")
1074
+
1075
+
1076
+ def respond_with_redirect(
1077
+ request: "SynapseRequest", url: bytes, statusCode: int = FOUND, cors: bool = False
1078
+ ) -> None:
1079
+ """
1080
+ Write a 302 (or other specified status code) response to the request, if it is still alive.
1081
+
1082
+ Args:
1083
+ request: The http request to respond to.
1084
+ url: The URL to redirect to.
1085
+ statusCode: The HTTP status code to use for the redirect (defaults to 302).
1086
+ cors: Whether to set CORS headers on the response.
1087
+ """
1088
+ logger.debug("Redirect to %s", url.decode("utf-8"))
1089
+
1090
+ if cors:
1091
+ set_cors_headers(request)
1092
+
1093
+ request.setResponseCode(statusCode)
1094
+ request.setHeader(b"location", url)
1095
+ finish_request(request)
1096
+
1097
+
1098
+ def finish_request(request: Request) -> None:
1099
+ """Finish writing the response to the request.
1100
+
1101
+ Twisted throws a RuntimeException if the connection closed before the
1102
+ response was written but doesn't provide a convenient or reliable way to
1103
+ determine if the connection was closed. So we catch and log the RuntimeException
1104
+
1105
+ You might think that ``request.notifyFinish`` could be used to tell if the
1106
+ request was finished. However the deferred it returns won't fire if the
1107
+ connection was already closed, meaning we'd have to have called the method
1108
+ right at the start of the request. By the time we want to write the response
1109
+ it will already be too late.
1110
+ """
1111
+ try:
1112
+ request.finish()
1113
+ except RuntimeError as e:
1114
+ logger.info("Connection disconnected before response was written: %r", e)