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,1118 @@
1
+ #
2
+ # This file is licensed under the Affero General Public License (AGPL) version 3.
3
+ #
4
+ # Copyright (C) 2023 New Vector, Ltd
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as
8
+ # published by the Free Software Foundation, either version 3 of the
9
+ # License, or (at your option) any later version.
10
+ #
11
+ # See the GNU Affero General Public License for more details:
12
+ # <https://www.gnu.org/licenses/agpl-3.0.html>.
13
+ #
14
+ # Originally licensed under the Apache License, Version 2.0:
15
+ # <http://www.apache.org/licenses/LICENSE-2.0>.
16
+ #
17
+ # [This file includes modifications made by New Vector Limited]
18
+ #
19
+ #
20
+
21
+ import logging
22
+ from typing import (
23
+ TYPE_CHECKING,
24
+ Collection,
25
+ Iterable,
26
+ Mapping,
27
+ Optional,
28
+ Sequence,
29
+ Union,
30
+ cast,
31
+ )
32
+
33
+ import attr
34
+
35
+ from synapse.api.constants import MAIN_TIMELINE, Direction, RelationTypes
36
+ from synapse.api.errors import SynapseError
37
+ from synapse.events import EventBase
38
+ from synapse.storage._base import SQLBaseStore
39
+ from synapse.storage.database import (
40
+ DatabasePool,
41
+ LoggingDatabaseConnection,
42
+ LoggingTransaction,
43
+ make_in_list_sql_clause,
44
+ )
45
+ from synapse.storage.databases.main.stream import (
46
+ generate_next_token,
47
+ generate_pagination_bounds,
48
+ generate_pagination_where_clause,
49
+ )
50
+ from synapse.storage.engines import PostgresEngine
51
+ from synapse.types import JsonDict, StreamKeyType, StreamToken
52
+ from synapse.util.caches.descriptors import cached, cachedList
53
+
54
+ if TYPE_CHECKING:
55
+ from synapse.server import HomeServer
56
+
57
+ logger = logging.getLogger(__name__)
58
+
59
+
60
+ @attr.s(slots=True, frozen=True, auto_attribs=True)
61
+ class ThreadsNextBatch:
62
+ topological_ordering: int
63
+ stream_ordering: int
64
+
65
+ def __str__(self) -> str:
66
+ return f"{self.topological_ordering}_{self.stream_ordering}"
67
+
68
+ @classmethod
69
+ def from_string(cls, string: str) -> "ThreadsNextBatch":
70
+ """
71
+ Creates a ThreadsNextBatch from its textual representation.
72
+ """
73
+ try:
74
+ keys = (int(s) for s in string.split("_"))
75
+ return cls(*keys)
76
+ except Exception:
77
+ raise SynapseError(400, "Invalid threads token")
78
+
79
+
80
+ @attr.s(slots=True, frozen=True, auto_attribs=True)
81
+ class _RelatedEvent:
82
+ """
83
+ Contains enough information about a related event in order to properly filter
84
+ events from ignored users.
85
+ """
86
+
87
+ # The event ID of the related event.
88
+ event_id: str
89
+ # The sender of the related event.
90
+ sender: str
91
+
92
+
93
+ class RelationsWorkerStore(SQLBaseStore):
94
+ def __init__(
95
+ self,
96
+ database: DatabasePool,
97
+ db_conn: LoggingDatabaseConnection,
98
+ hs: "HomeServer",
99
+ ):
100
+ super().__init__(database, db_conn, hs)
101
+
102
+ self.db_pool.updates.register_background_update_handler(
103
+ "threads_backfill", self._backfill_threads
104
+ )
105
+
106
+ async def _backfill_threads(self, progress: JsonDict, batch_size: int) -> int:
107
+ """Backfill the threads table."""
108
+
109
+ def threads_backfill_txn(txn: LoggingTransaction) -> int:
110
+ last_thread_id = progress.get("last_thread_id", "")
111
+
112
+ # Get the latest event in each thread by topo ordering / stream ordering.
113
+ #
114
+ # Note that the MAX(event_id) is needed to abide by the rules of group by,
115
+ # but doesn't actually do anything since there should only be a single event
116
+ # ID per topo/stream ordering pair.
117
+ sql = f"""
118
+ SELECT room_id, relates_to_id, MAX(topological_ordering), MAX(stream_ordering), MAX(event_id)
119
+ FROM event_relations
120
+ INNER JOIN events USING (event_id)
121
+ WHERE
122
+ relates_to_id > ? AND
123
+ relation_type = '{RelationTypes.THREAD}'
124
+ GROUP BY room_id, relates_to_id
125
+ ORDER BY relates_to_id
126
+ LIMIT ?
127
+ """
128
+ txn.execute(sql, (last_thread_id, batch_size))
129
+
130
+ # No more rows to process.
131
+ rows = txn.fetchall()
132
+ if not rows:
133
+ return 0
134
+
135
+ # Insert the rows into the threads table. If a matching thread already exists,
136
+ # assume it is from a newer event.
137
+ sql = """
138
+ INSERT INTO threads (room_id, thread_id, topological_ordering, stream_ordering, latest_event_id)
139
+ VALUES %s
140
+ ON CONFLICT (room_id, thread_id)
141
+ DO NOTHING
142
+ """
143
+ if isinstance(txn.database_engine, PostgresEngine):
144
+ txn.execute_values(sql % ("?",), rows, fetch=False)
145
+ else:
146
+ txn.execute_batch(sql % ("(?, ?, ?, ?, ?)",), rows)
147
+
148
+ # Mark the progress.
149
+ self.db_pool.updates._background_update_progress_txn(
150
+ txn, "threads_backfill", {"last_thread_id": rows[-1][1]}
151
+ )
152
+
153
+ return txn.rowcount
154
+
155
+ result = await self.db_pool.runInteraction(
156
+ "threads_backfill", threads_backfill_txn
157
+ )
158
+
159
+ if not result:
160
+ await self.db_pool.updates._end_background_update("threads_backfill")
161
+
162
+ return result
163
+
164
+ @cached(uncached_args=("event",), tree=True)
165
+ async def get_relations_for_event(
166
+ self,
167
+ room_id: str,
168
+ event_id: str,
169
+ event: EventBase,
170
+ relation_type: Optional[str] = None,
171
+ event_type: Optional[str] = None,
172
+ limit: int = 5,
173
+ direction: Direction = Direction.BACKWARDS,
174
+ from_token: Optional[StreamToken] = None,
175
+ to_token: Optional[StreamToken] = None,
176
+ recurse: bool = False,
177
+ ) -> tuple[Sequence[_RelatedEvent], Optional[StreamToken]]:
178
+ """Get a list of relations for an event, ordered by topological ordering.
179
+
180
+ Args:
181
+ event_id: Fetch events that relate to this event ID.
182
+ event: The matching EventBase to event_id.
183
+ room_id: The room the event belongs to.
184
+ relation_type: Only fetch events with this relation type, if given.
185
+ event_type: Only fetch events with this event type, if given.
186
+ limit: Only fetch the most recent `limit` events.
187
+ direction: Whether to fetch the most recent first (backwards) or the
188
+ oldest first (forwards).
189
+ from_token: Fetch rows from the given token, or from the start if None.
190
+ to_token: Fetch rows up to the given token, or up to the end if None.
191
+ recurse: Whether to recursively find relations.
192
+
193
+ Returns:
194
+ A tuple of:
195
+ A list of related event IDs & their senders.
196
+
197
+ The next stream token, if one exists.
198
+ """
199
+ # We don't use `event_id`, it's there so that we can cache based on
200
+ # it. The `event_id` must match the `event.event_id`.
201
+ assert event.event_id == event_id
202
+
203
+ # Ensure bad limits aren't being passed in.
204
+ assert limit >= 0
205
+
206
+ where_clause = ["room_id = ?"]
207
+ where_args: list[Union[str, int]] = [room_id]
208
+ is_redacted = event.internal_metadata.is_redacted()
209
+
210
+ if relation_type is not None:
211
+ where_clause.append("relation_type = ?")
212
+ where_args.append(relation_type)
213
+
214
+ if event_type is not None:
215
+ where_clause.append("type = ?")
216
+ where_args.append(event_type)
217
+
218
+ order, from_bound, to_bound = generate_pagination_bounds(
219
+ direction,
220
+ from_token.room_key if from_token else None,
221
+ to_token.room_key if to_token else None,
222
+ )
223
+
224
+ pagination_clause = generate_pagination_where_clause(
225
+ direction=direction,
226
+ column_names=("topological_ordering", "stream_ordering"),
227
+ from_token=from_bound,
228
+ to_token=to_bound,
229
+ engine=self.database_engine,
230
+ )
231
+
232
+ if pagination_clause:
233
+ where_clause.append(pagination_clause)
234
+
235
+ # If a recursive query is requested then the filters are applied after
236
+ # recursively following relationships from the requested event to children
237
+ # up to 3-relations deep.
238
+ #
239
+ # If no recursion is needed then the event_relations table is queried
240
+ # for direct children of the requested event.
241
+ if recurse:
242
+ sql = """
243
+ WITH RECURSIVE related_events AS (
244
+ SELECT event_id, relation_type, relates_to_id, 0 AS depth
245
+ FROM event_relations
246
+ WHERE relates_to_id = ?
247
+ UNION SELECT e.event_id, e.relation_type, e.relates_to_id, depth + 1
248
+ FROM event_relations e
249
+ INNER JOIN related_events r ON r.event_id = e.relates_to_id
250
+ WHERE depth <= 3
251
+ )
252
+ SELECT event_id, relation_type, sender, topological_ordering, stream_ordering
253
+ FROM related_events
254
+ INNER JOIN events USING (event_id)
255
+ WHERE %s
256
+ ORDER BY topological_ordering %s, stream_ordering %s
257
+ LIMIT ?;
258
+ """ % (
259
+ " AND ".join(where_clause),
260
+ order,
261
+ order,
262
+ )
263
+ else:
264
+ sql = """
265
+ SELECT event_id, relation_type, sender, topological_ordering, stream_ordering
266
+ FROM event_relations
267
+ INNER JOIN events USING (event_id)
268
+ WHERE relates_to_id = ? AND %s
269
+ ORDER BY topological_ordering %s, stream_ordering %s
270
+ LIMIT ?
271
+ """ % (
272
+ " AND ".join(where_clause),
273
+ order,
274
+ order,
275
+ )
276
+
277
+ def _get_recent_references_for_event_txn(
278
+ txn: LoggingTransaction,
279
+ ) -> tuple[list[_RelatedEvent], Optional[StreamToken]]:
280
+ txn.execute(sql, [event.event_id] + where_args + [limit + 1])
281
+
282
+ events = []
283
+ topo_orderings: list[int] = []
284
+ stream_orderings: list[int] = []
285
+ for event_id, relation_type, sender, topo_ordering, stream_ordering in cast(
286
+ list[tuple[str, str, str, int, int]], txn
287
+ ):
288
+ # Do not include edits for redacted events as they leak event
289
+ # content.
290
+ if not is_redacted or relation_type != RelationTypes.REPLACE:
291
+ events.append(_RelatedEvent(event_id, sender))
292
+ topo_orderings.append(topo_ordering)
293
+ stream_orderings.append(stream_ordering)
294
+
295
+ # If there are more events, generate the next pagination key from the
296
+ # last event returned.
297
+ next_token = None
298
+ if len(events) > limit:
299
+ # Instead of using the last row (which tells us there is more
300
+ # data), use the last row to be returned.
301
+ events = events[:limit]
302
+ topo_orderings = topo_orderings[:limit]
303
+ stream_orderings = stream_orderings[:limit]
304
+
305
+ next_key = generate_next_token(
306
+ direction, topo_orderings[-1], stream_orderings[-1]
307
+ )
308
+
309
+ if from_token:
310
+ next_token = from_token.copy_and_replace(
311
+ StreamKeyType.ROOM, next_key
312
+ )
313
+ else:
314
+ next_token = StreamToken.START.copy_and_replace(
315
+ StreamKeyType.ROOM, next_key
316
+ )
317
+
318
+ return events[:limit], next_token
319
+
320
+ return await self.db_pool.runInteraction(
321
+ "get_recent_references_for_event", _get_recent_references_for_event_txn
322
+ )
323
+
324
+ async def get_all_relations_for_event_with_types(
325
+ self,
326
+ event_id: str,
327
+ relation_types: list[str],
328
+ ) -> list[str]:
329
+ """Get the event IDs of all events that have a relation to the given event with
330
+ one of the given relation types.
331
+
332
+ Args:
333
+ event_id: The event for which to look for related events.
334
+ relation_types: The types of relations to look for.
335
+
336
+ Returns:
337
+ A list of the IDs of the events that relate to the given event with one of
338
+ the given relation types.
339
+ """
340
+
341
+ def get_all_relation_ids_for_event_with_types_txn(
342
+ txn: LoggingTransaction,
343
+ ) -> list[str]:
344
+ rows = cast(
345
+ list[tuple[str]],
346
+ self.db_pool.simple_select_many_txn(
347
+ txn=txn,
348
+ table="event_relations",
349
+ column="relation_type",
350
+ iterable=relation_types,
351
+ keyvalues={"relates_to_id": event_id},
352
+ retcols=["event_id"],
353
+ ),
354
+ )
355
+
356
+ return [row[0] for row in rows]
357
+
358
+ return await self.db_pool.runInteraction(
359
+ desc="get_all_relation_ids_for_event_with_types",
360
+ func=get_all_relation_ids_for_event_with_types_txn,
361
+ )
362
+
363
+ async def get_all_relations_for_event(
364
+ self,
365
+ event_id: str,
366
+ ) -> list[str]:
367
+ """Get the event IDs of all events that have a relation to the given event.
368
+
369
+ Args:
370
+ event_id: The event for which to look for related events.
371
+
372
+ Returns:
373
+ A list of the IDs of the events that relate to the given event.
374
+ """
375
+
376
+ def get_all_relation_ids_for_event_txn(
377
+ txn: LoggingTransaction,
378
+ ) -> list[str]:
379
+ rows = cast(
380
+ list[tuple[str]],
381
+ self.db_pool.simple_select_list_txn(
382
+ txn=txn,
383
+ table="event_relations",
384
+ keyvalues={"relates_to_id": event_id},
385
+ retcols=["event_id"],
386
+ ),
387
+ )
388
+
389
+ return [row[0] for row in rows]
390
+
391
+ return await self.db_pool.runInteraction(
392
+ desc="get_all_relation_ids_for_event",
393
+ func=get_all_relation_ids_for_event_txn,
394
+ )
395
+
396
+ async def event_includes_relation(self, event_id: str) -> bool:
397
+ """Check if the given event relates to another event.
398
+
399
+ An event has a relation if it has a valid m.relates_to with a rel_type
400
+ and event_id in the content:
401
+
402
+ {
403
+ "content": {
404
+ "m.relates_to": {
405
+ "rel_type": "m.replace",
406
+ "event_id": "$other_event_id"
407
+ }
408
+ }
409
+ }
410
+
411
+ Args:
412
+ event_id: The event to check.
413
+
414
+ Returns:
415
+ True if the event includes a valid relation.
416
+ """
417
+
418
+ result = await self.db_pool.simple_select_one_onecol(
419
+ table="event_relations",
420
+ keyvalues={"event_id": event_id},
421
+ retcol="event_id",
422
+ allow_none=True,
423
+ desc="event_includes_relation",
424
+ )
425
+ return result is not None
426
+
427
+ async def event_is_target_of_relation(self, parent_id: str) -> bool:
428
+ """Check if the given event is the target of another event's relation.
429
+
430
+ An event is the target of an event relation if it has a valid
431
+ m.relates_to with a rel_type and event_id pointing to parent_id in the
432
+ content:
433
+
434
+ {
435
+ "content": {
436
+ "m.relates_to": {
437
+ "rel_type": "m.replace",
438
+ "event_id": "$parent_id"
439
+ }
440
+ }
441
+ }
442
+
443
+ Args:
444
+ parent_id: The event to check.
445
+
446
+ Returns:
447
+ True if the event is the target of another event's relation.
448
+ """
449
+
450
+ result = await self.db_pool.simple_select_one_onecol(
451
+ table="event_relations",
452
+ keyvalues={"relates_to_id": parent_id},
453
+ retcol="event_id",
454
+ allow_none=True,
455
+ desc="event_is_target_of_relation",
456
+ )
457
+ return result is not None
458
+
459
+ @cached() # type: ignore[synapse-@cached-mutable]
460
+ async def get_references_for_event(self, event_id: str) -> list[JsonDict]:
461
+ raise NotImplementedError()
462
+
463
+ @cachedList(cached_method_name="get_references_for_event", list_name="event_ids")
464
+ async def get_references_for_events(
465
+ self, event_ids: Collection[str]
466
+ ) -> Mapping[str, Optional[Sequence[_RelatedEvent]]]:
467
+ """Get a list of references to the given events.
468
+
469
+ Args:
470
+ event_ids: Fetch events that relate to these event IDs.
471
+
472
+ Returns:
473
+ A map of event IDs to a list of related event IDs (and their senders).
474
+ """
475
+
476
+ clause, args = make_in_list_sql_clause(
477
+ self.database_engine, "relates_to_id", event_ids
478
+ )
479
+ args.append(RelationTypes.REFERENCE)
480
+
481
+ sql = f"""
482
+ SELECT relates_to_id, ref.event_id, ref.sender
483
+ FROM events AS ref
484
+ INNER JOIN event_relations USING (event_id)
485
+ INNER JOIN events AS parent ON
486
+ parent.event_id = relates_to_id
487
+ AND parent.room_id = ref.room_id
488
+ WHERE
489
+ {clause}
490
+ AND relation_type = ?
491
+ ORDER BY ref.topological_ordering, ref.stream_ordering
492
+ """
493
+
494
+ def _get_references_for_events_txn(
495
+ txn: LoggingTransaction,
496
+ ) -> Mapping[str, list[_RelatedEvent]]:
497
+ txn.execute(sql, args)
498
+
499
+ result: dict[str, list[_RelatedEvent]] = {}
500
+ for relates_to_id, event_id, sender in cast(
501
+ list[tuple[str, str, str]], txn
502
+ ):
503
+ result.setdefault(relates_to_id, []).append(
504
+ _RelatedEvent(event_id, sender)
505
+ )
506
+
507
+ return result
508
+
509
+ return await self.db_pool.runInteraction(
510
+ "_get_references_for_events_txn", _get_references_for_events_txn
511
+ )
512
+
513
+ @cached() # type: ignore[synapse-@cached-mutable]
514
+ def get_applicable_edit(self, event_id: str) -> Optional[EventBase]:
515
+ raise NotImplementedError()
516
+
517
+ # TODO: This returns a mutable object, which is generally bad.
518
+ @cachedList(cached_method_name="get_applicable_edit", list_name="event_ids") # type: ignore[synapse-@cached-mutable]
519
+ async def get_applicable_edits(
520
+ self, event_ids: Collection[str]
521
+ ) -> Mapping[str, Optional[EventBase]]:
522
+ """Get the most recent edit (if any) that has happened for the given
523
+ events.
524
+
525
+ Correctly handles checking whether edits were allowed to happen.
526
+
527
+ Args:
528
+ event_ids: The original event IDs
529
+
530
+ Returns:
531
+ A map of the most recent edit for each event. If there are no edits,
532
+ the event will map to None.
533
+ """
534
+
535
+ # We only allow edits for events that have the same sender and event type.
536
+ # We can't assert these things during regular event auth so we have to do
537
+ # the checks post hoc.
538
+
539
+ # Fetches latest edit that has the same type and sender as the original.
540
+ if isinstance(self.database_engine, PostgresEngine):
541
+ # The `DISTINCT ON` clause will pick the *first* row it encounters,
542
+ # so ordering by origin server ts + event ID desc will ensure we get
543
+ # the latest edit.
544
+ sql = """
545
+ SELECT DISTINCT ON (original.event_id) original.event_id, edit.event_id FROM events AS edit
546
+ INNER JOIN event_relations USING (event_id)
547
+ INNER JOIN events AS original ON
548
+ original.event_id = relates_to_id
549
+ AND edit.type = original.type
550
+ AND edit.sender = original.sender
551
+ AND edit.room_id = original.room_id
552
+ WHERE
553
+ %s
554
+ AND relation_type = ?
555
+ ORDER by original.event_id DESC, edit.origin_server_ts DESC, edit.event_id DESC
556
+ """
557
+ else:
558
+ # SQLite uses a simplified query which returns all edits for an
559
+ # original event. The results are then de-duplicated when turned into
560
+ # a dict. Due to the chosen ordering, the latest edit stomps on
561
+ # earlier edits.
562
+ sql = """
563
+ SELECT original.event_id, edit.event_id FROM events AS edit
564
+ INNER JOIN event_relations USING (event_id)
565
+ INNER JOIN events AS original ON
566
+ original.event_id = relates_to_id
567
+ AND edit.type = original.type
568
+ AND edit.sender = original.sender
569
+ AND edit.room_id = original.room_id
570
+ WHERE
571
+ %s
572
+ AND relation_type = ?
573
+ ORDER by edit.origin_server_ts, edit.event_id
574
+ """
575
+
576
+ def _get_applicable_edits_txn(txn: LoggingTransaction) -> dict[str, str]:
577
+ clause, args = make_in_list_sql_clause(
578
+ txn.database_engine, "relates_to_id", event_ids
579
+ )
580
+ args.append(RelationTypes.REPLACE)
581
+
582
+ txn.execute(sql % (clause,), args)
583
+ return dict(cast(Iterable[tuple[str, str]], txn.fetchall()))
584
+
585
+ edit_ids = await self.db_pool.runInteraction(
586
+ "get_applicable_edits", _get_applicable_edits_txn
587
+ )
588
+
589
+ edits = await self.get_events(edit_ids.values()) # type: ignore[attr-defined]
590
+
591
+ # Map to the original event IDs to the edit events.
592
+ #
593
+ # There might not be an edit event due to there being no edits or
594
+ # due to the event not being known, either case is treated the same.
595
+ return {
596
+ original_event_id: edits.get(edit_ids.get(original_event_id))
597
+ for original_event_id in event_ids
598
+ }
599
+
600
+ @cached() # type: ignore[synapse-@cached-mutable]
601
+ def get_thread_summary(self, event_id: str) -> Optional[tuple[int, EventBase]]:
602
+ raise NotImplementedError()
603
+
604
+ # TODO: This returns a mutable object, which is generally bad.
605
+ @cachedList(cached_method_name="get_thread_summary", list_name="event_ids") # type: ignore[synapse-@cached-mutable]
606
+ async def get_thread_summaries(
607
+ self, event_ids: Collection[str]
608
+ ) -> Mapping[str, Optional[tuple[int, EventBase]]]:
609
+ """Get the number of threaded replies and the latest reply (if any) for the given events.
610
+
611
+ Args:
612
+ event_ids: Summarize the thread related to this event ID.
613
+
614
+ Returns:
615
+ A map of the thread summary each event. A missing event implies there
616
+ are no threaded replies.
617
+
618
+ Each summary is a tuple of:
619
+ The number of events in the thread.
620
+ The most recent event in the thread.
621
+ """
622
+
623
+ def _get_thread_summaries_txn(
624
+ txn: LoggingTransaction,
625
+ ) -> tuple[dict[str, int], dict[str, str]]:
626
+ # Fetch the count of threaded events and the latest event ID.
627
+ # TODO Should this only allow m.room.message events.
628
+ if isinstance(self.database_engine, PostgresEngine):
629
+ # The `DISTINCT ON` clause will pick the *first* row it encounters,
630
+ # so ordering by topological ordering + stream ordering desc will
631
+ # ensure we get the latest event in the thread.
632
+ sql = """
633
+ SELECT DISTINCT ON (parent.event_id) parent.event_id, child.event_id FROM events AS child
634
+ INNER JOIN event_relations USING (event_id)
635
+ INNER JOIN events AS parent ON
636
+ parent.event_id = relates_to_id
637
+ AND parent.room_id = child.room_id
638
+ WHERE
639
+ %s
640
+ AND relation_type = ?
641
+ ORDER BY parent.event_id, child.topological_ordering DESC, child.stream_ordering DESC
642
+ """
643
+ else:
644
+ # SQLite uses a simplified query which returns all entries for a
645
+ # thread. The first result for each thread is chosen to and subsequent
646
+ # results for a thread are ignored.
647
+ sql = """
648
+ SELECT parent.event_id, child.event_id FROM events AS child
649
+ INNER JOIN event_relations USING (event_id)
650
+ INNER JOIN events AS parent ON
651
+ parent.event_id = relates_to_id
652
+ AND parent.room_id = child.room_id
653
+ WHERE
654
+ %s
655
+ AND relation_type = ?
656
+ ORDER BY child.topological_ordering DESC, child.stream_ordering DESC
657
+ """
658
+
659
+ clause, args = make_in_list_sql_clause(
660
+ txn.database_engine, "relates_to_id", event_ids
661
+ )
662
+ args.append(RelationTypes.THREAD)
663
+
664
+ txn.execute(sql % (clause,), args)
665
+ latest_event_ids = {}
666
+ for parent_event_id, child_event_id in txn:
667
+ # Only consider the latest threaded reply (by topological ordering).
668
+ if parent_event_id not in latest_event_ids:
669
+ latest_event_ids[parent_event_id] = child_event_id
670
+
671
+ # If no threads were found, bail.
672
+ if not latest_event_ids:
673
+ return {}, latest_event_ids
674
+
675
+ # Fetch the number of threaded replies.
676
+ sql = """
677
+ SELECT parent.event_id, COUNT(child.event_id) FROM events AS child
678
+ INNER JOIN event_relations USING (event_id)
679
+ INNER JOIN events AS parent ON
680
+ parent.event_id = relates_to_id
681
+ AND parent.room_id = child.room_id
682
+ WHERE
683
+ %s
684
+ AND relation_type = ?
685
+ GROUP BY parent.event_id
686
+ """
687
+
688
+ # Regenerate the arguments since only threads found above could
689
+ # possibly have any replies.
690
+ clause, args = make_in_list_sql_clause(
691
+ txn.database_engine, "relates_to_id", latest_event_ids.keys()
692
+ )
693
+ args.append(RelationTypes.THREAD)
694
+
695
+ txn.execute(sql % (clause,), args)
696
+ counts = dict(cast(list[tuple[str, int]], txn.fetchall()))
697
+
698
+ return counts, latest_event_ids
699
+
700
+ counts, latest_event_ids = await self.db_pool.runInteraction(
701
+ "get_thread_summaries", _get_thread_summaries_txn
702
+ )
703
+
704
+ latest_events = await self.get_events(latest_event_ids.values()) # type: ignore[attr-defined]
705
+
706
+ # Map to the event IDs to the thread summary.
707
+ #
708
+ # There might not be a summary due to there not being a thread or
709
+ # due to the latest event not being known, either case is treated the same.
710
+ summaries = {}
711
+ for parent_event_id, latest_event_id in latest_event_ids.items():
712
+ latest_event = latest_events.get(latest_event_id)
713
+
714
+ summary = None
715
+ if latest_event:
716
+ summary = (counts[parent_event_id], latest_event)
717
+ summaries[parent_event_id] = summary
718
+
719
+ return summaries
720
+
721
+ async def get_threaded_messages_per_user(
722
+ self,
723
+ event_ids: Collection[str],
724
+ users: frozenset[str] = frozenset(),
725
+ ) -> dict[tuple[str, str], int]:
726
+ """Get the number of threaded replies for a set of users.
727
+
728
+ This is used, in conjunction with get_thread_summaries, to calculate an
729
+ accurate count of the replies to a thread by subtracting ignored users.
730
+
731
+ Args:
732
+ event_ids: The events to check for threaded replies.
733
+ users: The user to calculate the count of their replies.
734
+
735
+ Returns:
736
+ A map of the (event_id, sender) to the count of their replies.
737
+ """
738
+ if not users:
739
+ return {}
740
+
741
+ # Fetch the number of threaded replies.
742
+ sql = """
743
+ SELECT parent.event_id, child.sender, COUNT(child.event_id) FROM events AS child
744
+ INNER JOIN event_relations USING (event_id)
745
+ INNER JOIN events AS parent ON
746
+ parent.event_id = relates_to_id
747
+ AND parent.room_id = child.room_id
748
+ WHERE
749
+ relation_type = ?
750
+ AND %s
751
+ AND %s
752
+ GROUP BY parent.event_id, child.sender
753
+ """
754
+
755
+ def _get_threaded_messages_per_user_txn(
756
+ txn: LoggingTransaction,
757
+ ) -> dict[tuple[str, str], int]:
758
+ users_sql, users_args = make_in_list_sql_clause(
759
+ self.database_engine, "child.sender", users
760
+ )
761
+ events_clause, events_args = make_in_list_sql_clause(
762
+ txn.database_engine, "relates_to_id", event_ids
763
+ )
764
+
765
+ txn.execute(
766
+ sql % (users_sql, events_clause),
767
+ [RelationTypes.THREAD] + users_args + events_args,
768
+ )
769
+ return {(row[0], row[1]): row[2] for row in txn}
770
+
771
+ return await self.db_pool.runInteraction(
772
+ "get_threaded_messages_per_user", _get_threaded_messages_per_user_txn
773
+ )
774
+
775
+ @cached()
776
+ def get_thread_participated(self, event_id: str, user_id: str) -> bool:
777
+ raise NotImplementedError()
778
+
779
+ @cachedList(cached_method_name="get_thread_participated", list_name="event_ids")
780
+ async def get_threads_participated(
781
+ self, event_ids: Collection[str], user_id: str
782
+ ) -> Mapping[str, bool]:
783
+ """Get whether the requesting user participated in the given threads.
784
+
785
+ This is separate from get_thread_summaries since that can be cached across
786
+ all users while this value is specific to the requester.
787
+
788
+ Args:
789
+ event_ids: The thread related to these event IDs.
790
+ user_id: The user requesting the summary.
791
+
792
+ Returns:
793
+ A map of event ID to a boolean which represents if the requesting
794
+ user participated in that event's thread, otherwise false.
795
+ """
796
+
797
+ def _get_threads_participated_txn(txn: LoggingTransaction) -> set[str]:
798
+ # Fetch whether the requester has participated or not.
799
+ sql = """
800
+ SELECT DISTINCT relates_to_id
801
+ FROM events AS child
802
+ INNER JOIN event_relations USING (event_id)
803
+ INNER JOIN events AS parent ON
804
+ parent.event_id = relates_to_id
805
+ AND parent.room_id = child.room_id
806
+ WHERE
807
+ %s
808
+ AND relation_type = ?
809
+ AND child.sender = ?
810
+ """
811
+
812
+ clause, args = make_in_list_sql_clause(
813
+ txn.database_engine, "relates_to_id", event_ids
814
+ )
815
+ args.extend([RelationTypes.THREAD, user_id])
816
+
817
+ txn.execute(sql % (clause,), args)
818
+ return {row[0] for row in txn.fetchall()}
819
+
820
+ participated_threads = await self.db_pool.runInteraction(
821
+ "get_threads_participated", _get_threads_participated_txn
822
+ )
823
+
824
+ return {event_id: event_id in participated_threads for event_id in event_ids}
825
+
826
+ async def events_have_relations(
827
+ self,
828
+ parent_ids: list[str],
829
+ relation_senders: Optional[list[str]],
830
+ relation_types: Optional[list[str]],
831
+ ) -> list[str]:
832
+ """Check which events have a relationship from the given senders of the
833
+ given types.
834
+
835
+ Args:
836
+ parent_ids: The events being annotated
837
+ relation_senders: The relation senders to check.
838
+ relation_types: The relation types to check.
839
+
840
+ Returns:
841
+ True if the event has at least one relationship from one of the given senders of the given type.
842
+ """
843
+ # If no restrictions are given then the event has the required relations.
844
+ if not relation_senders and not relation_types:
845
+ return parent_ids
846
+
847
+ sql = """
848
+ SELECT relates_to_id FROM event_relations
849
+ INNER JOIN events USING (event_id)
850
+ WHERE
851
+ %s;
852
+ """
853
+
854
+ def _get_if_events_have_relations(txn: LoggingTransaction) -> list[str]:
855
+ clauses: list[str] = []
856
+ clause, args = make_in_list_sql_clause(
857
+ txn.database_engine, "relates_to_id", parent_ids
858
+ )
859
+ clauses.append(clause)
860
+
861
+ if relation_senders:
862
+ clause, temp_args = make_in_list_sql_clause(
863
+ txn.database_engine, "sender", relation_senders
864
+ )
865
+ clauses.append(clause)
866
+ args.extend(temp_args)
867
+ if relation_types:
868
+ clause, temp_args = make_in_list_sql_clause(
869
+ txn.database_engine, "relation_type", relation_types
870
+ )
871
+ clauses.append(clause)
872
+ args.extend(temp_args)
873
+
874
+ txn.execute(sql % " AND ".join(clauses), args)
875
+
876
+ return [row[0] for row in txn]
877
+
878
+ return await self.db_pool.runInteraction(
879
+ "get_if_events_have_relations", _get_if_events_have_relations
880
+ )
881
+
882
+ async def has_user_annotated_event(
883
+ self, parent_id: str, event_type: str, aggregation_key: str, sender: str
884
+ ) -> bool:
885
+ """Check if a user has already annotated an event with the same key
886
+ (e.g. already liked an event).
887
+
888
+ Args:
889
+ parent_id: The event being annotated
890
+ event_type: The event type of the annotation
891
+ aggregation_key: The aggregation key of the annotation
892
+ sender: The sender of the annotation
893
+
894
+ Returns:
895
+ True if the event is already annotated.
896
+ """
897
+
898
+ sql = """
899
+ SELECT 1 FROM event_relations
900
+ INNER JOIN events USING (event_id)
901
+ WHERE
902
+ relates_to_id = ?
903
+ AND relation_type = ?
904
+ AND type = ?
905
+ AND sender = ?
906
+ AND aggregation_key = ?
907
+ LIMIT 1;
908
+ """
909
+
910
+ def _get_if_user_has_annotated_event(txn: LoggingTransaction) -> bool:
911
+ txn.execute(
912
+ sql,
913
+ (
914
+ parent_id,
915
+ RelationTypes.ANNOTATION,
916
+ event_type,
917
+ sender,
918
+ aggregation_key,
919
+ ),
920
+ )
921
+
922
+ return bool(txn.fetchone())
923
+
924
+ return await self.db_pool.runInteraction(
925
+ "get_if_user_has_annotated_event", _get_if_user_has_annotated_event
926
+ )
927
+
928
+ @cached(tree=True)
929
+ async def get_threads(
930
+ self,
931
+ room_id: str,
932
+ limit: int = 5,
933
+ from_token: Optional[ThreadsNextBatch] = None,
934
+ ) -> tuple[Sequence[str], Optional[ThreadsNextBatch]]:
935
+ """Get a list of thread IDs, ordered by topological ordering of their
936
+ latest reply.
937
+
938
+ Args:
939
+ room_id: The room the event belongs to.
940
+ limit: Only fetch the most recent `limit` threads.
941
+ from_token: Fetch rows from a previous next_batch, or from the start if None.
942
+
943
+ Returns:
944
+ A tuple of:
945
+ A list of thread root event IDs.
946
+
947
+ The next_batch, if one exists.
948
+ """
949
+ # Generate the pagination clause, if necessary.
950
+ #
951
+ # Find any threads where the latest reply is equal / before the last
952
+ # thread's topo ordering and earlier in stream ordering.
953
+ pagination_clause = ""
954
+ pagination_args: tuple = ()
955
+ if from_token:
956
+ pagination_clause = "AND topological_ordering <= ? AND stream_ordering < ?"
957
+ pagination_args = (
958
+ from_token.topological_ordering,
959
+ from_token.stream_ordering,
960
+ )
961
+
962
+ sql = f"""
963
+ SELECT thread_id, topological_ordering, stream_ordering
964
+ FROM threads
965
+ WHERE
966
+ room_id = ?
967
+ {pagination_clause}
968
+ ORDER BY topological_ordering DESC, stream_ordering DESC
969
+ LIMIT ?
970
+ """
971
+
972
+ def _get_threads_txn(
973
+ txn: LoggingTransaction,
974
+ ) -> tuple[list[str], Optional[ThreadsNextBatch]]:
975
+ txn.execute(sql, (room_id, *pagination_args, limit + 1))
976
+
977
+ rows = cast(list[tuple[str, int, int]], txn.fetchall())
978
+ thread_ids = [r[0] for r in rows]
979
+
980
+ # If there are more events, generate the next pagination key from the
981
+ # last thread which will be returned.
982
+ next_token = None
983
+ if len(thread_ids) > limit:
984
+ last_topo_id = rows[-2][1]
985
+ last_stream_id = rows[-2][2]
986
+ next_token = ThreadsNextBatch(last_topo_id, last_stream_id)
987
+
988
+ return thread_ids[:limit], next_token
989
+
990
+ return await self.db_pool.runInteraction("get_threads", _get_threads_txn)
991
+
992
+ @cached()
993
+ async def get_thread_id(self, event_id: str) -> str:
994
+ """
995
+ Get the thread ID for an event. This considers multi-level relations,
996
+ e.g. an annotation to an event which is part of a thread.
997
+
998
+ It only searches up the relations tree, i.e. it only searches for events
999
+ which the given event is related to (and which those events are related
1000
+ to, etc.)
1001
+
1002
+ Given the following DAG:
1003
+
1004
+ A <---[m.thread]-- B <--[m.annotation]-- C
1005
+ ^
1006
+ |--[m.reference]-- D <--[m.annotation]-- E
1007
+
1008
+ get_thread_id(X) considers events B and C as part of thread A.
1009
+
1010
+ See also get_thread_id_for_receipts.
1011
+
1012
+ Args:
1013
+ event_id: The event ID to fetch the thread ID for.
1014
+
1015
+ Returns:
1016
+ The event ID of the root event in the thread, if this event is part
1017
+ of a thread. "main", otherwise.
1018
+ """
1019
+
1020
+ # Recurse event relations up to the *root* event, then search that chain
1021
+ # of relations for a thread relation. If one is found, the root event is
1022
+ # returned.
1023
+ #
1024
+ # Note that this should only ever find 0 or 1 entries since it is invalid
1025
+ # for an event to have a thread relation to an event which also has a
1026
+ # relation.
1027
+ sql = """
1028
+ WITH RECURSIVE related_events AS (
1029
+ SELECT event_id, relates_to_id, relation_type, 0 AS depth
1030
+ FROM event_relations
1031
+ WHERE event_id = ?
1032
+ UNION SELECT e.event_id, e.relates_to_id, e.relation_type, depth + 1
1033
+ FROM event_relations e
1034
+ INNER JOIN related_events r ON r.relates_to_id = e.event_id
1035
+ WHERE depth <= 3
1036
+ )
1037
+ SELECT relates_to_id FROM related_events
1038
+ WHERE relation_type = 'm.thread'
1039
+ ORDER BY depth DESC
1040
+ LIMIT 1;
1041
+ """
1042
+
1043
+ def _get_thread_id(txn: LoggingTransaction) -> str:
1044
+ txn.execute(sql, (event_id,))
1045
+ row = txn.fetchone()
1046
+ if row:
1047
+ return row[0]
1048
+
1049
+ # If no thread was found, it is part of the main timeline.
1050
+ return MAIN_TIMELINE
1051
+
1052
+ return await self.db_pool.runInteraction("get_thread_id", _get_thread_id)
1053
+
1054
+ @cached()
1055
+ async def get_thread_id_for_receipts(self, event_id: str) -> str:
1056
+ """
1057
+ Get the thread ID for an event by traversing to the top-most related event
1058
+ and confirming any children events form a thread.
1059
+
1060
+ Given the following DAG:
1061
+
1062
+ A <---[m.thread]-- B <--[m.annotation]-- C
1063
+ ^
1064
+ |--[m.reference]-- D <--[m.annotation]-- E
1065
+
1066
+ get_thread_id_for_receipts(X) considers events A, B, C, D, and E as part
1067
+ of thread A.
1068
+
1069
+ See also get_thread_id.
1070
+
1071
+ Args:
1072
+ event_id: The event ID to fetch the thread ID for.
1073
+
1074
+ Returns:
1075
+ The event ID of the root event in the thread, if this event is part
1076
+ of a thread. "main", otherwise.
1077
+ """
1078
+
1079
+ # Recurse event relations up to the *root* event, then search for any events
1080
+ # related to that root node for a thread relation. If one is found, the
1081
+ # root event is returned.
1082
+ #
1083
+ # Note that there cannot be thread relations in the middle of the chain since
1084
+ # it is invalid for an event to have a thread relation to an event which also
1085
+ # has a relation.
1086
+ sql = """
1087
+ SELECT relates_to_id FROM event_relations WHERE relates_to_id = COALESCE((
1088
+ WITH RECURSIVE related_events AS (
1089
+ SELECT event_id, relates_to_id, relation_type, 0 AS depth
1090
+ FROM event_relations
1091
+ WHERE event_id = ?
1092
+ UNION SELECT e.event_id, e.relates_to_id, e.relation_type, depth + 1
1093
+ FROM event_relations e
1094
+ INNER JOIN related_events r ON r.relates_to_id = e.event_id
1095
+ WHERE depth <= 3
1096
+ )
1097
+ SELECT relates_to_id FROM related_events
1098
+ ORDER BY depth DESC
1099
+ LIMIT 1
1100
+ ), ?) AND relation_type = 'm.thread' LIMIT 1;
1101
+ """
1102
+
1103
+ def _get_related_thread_id(txn: LoggingTransaction) -> str:
1104
+ txn.execute(sql, (event_id, event_id))
1105
+ row = txn.fetchone()
1106
+ if row:
1107
+ return row[0]
1108
+
1109
+ # If no thread was found, it is part of the main timeline.
1110
+ return MAIN_TIMELINE
1111
+
1112
+ return await self.db_pool.runInteraction(
1113
+ "get_related_thread_id", _get_related_thread_id
1114
+ )
1115
+
1116
+
1117
+ class RelationsStore(RelationsWorkerStore):
1118
+ pass