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
@@ -0,0 +1,1201 @@
1
+ #
2
+ # This file is licensed under the Affero General Public License (AGPL) version 3.
3
+ #
4
+ # Copyright 2020 Sorunome
5
+ # Copyright 2014-2022 The Matrix.org Foundation C.I.C.
6
+ # Copyright (C) 2023 New Vector, Ltd
7
+ #
8
+ # This program is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU Affero General Public License as
10
+ # published by the Free Software Foundation, either version 3 of the
11
+ # License, or (at your option) any later version.
12
+ #
13
+ # See the GNU Affero General Public License for more details:
14
+ # <https://www.gnu.org/licenses/agpl-3.0.html>.
15
+ #
16
+ # Originally licensed under the Apache License, Version 2.0:
17
+ # <http://www.apache.org/licenses/LICENSE-2.0>.
18
+ #
19
+ # [This file includes modifications made by New Vector Limited]
20
+ #
21
+ #
22
+
23
+ import logging
24
+ import urllib
25
+ from typing import (
26
+ TYPE_CHECKING,
27
+ Any,
28
+ BinaryIO,
29
+ Callable,
30
+ Collection,
31
+ Generator,
32
+ Iterable,
33
+ Mapping,
34
+ Optional,
35
+ Union,
36
+ )
37
+
38
+ import attr
39
+ import ijson
40
+
41
+ from synapse.api.constants import Direction, Membership
42
+ from synapse.api.errors import Codes, HttpResponseException, SynapseError
43
+ from synapse.api.ratelimiting import Ratelimiter
44
+ from synapse.api.room_versions import RoomVersion
45
+ from synapse.api.urls import (
46
+ FEDERATION_UNSTABLE_PREFIX,
47
+ FEDERATION_V1_PREFIX,
48
+ FEDERATION_V2_PREFIX,
49
+ )
50
+ from synapse.events import EventBase, make_event_from_dict
51
+ from synapse.federation.units import Transaction
52
+ from synapse.http.matrixfederationclient import ByteParser, LegacyJsonSendParser
53
+ from synapse.http.types import QueryParams
54
+ from synapse.types import JsonDict, UserID
55
+ from synapse.util import ExceptionBundle
56
+
57
+ if TYPE_CHECKING:
58
+ from synapse.app.homeserver import HomeServer
59
+
60
+ logger = logging.getLogger(__name__)
61
+
62
+
63
+ class TransportLayerClient:
64
+ """Sends federation HTTP requests to other servers"""
65
+
66
+ def __init__(self, hs: "HomeServer"):
67
+ self.client = hs.get_federation_http_client()
68
+ self._is_mine_server_name = hs.is_mine_server_name
69
+
70
+ def shutdown(self) -> None:
71
+ self.client.shutdown()
72
+
73
+ async def get_room_state_ids(
74
+ self, destination: str, room_id: str, event_id: str
75
+ ) -> JsonDict:
76
+ """Requests the IDs of all state for a given room at the given event.
77
+
78
+ Args:
79
+ destination: The host name of the remote homeserver we want
80
+ to get the state from.
81
+ room_id: the room we want the state of
82
+ event_id: The event we want the context at.
83
+
84
+ Returns:
85
+ Results in a dict received from the remote homeserver.
86
+ """
87
+ logger.debug("get_room_state_ids dest=%s, room=%s", destination, room_id)
88
+
89
+ path = _create_v1_path("/state_ids/%s", room_id)
90
+ return await self.client.get_json(
91
+ destination,
92
+ path=path,
93
+ args={"event_id": event_id},
94
+ try_trailing_slash_on_400=True,
95
+ )
96
+
97
+ async def get_room_state(
98
+ self, room_version: RoomVersion, destination: str, room_id: str, event_id: str
99
+ ) -> "StateRequestResponse":
100
+ """Requests the full state for a given room at the given event.
101
+
102
+ Args:
103
+ room_version: the version of the room (required to build the event objects)
104
+ destination: The host name of the remote homeserver we want
105
+ to get the state from.
106
+ room_id: the room we want the state of
107
+ event_id: The event we want the context at.
108
+
109
+ Returns:
110
+ Results in a dict received from the remote homeserver.
111
+ """
112
+ path = _create_v1_path("/state/%s", room_id)
113
+ return await self.client.get_json(
114
+ destination,
115
+ path=path,
116
+ args={"event_id": event_id},
117
+ # This can take a looooooong time for large rooms. Give this a generous
118
+ # timeout of 10 minutes to avoid the partial state resync timing out early
119
+ # and trying a bunch of servers who haven't seen our join yet.
120
+ timeout=600_000,
121
+ parser=_StateParser(room_version),
122
+ )
123
+
124
+ async def get_event(
125
+ self, destination: str, event_id: str, timeout: Optional[int] = None
126
+ ) -> JsonDict:
127
+ """Requests the pdu with give id and origin from the given server.
128
+
129
+ Args:
130
+ destination: The host name of the remote homeserver we want
131
+ to get the state from.
132
+ event_id: The id of the event being requested.
133
+ timeout: How long to try (in ms) the destination for before
134
+ giving up. None indicates no timeout.
135
+
136
+ Returns:
137
+ Results in a dict received from the remote homeserver.
138
+ """
139
+ logger.debug("get_pdu dest=%s, event_id=%s", destination, event_id)
140
+
141
+ path = _create_v1_path("/event/%s", event_id)
142
+ return await self.client.get_json(
143
+ destination, path=path, timeout=timeout, try_trailing_slash_on_400=True
144
+ )
145
+
146
+ async def get_policy_recommendation_for_pdu(
147
+ self, destination: str, event: EventBase, timeout: Optional[int] = None
148
+ ) -> JsonDict:
149
+ """Requests the policy recommendation for the given pdu from the given policy server.
150
+
151
+ Args:
152
+ destination: The host name of the remote homeserver checking the event.
153
+ event: The event to check.
154
+ timeout: How long to try (in ms) the destination for before giving up.
155
+ None indicates no timeout.
156
+
157
+ Returns:
158
+ The full recommendation object from the remote server.
159
+ """
160
+ logger.debug(
161
+ "get_policy_recommendation_for_pdu dest=%s, event_id=%s",
162
+ destination,
163
+ event.event_id,
164
+ )
165
+ return await self.client.post_json(
166
+ destination=destination,
167
+ path=f"/_matrix/policy/unstable/org.matrix.msc4284/event/{event.event_id}/check",
168
+ data=event.get_pdu_json(),
169
+ ignore_backoff=True,
170
+ timeout=timeout,
171
+ )
172
+
173
+ async def ask_policy_server_to_sign_event(
174
+ self, destination: str, event: EventBase, timeout: Optional[int] = None
175
+ ) -> JsonDict:
176
+ """Requests that the destination server (typically a policy server)
177
+ sign the event as not spam.
178
+
179
+ If the policy server could not be contacted or the policy server
180
+ returned an error, this raises that error.
181
+
182
+ Args:
183
+ destination: The host name of the policy server / homeserver.
184
+ event: The event to sign.
185
+ timeout: How long to try (in ms) the destination for before giving up.
186
+ None indicates no timeout.
187
+ Returns:
188
+ The signature from the policy server, structured in the same was as the 'signatures'
189
+ JSON in the event e.g { "$policy_server_via_domain" : { "ed25519:policy_server": "signature_base64" }}
190
+ """
191
+ return await self.client.post_json(
192
+ destination=destination,
193
+ path="/_matrix/policy/unstable/org.matrix.msc4284/sign",
194
+ data=event.get_pdu_json(),
195
+ ignore_backoff=True,
196
+ timeout=timeout,
197
+ )
198
+
199
+ async def backfill(
200
+ self, destination: str, room_id: str, event_tuples: Collection[str], limit: int
201
+ ) -> Optional[Union[JsonDict, list]]:
202
+ """Requests `limit` previous PDUs in a given context before list of
203
+ PDUs.
204
+
205
+ Args:
206
+ destination
207
+ room_id
208
+ event_tuples:
209
+ Must be a Collection that is falsy when empty.
210
+ (Iterable is not enough here!)
211
+ limit
212
+
213
+ Returns:
214
+ Results in a dict received from the remote homeserver.
215
+ """
216
+ logger.debug(
217
+ "backfill dest=%s, room_id=%s, event_tuples=%r, limit=%s",
218
+ destination,
219
+ room_id,
220
+ event_tuples,
221
+ str(limit),
222
+ )
223
+
224
+ if not event_tuples:
225
+ # TODO: raise?
226
+ return None
227
+
228
+ path = _create_v1_path("/backfill/%s", room_id)
229
+
230
+ args = {"v": event_tuples, "limit": [str(limit)]}
231
+
232
+ return await self.client.get_json(
233
+ destination, path=path, args=args, try_trailing_slash_on_400=True
234
+ )
235
+
236
+ async def timestamp_to_event(
237
+ self, destination: str, room_id: str, timestamp: int, direction: Direction
238
+ ) -> Union[JsonDict, list]:
239
+ """
240
+ Calls a remote federating server at `destination` asking for their
241
+ closest event to the given timestamp in the given direction.
242
+
243
+ Args:
244
+ destination: Domain name of the remote homeserver
245
+ room_id: Room to fetch the event from
246
+ timestamp: The point in time (inclusive) we should navigate from in
247
+ the given direction to find the closest event.
248
+ direction: indicates whether we should navigate forward
249
+ or backward from the given timestamp to find the closest event.
250
+
251
+ Returns:
252
+ Response dict received from the remote homeserver.
253
+
254
+ Raises:
255
+ Various exceptions when the request fails
256
+ """
257
+ path = _create_v1_path(
258
+ "/timestamp_to_event/%s",
259
+ room_id,
260
+ )
261
+
262
+ args = {"ts": [str(timestamp)], "dir": [direction.value]}
263
+
264
+ remote_response = await self.client.get_json(
265
+ destination, path=path, args=args, try_trailing_slash_on_400=True
266
+ )
267
+
268
+ return remote_response
269
+
270
+ async def send_transaction(
271
+ self,
272
+ transaction: Transaction,
273
+ json_data_callback: Optional[Callable[[], JsonDict]] = None,
274
+ ) -> JsonDict:
275
+ """Sends the given Transaction to its destination
276
+
277
+ Args:
278
+ transaction
279
+
280
+ Returns:
281
+ Succeeds when we get a 2xx HTTP response. The result
282
+ will be the decoded JSON body.
283
+
284
+ Fails with ``HTTPRequestException`` if we get an HTTP response
285
+ code >= 300.
286
+
287
+ Fails with ``NotRetryingDestination`` if we are not yet ready
288
+ to retry this server.
289
+
290
+ Fails with ``FederationDeniedError`` if this destination
291
+ is not on our federation whitelist
292
+ """
293
+ logger.debug(
294
+ "send_data dest=%s, txid=%s",
295
+ transaction.destination,
296
+ transaction.transaction_id,
297
+ )
298
+
299
+ if self._is_mine_server_name(transaction.destination):
300
+ raise RuntimeError("Transport layer cannot send to itself!")
301
+
302
+ # FIXME: This is only used by the tests. The actual json sent is
303
+ # generated by the json_data_callback.
304
+ json_data = transaction.get_dict()
305
+
306
+ path = _create_v1_path("/send/%s", transaction.transaction_id)
307
+
308
+ return await self.client.put_json(
309
+ transaction.destination,
310
+ path=path,
311
+ data=json_data,
312
+ json_data_callback=json_data_callback,
313
+ long_retries=True,
314
+ try_trailing_slash_on_400=True,
315
+ # Sending a transaction should always succeed, if it doesn't
316
+ # then something is wrong and we should backoff.
317
+ backoff_on_all_error_codes=True,
318
+ )
319
+
320
+ async def make_query(
321
+ self,
322
+ destination: str,
323
+ query_type: str,
324
+ args: QueryParams,
325
+ retry_on_dns_fail: bool,
326
+ ignore_backoff: bool = False,
327
+ prefix: str = FEDERATION_V1_PREFIX,
328
+ ) -> JsonDict:
329
+ path = _create_path(prefix, "/query/%s", query_type)
330
+
331
+ return await self.client.get_json(
332
+ destination=destination,
333
+ path=path,
334
+ args=args,
335
+ retry_on_dns_fail=retry_on_dns_fail,
336
+ timeout=10000,
337
+ ignore_backoff=ignore_backoff,
338
+ )
339
+
340
+ async def make_membership_event(
341
+ self,
342
+ destination: str,
343
+ room_id: str,
344
+ user_id: str,
345
+ membership: str,
346
+ params: Optional[Mapping[str, Union[str, Iterable[str]]]],
347
+ ) -> JsonDict:
348
+ """Asks a remote server to build and sign us a membership event
349
+
350
+ Note that this does not append any events to any graphs.
351
+
352
+ Args:
353
+ destination: address of remote homeserver
354
+ room_id: room to join/leave
355
+ user_id: user to be joined/left
356
+ membership: one of join/leave
357
+ params: Query parameters to include in the request.
358
+
359
+ Returns:
360
+ Succeeds when we get a 2xx HTTP response. The result
361
+ will be the decoded JSON body (ie, the new event).
362
+
363
+ Fails with ``HTTPRequestException`` if we get an HTTP response
364
+ code >= 300.
365
+
366
+ Fails with ``NotRetryingDestination`` if we are not yet ready
367
+ to retry this server.
368
+
369
+ Fails with ``FederationDeniedError`` if the remote destination
370
+ is not in our federation whitelist
371
+ """
372
+ valid_memberships = {Membership.JOIN, Membership.LEAVE, Membership.KNOCK}
373
+
374
+ if membership not in valid_memberships:
375
+ raise RuntimeError(
376
+ "make_membership_event called with membership='%s', must be one of %s"
377
+ % (membership, ",".join(valid_memberships))
378
+ )
379
+ path = _create_v1_path("/make_%s/%s/%s", membership, room_id, user_id)
380
+
381
+ ignore_backoff = False
382
+ retry_on_dns_fail = False
383
+
384
+ if membership == Membership.LEAVE:
385
+ # we particularly want to do our best to send leave events. The
386
+ # problem is that if it fails, we won't retry it later, so if the
387
+ # remote server was just having a momentary blip, the room will be
388
+ # out of sync.
389
+ ignore_backoff = True
390
+ retry_on_dns_fail = True
391
+
392
+ return await self.client.get_json(
393
+ destination=destination,
394
+ path=path,
395
+ args=params,
396
+ retry_on_dns_fail=retry_on_dns_fail,
397
+ timeout=20000,
398
+ ignore_backoff=ignore_backoff,
399
+ )
400
+
401
+ async def send_join_v1(
402
+ self,
403
+ room_version: RoomVersion,
404
+ destination: str,
405
+ room_id: str,
406
+ event_id: str,
407
+ content: JsonDict,
408
+ ) -> "SendJoinResponse":
409
+ path = _create_v1_path("/send_join/%s/%s", room_id, event_id)
410
+
411
+ return await self.client.put_json(
412
+ destination=destination,
413
+ path=path,
414
+ data=content,
415
+ parser=SendJoinParser(room_version, v1_api=True),
416
+ )
417
+
418
+ async def send_join_v2(
419
+ self,
420
+ room_version: RoomVersion,
421
+ destination: str,
422
+ room_id: str,
423
+ event_id: str,
424
+ content: JsonDict,
425
+ omit_members: bool,
426
+ ) -> "SendJoinResponse":
427
+ path = _create_v2_path("/send_join/%s/%s", room_id, event_id)
428
+ query_params: dict[str, str] = {}
429
+ # lazy-load state on join
430
+ query_params["omit_members"] = "true" if omit_members else "false"
431
+
432
+ return await self.client.put_json(
433
+ destination=destination,
434
+ path=path,
435
+ args=query_params,
436
+ data=content,
437
+ parser=SendJoinParser(room_version, v1_api=False),
438
+ )
439
+
440
+ async def send_leave_v1(
441
+ self, destination: str, room_id: str, event_id: str, content: JsonDict
442
+ ) -> tuple[int, JsonDict]:
443
+ path = _create_v1_path("/send_leave/%s/%s", room_id, event_id)
444
+
445
+ return await self.client.put_json(
446
+ destination=destination,
447
+ path=path,
448
+ data=content,
449
+ # we want to do our best to send this through. The problem is
450
+ # that if it fails, we won't retry it later, so if the remote
451
+ # server was just having a momentary blip, the room will be out of
452
+ # sync.
453
+ ignore_backoff=True,
454
+ parser=LegacyJsonSendParser(),
455
+ )
456
+
457
+ async def send_leave_v2(
458
+ self, destination: str, room_id: str, event_id: str, content: JsonDict
459
+ ) -> JsonDict:
460
+ path = _create_v2_path("/send_leave/%s/%s", room_id, event_id)
461
+
462
+ return await self.client.put_json(
463
+ destination=destination,
464
+ path=path,
465
+ data=content,
466
+ # we want to do our best to send this through. The problem is
467
+ # that if it fails, we won't retry it later, so if the remote
468
+ # server was just having a momentary blip, the room will be out of
469
+ # sync.
470
+ ignore_backoff=True,
471
+ )
472
+
473
+ async def send_knock_v1(
474
+ self,
475
+ destination: str,
476
+ room_id: str,
477
+ event_id: str,
478
+ content: JsonDict,
479
+ ) -> JsonDict:
480
+ """
481
+ Sends a signed knock membership event to a remote server. This is the second
482
+ step for knocking after make_knock.
483
+
484
+ Args:
485
+ destination: The remote homeserver.
486
+ room_id: The ID of the room to knock on.
487
+ event_id: The ID of the knock membership event that we're sending.
488
+ content: The knock membership event that we're sending. Note that this is not the
489
+ `content` field of the membership event, but the entire signed membership event
490
+ itself represented as a JSON dict.
491
+
492
+ Returns:
493
+ The remote homeserver can optionally return some state from the room. The response
494
+ dictionary is in the form:
495
+
496
+ {"knock_room_state": [<state event dict>, ...]}
497
+
498
+ The list of state events may be empty.
499
+ """
500
+ path = _create_v1_path("/send_knock/%s/%s", room_id, event_id)
501
+
502
+ return await self.client.put_json(
503
+ destination=destination, path=path, data=content
504
+ )
505
+
506
+ async def send_invite_v1(
507
+ self, destination: str, room_id: str, event_id: str, content: JsonDict
508
+ ) -> tuple[int, JsonDict]:
509
+ path = _create_v1_path("/invite/%s/%s", room_id, event_id)
510
+
511
+ return await self.client.put_json(
512
+ destination=destination,
513
+ path=path,
514
+ data=content,
515
+ ignore_backoff=True,
516
+ parser=LegacyJsonSendParser(),
517
+ )
518
+
519
+ async def send_invite_v2(
520
+ self, destination: str, room_id: str, event_id: str, content: JsonDict
521
+ ) -> JsonDict:
522
+ path = _create_v2_path("/invite/%s/%s", room_id, event_id)
523
+
524
+ return await self.client.put_json(
525
+ destination=destination, path=path, data=content, ignore_backoff=True
526
+ )
527
+
528
+ async def get_public_rooms(
529
+ self,
530
+ remote_server: str,
531
+ limit: Optional[int] = None,
532
+ since_token: Optional[str] = None,
533
+ search_filter: Optional[dict] = None,
534
+ include_all_networks: bool = False,
535
+ third_party_instance_id: Optional[str] = None,
536
+ ) -> JsonDict:
537
+ """Get the list of public rooms from a remote homeserver
538
+
539
+ See synapse.federation.federation_client.FederationClient.get_public_rooms for
540
+ more information.
541
+ """
542
+ path = _create_v1_path("/publicRooms")
543
+
544
+ if search_filter:
545
+ # this uses MSC2197 (Search Filtering over Federation)
546
+ data: dict[str, Any] = {"include_all_networks": include_all_networks}
547
+ if third_party_instance_id:
548
+ data["third_party_instance_id"] = third_party_instance_id
549
+ if limit:
550
+ data["limit"] = limit
551
+ if since_token:
552
+ data["since"] = since_token
553
+
554
+ data["filter"] = search_filter
555
+
556
+ try:
557
+ response = await self.client.post_json(
558
+ destination=remote_server, path=path, data=data, ignore_backoff=True
559
+ )
560
+ except HttpResponseException as e:
561
+ if e.code == 403:
562
+ raise SynapseError(
563
+ 403,
564
+ "You are not allowed to view the public rooms list of %s"
565
+ % (remote_server,),
566
+ errcode=Codes.FORBIDDEN,
567
+ )
568
+ raise
569
+ else:
570
+ args: dict[str, Union[str, Iterable[str]]] = {
571
+ "include_all_networks": "true" if include_all_networks else "false"
572
+ }
573
+ if third_party_instance_id:
574
+ args["third_party_instance_id"] = third_party_instance_id
575
+ if limit:
576
+ args["limit"] = str(limit)
577
+ if since_token:
578
+ args["since"] = since_token
579
+
580
+ try:
581
+ response = await self.client.get_json(
582
+ destination=remote_server, path=path, args=args, ignore_backoff=True
583
+ )
584
+ except HttpResponseException as e:
585
+ if e.code == 403:
586
+ raise SynapseError(
587
+ 403,
588
+ "You are not allowed to view the public rooms list of %s"
589
+ % (remote_server,),
590
+ errcode=Codes.FORBIDDEN,
591
+ )
592
+ raise
593
+
594
+ return response
595
+
596
+ async def exchange_third_party_invite(
597
+ self, destination: str, room_id: str, event_dict: JsonDict
598
+ ) -> JsonDict:
599
+ path = _create_v1_path("/exchange_third_party_invite/%s", room_id)
600
+
601
+ return await self.client.put_json(
602
+ destination=destination, path=path, data=event_dict
603
+ )
604
+
605
+ async def get_event_auth(
606
+ self, destination: str, room_id: str, event_id: str
607
+ ) -> JsonDict:
608
+ path = _create_v1_path("/event_auth/%s/%s", room_id, event_id)
609
+
610
+ return await self.client.get_json(destination=destination, path=path)
611
+
612
+ async def query_client_keys(
613
+ self, destination: str, query_content: JsonDict, timeout: int
614
+ ) -> JsonDict:
615
+ """Query the device keys for a list of user ids hosted on a remote
616
+ server.
617
+
618
+ Request:
619
+ {
620
+ "device_keys": {
621
+ "<user_id>": ["<device_id>"]
622
+ }
623
+ }
624
+
625
+ Response:
626
+ {
627
+ "device_keys": {
628
+ "<user_id>": {
629
+ "<device_id>": {...}
630
+ }
631
+ },
632
+ "master_key": {
633
+ "<user_id>": {...}
634
+ }
635
+ },
636
+ "self_signing_key": {
637
+ "<user_id>": {...}
638
+ }
639
+ }
640
+
641
+ Args:
642
+ destination: The server to query.
643
+ query_content: The user ids to query.
644
+ Returns:
645
+ A dict containing device and cross-signing keys.
646
+ """
647
+ path = _create_v1_path("/user/keys/query")
648
+
649
+ return await self.client.post_json(
650
+ destination=destination, path=path, data=query_content, timeout=timeout
651
+ )
652
+
653
+ async def query_user_devices(
654
+ self, destination: str, user_id: str, timeout: int
655
+ ) -> JsonDict:
656
+ """Query the devices for a user id hosted on a remote server.
657
+
658
+ Response:
659
+ {
660
+ "stream_id": "...",
661
+ "devices": [ { ... } ],
662
+ "master_key": {
663
+ "user_id": "<user_id>",
664
+ "usage": [...],
665
+ "keys": {...},
666
+ "signatures": {
667
+ "<user_id>": {...}
668
+ }
669
+ },
670
+ "self_signing_key": {
671
+ "user_id": "<user_id>",
672
+ "usage": [...],
673
+ "keys": {...},
674
+ "signatures": {
675
+ "<user_id>": {...}
676
+ }
677
+ }
678
+ }
679
+
680
+ Args:
681
+ destination: The server to query.
682
+ query_content: The user ids to query.
683
+ Returns:
684
+ A dict containing device and cross-signing keys.
685
+ """
686
+ path = _create_v1_path("/user/devices/%s", user_id)
687
+
688
+ return await self.client.get_json(
689
+ destination=destination, path=path, timeout=timeout
690
+ )
691
+
692
+ async def claim_client_keys(
693
+ self,
694
+ user: UserID,
695
+ destination: str,
696
+ query_content: JsonDict,
697
+ timeout: Optional[int],
698
+ ) -> JsonDict:
699
+ """Claim one-time keys for a list of devices hosted on a remote server.
700
+
701
+ Request:
702
+ {
703
+ "one_time_keys": {
704
+ "<user_id>": {
705
+ "<device_id>": "<algorithm>"
706
+ }
707
+ }
708
+ }
709
+
710
+ Response:
711
+ {
712
+ "one_time_keys": {
713
+ "<user_id>": {
714
+ "<device_id>": {
715
+ "<algorithm>:<key_id>": <OTK JSON>
716
+ }
717
+ }
718
+ }
719
+ }
720
+
721
+ Args:
722
+ user: the user_id of the requesting user
723
+ destination: The server to query.
724
+ query_content: The user ids to query.
725
+ Returns:
726
+ A dict containing the one-time keys.
727
+ """
728
+
729
+ path = _create_v1_path("/user/keys/claim")
730
+
731
+ return await self.client.post_json(
732
+ destination=destination,
733
+ path=path,
734
+ data={"one_time_keys": query_content},
735
+ timeout=timeout,
736
+ )
737
+
738
+ async def claim_client_keys_unstable(
739
+ self,
740
+ user: UserID,
741
+ destination: str,
742
+ query_content: JsonDict,
743
+ timeout: Optional[int],
744
+ ) -> JsonDict:
745
+ """Claim one-time keys for a list of devices hosted on a remote server.
746
+
747
+ Request:
748
+ {
749
+ "one_time_keys": {
750
+ "<user_id>": {
751
+ "<device_id>": {"<algorithm>": <count>}
752
+ }
753
+ }
754
+ }
755
+
756
+ Response:
757
+ {
758
+ "one_time_keys": {
759
+ "<user_id>": {
760
+ "<device_id>": {
761
+ "<algorithm>:<key_id>": <OTK JSON>
762
+ }
763
+ }
764
+ }
765
+ }
766
+
767
+ Args:
768
+ user: the user_id of the requesting user
769
+ destination: The server to query.
770
+ query_content: The user ids to query.
771
+ Returns:
772
+ A dict containing the one-time keys.
773
+ """
774
+ path = _create_path(FEDERATION_UNSTABLE_PREFIX, "/user/keys/claim")
775
+
776
+ return await self.client.post_json(
777
+ destination=destination,
778
+ path=path,
779
+ data={"one_time_keys": query_content},
780
+ timeout=timeout,
781
+ )
782
+
783
+ async def get_missing_events(
784
+ self,
785
+ destination: str,
786
+ room_id: str,
787
+ earliest_events: Iterable[str],
788
+ latest_events: Iterable[str],
789
+ limit: int,
790
+ min_depth: int,
791
+ timeout: int,
792
+ ) -> JsonDict:
793
+ path = _create_v1_path("/get_missing_events/%s", room_id)
794
+
795
+ return await self.client.post_json(
796
+ destination=destination,
797
+ path=path,
798
+ data={
799
+ "limit": int(limit),
800
+ "min_depth": int(min_depth),
801
+ "earliest_events": earliest_events,
802
+ "latest_events": latest_events,
803
+ },
804
+ timeout=timeout,
805
+ )
806
+
807
+ async def get_room_complexity(self, destination: str, room_id: str) -> JsonDict:
808
+ """
809
+ Args:
810
+ destination: The remote server
811
+ room_id: The room ID to ask about.
812
+ """
813
+ path = _create_path(FEDERATION_UNSTABLE_PREFIX, "/rooms/%s/complexity", room_id)
814
+
815
+ return await self.client.get_json(destination=destination, path=path)
816
+
817
+ async def get_room_hierarchy(
818
+ self, destination: str, room_id: str, suggested_only: bool
819
+ ) -> JsonDict:
820
+ """
821
+ Args:
822
+ destination: The remote server
823
+ room_id: The room ID to ask about.
824
+ suggested_only: if True, only suggested rooms will be returned
825
+ """
826
+ path = _create_v1_path("/hierarchy/%s", room_id)
827
+
828
+ return await self.client.get_json(
829
+ destination=destination,
830
+ path=path,
831
+ args={"suggested_only": "true" if suggested_only else "false"},
832
+ )
833
+
834
+ async def get_room_hierarchy_unstable(
835
+ self, destination: str, room_id: str, suggested_only: bool
836
+ ) -> JsonDict:
837
+ """
838
+ Args:
839
+ destination: The remote server
840
+ room_id: The room ID to ask about.
841
+ suggested_only: if True, only suggested rooms will be returned
842
+ """
843
+ path = _create_path(
844
+ FEDERATION_UNSTABLE_PREFIX, "/org.matrix.msc2946/hierarchy/%s", room_id
845
+ )
846
+
847
+ return await self.client.get_json(
848
+ destination=destination,
849
+ path=path,
850
+ args={"suggested_only": "true" if suggested_only else "false"},
851
+ )
852
+
853
+ async def get_account_status(
854
+ self, destination: str, user_ids: list[str]
855
+ ) -> JsonDict:
856
+ """
857
+ Args:
858
+ destination: The remote server.
859
+ user_ids: The user ID(s) for which to request account status(es).
860
+ """
861
+ path = _create_path(
862
+ FEDERATION_UNSTABLE_PREFIX, "/org.matrix.msc3720/account_status"
863
+ )
864
+
865
+ return await self.client.post_json(
866
+ destination=destination, path=path, data={"user_ids": user_ids}
867
+ )
868
+
869
+ async def download_media_r0(
870
+ self,
871
+ destination: str,
872
+ media_id: str,
873
+ output_stream: BinaryIO,
874
+ max_size: int,
875
+ max_timeout_ms: int,
876
+ download_ratelimiter: Ratelimiter,
877
+ ip_address: str,
878
+ ) -> tuple[int, dict[bytes, list[bytes]]]:
879
+ path = f"/_matrix/media/r0/download/{destination}/{media_id}"
880
+ return await self.client.get_file(
881
+ destination,
882
+ path,
883
+ output_stream=output_stream,
884
+ max_size=max_size,
885
+ args={
886
+ # tell the remote server to 404 if it doesn't
887
+ # recognise the server_name, to make sure we don't
888
+ # end up with a routing loop.
889
+ "allow_remote": "false",
890
+ "timeout_ms": str(max_timeout_ms),
891
+ },
892
+ download_ratelimiter=download_ratelimiter,
893
+ ip_address=ip_address,
894
+ )
895
+
896
+ async def download_media_v3(
897
+ self,
898
+ destination: str,
899
+ media_id: str,
900
+ output_stream: BinaryIO,
901
+ max_size: int,
902
+ max_timeout_ms: int,
903
+ download_ratelimiter: Ratelimiter,
904
+ ip_address: str,
905
+ ) -> tuple[int, dict[bytes, list[bytes]]]:
906
+ path = f"/_matrix/media/v3/download/{destination}/{media_id}"
907
+ return await self.client.get_file(
908
+ destination,
909
+ path,
910
+ output_stream=output_stream,
911
+ max_size=max_size,
912
+ args={
913
+ # tell the remote server to 404 if it doesn't
914
+ # recognise the server_name, to make sure we don't
915
+ # end up with a routing loop.
916
+ "allow_remote": "false",
917
+ "timeout_ms": str(max_timeout_ms),
918
+ # Matrix 1.7 allows for this to redirect to another URL, this should
919
+ # just be ignored for an old homeserver, so always provide it.
920
+ "allow_redirect": "true",
921
+ },
922
+ follow_redirects=True,
923
+ download_ratelimiter=download_ratelimiter,
924
+ ip_address=ip_address,
925
+ )
926
+
927
+ async def federation_download_media(
928
+ self,
929
+ destination: str,
930
+ media_id: str,
931
+ output_stream: BinaryIO,
932
+ max_size: int,
933
+ max_timeout_ms: int,
934
+ download_ratelimiter: Ratelimiter,
935
+ ip_address: str,
936
+ ) -> tuple[int, dict[bytes, list[bytes]], bytes]:
937
+ path = f"/_matrix/federation/v1/media/download/{media_id}"
938
+ return await self.client.federation_get_file(
939
+ destination,
940
+ path,
941
+ output_stream=output_stream,
942
+ max_size=max_size,
943
+ args={
944
+ "timeout_ms": str(max_timeout_ms),
945
+ },
946
+ download_ratelimiter=download_ratelimiter,
947
+ ip_address=ip_address,
948
+ )
949
+
950
+
951
+ def _create_path(federation_prefix: str, path: str, *args: str) -> str:
952
+ """
953
+ Ensures that all args are url encoded.
954
+ """
955
+ return federation_prefix + path % tuple(urllib.parse.quote(arg, "") for arg in args)
956
+
957
+
958
+ def _create_v1_path(path: str, *args: str) -> str:
959
+ """Creates a path against V1 federation API from the path template and
960
+ args. Ensures that all args are url encoded.
961
+
962
+ Example:
963
+
964
+ _create_v1_path("/event/%s", event_id)
965
+
966
+ Args:
967
+ path: String template for the path
968
+ args: Args to insert into path. Each arg will be url encoded
969
+ """
970
+ return _create_path(FEDERATION_V1_PREFIX, path, *args)
971
+
972
+
973
+ def _create_v2_path(path: str, *args: str) -> str:
974
+ """Creates a path against V2 federation API from the path template and
975
+ args. Ensures that all args are url encoded.
976
+
977
+ Example:
978
+
979
+ _create_v2_path("/event/%s", event_id)
980
+
981
+ Args:
982
+ path: String template for the path
983
+ args: Args to insert into path. Each arg will be url encoded
984
+ """
985
+ return _create_path(FEDERATION_V2_PREFIX, path, *args)
986
+
987
+
988
+ @attr.s(slots=True, auto_attribs=True)
989
+ class SendJoinResponse:
990
+ """The parsed response of a `/send_join` request."""
991
+
992
+ # The list of auth events from the /send_join response.
993
+ auth_events: list[EventBase]
994
+ # The list of state from the /send_join response.
995
+ state: list[EventBase]
996
+ # The raw join event from the /send_join response.
997
+ event_dict: JsonDict
998
+ # The parsed join event from the /send_join response. This will be None if
999
+ # "event" is not included in the response.
1000
+ event: Optional[EventBase] = None
1001
+
1002
+ # The room state is incomplete
1003
+ members_omitted: bool = False
1004
+
1005
+ # List of servers in the room
1006
+ servers_in_room: Optional[list[str]] = None
1007
+
1008
+
1009
+ @attr.s(slots=True, auto_attribs=True)
1010
+ class StateRequestResponse:
1011
+ """The parsed response of a `/state` request."""
1012
+
1013
+ auth_events: list[EventBase]
1014
+ state: list[EventBase]
1015
+
1016
+
1017
+ @ijson.coroutine
1018
+ def _event_parser(event_dict: JsonDict) -> Generator[None, tuple[str, Any], None]:
1019
+ """Helper function for use with `ijson.kvitems_coro` to parse key-value pairs
1020
+ to add them to a given dictionary.
1021
+ """
1022
+
1023
+ while True:
1024
+ key, value = yield
1025
+ event_dict[key] = value
1026
+
1027
+
1028
+ @ijson.coroutine
1029
+ def _event_list_parser(
1030
+ room_version: RoomVersion, events: list[EventBase]
1031
+ ) -> Generator[None, JsonDict, None]:
1032
+ """Helper function for use with `ijson.items_coro` to parse an array of
1033
+ events and add them to the given list.
1034
+ """
1035
+
1036
+ while True:
1037
+ obj = yield
1038
+ event = make_event_from_dict(obj, room_version)
1039
+ events.append(event)
1040
+
1041
+
1042
+ @ijson.coroutine
1043
+ def _members_omitted_parser(response: SendJoinResponse) -> Generator[None, Any, None]:
1044
+ """Helper function for use with `ijson.items_coro`
1045
+
1046
+ Parses the members_omitted field in send_join responses
1047
+ """
1048
+ while True:
1049
+ val = yield
1050
+ if not isinstance(val, bool):
1051
+ raise TypeError("members_omitted must be a boolean")
1052
+ response.members_omitted = val
1053
+
1054
+
1055
+ @ijson.coroutine
1056
+ def _servers_in_room_parser(response: SendJoinResponse) -> Generator[None, Any, None]:
1057
+ """Helper function for use with `ijson.items_coro`
1058
+
1059
+ Parses the servers_in_room field in send_join responses
1060
+ """
1061
+ while True:
1062
+ val = yield
1063
+ if not isinstance(val, list) or any(not isinstance(x, str) for x in val):
1064
+ raise TypeError("servers_in_room must be a list of strings")
1065
+ response.servers_in_room = val
1066
+
1067
+
1068
+ class SendJoinParser(ByteParser[SendJoinResponse]):
1069
+ """A parser for the response to `/send_join` requests.
1070
+
1071
+ Args:
1072
+ room_version: The version of the room.
1073
+ v1_api: Whether the response is in the v1 format.
1074
+ """
1075
+
1076
+ CONTENT_TYPE = "application/json"
1077
+
1078
+ # /send_join responses can be huge, so we override the size limit here. The response
1079
+ # is parsed in a streaming manner, which helps alleviate the issue of memory
1080
+ # usage a bit.
1081
+ MAX_RESPONSE_SIZE = 500 * 1024 * 1024
1082
+
1083
+ def __init__(self, room_version: RoomVersion, v1_api: bool):
1084
+ self._response = SendJoinResponse([], [], event_dict={})
1085
+ self._room_version = room_version
1086
+ self._coros: list[Generator[None, bytes, None]] = []
1087
+
1088
+ # The V1 API has the shape of `[200, {...}]`, which we handle by
1089
+ # prefixing with `item.*`.
1090
+ prefix = "item." if v1_api else ""
1091
+
1092
+ self._coros = [
1093
+ ijson.items_coro(
1094
+ _event_list_parser(room_version, self._response.state),
1095
+ prefix + "state.item",
1096
+ use_float=True,
1097
+ ),
1098
+ ijson.items_coro(
1099
+ _event_list_parser(room_version, self._response.auth_events),
1100
+ prefix + "auth_chain.item",
1101
+ use_float=True,
1102
+ ),
1103
+ ijson.kvitems_coro(
1104
+ _event_parser(self._response.event_dict),
1105
+ prefix + "event",
1106
+ use_float=True,
1107
+ ),
1108
+ ]
1109
+
1110
+ if not v1_api:
1111
+ self._coros.append(
1112
+ ijson.items_coro(
1113
+ _members_omitted_parser(self._response),
1114
+ "members_omitted",
1115
+ use_float="True",
1116
+ )
1117
+ )
1118
+
1119
+ # Again, stable field name comes last
1120
+ self._coros.append(
1121
+ ijson.items_coro(
1122
+ _servers_in_room_parser(self._response),
1123
+ "servers_in_room",
1124
+ use_float="True",
1125
+ )
1126
+ )
1127
+
1128
+ def write(self, data: bytes) -> int:
1129
+ for c in self._coros:
1130
+ c.send(data)
1131
+
1132
+ return len(data)
1133
+
1134
+ def finish(self) -> SendJoinResponse:
1135
+ _close_coros(self._coros)
1136
+
1137
+ if self._response.event_dict:
1138
+ self._response.event = make_event_from_dict(
1139
+ self._response.event_dict, self._room_version
1140
+ )
1141
+ return self._response
1142
+
1143
+
1144
+ class _StateParser(ByteParser[StateRequestResponse]):
1145
+ """A parser for the response to `/state` requests.
1146
+
1147
+ Args:
1148
+ room_version: The version of the room.
1149
+ """
1150
+
1151
+ CONTENT_TYPE = "application/json"
1152
+
1153
+ # As with /send_join, /state responses can be huge.
1154
+ MAX_RESPONSE_SIZE = 500 * 1024 * 1024
1155
+
1156
+ def __init__(self, room_version: RoomVersion):
1157
+ self._response = StateRequestResponse([], [])
1158
+ self._room_version = room_version
1159
+ self._coros: list[Generator[None, bytes, None]] = [
1160
+ ijson.items_coro(
1161
+ _event_list_parser(room_version, self._response.state),
1162
+ "pdus.item",
1163
+ use_float=True,
1164
+ ),
1165
+ ijson.items_coro(
1166
+ _event_list_parser(room_version, self._response.auth_events),
1167
+ "auth_chain.item",
1168
+ use_float=True,
1169
+ ),
1170
+ ]
1171
+
1172
+ def write(self, data: bytes) -> int:
1173
+ for c in self._coros:
1174
+ c.send(data)
1175
+ return len(data)
1176
+
1177
+ def finish(self) -> StateRequestResponse:
1178
+ _close_coros(self._coros)
1179
+ return self._response
1180
+
1181
+
1182
+ def _close_coros(coros: Iterable[Generator[None, bytes, None]]) -> None:
1183
+ """Close each of the given coroutines.
1184
+
1185
+ Always calls .close() on each coroutine, even if doing so raises an exception.
1186
+ Any exceptions raised are aggregated into an ExceptionBundle.
1187
+
1188
+ :raises ExceptionBundle: if at least one coroutine fails to close.
1189
+ """
1190
+ exceptions = []
1191
+ for c in coros:
1192
+ try:
1193
+ c.close()
1194
+ except Exception as e:
1195
+ exceptions.append(e)
1196
+
1197
+ if exceptions:
1198
+ # raise from the first exception so that the traceback has slightly more context
1199
+ raise ExceptionBundle(
1200
+ f"There were {len(exceptions)} errors closing coroutines", exceptions
1201
+ ) from exceptions[0]