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,1239 @@
1
+ #
2
+ # This file is licensed under the Affero General Public License (AGPL) version 3.
3
+ #
4
+ # Copyright 2019 The Matrix.org Foundation C.I.C.
5
+ # Copyright 2014-2016 OpenMarket Ltd
6
+ # Copyright (C) 2023 New Vector, Ltd
7
+ #
8
+ # This program is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU Affero General Public License as
10
+ # published by the Free Software Foundation, either version 3 of the
11
+ # License, or (at your option) any later version.
12
+ #
13
+ # See the GNU Affero General Public License for more details:
14
+ # <https://www.gnu.org/licenses/agpl-3.0.html>.
15
+ #
16
+ # Originally licensed under the Apache License, Version 2.0:
17
+ # <http://www.apache.org/licenses/LICENSE-2.0>.
18
+ #
19
+ # [This file includes modifications made by New Vector Limited]
20
+ #
21
+ #
22
+
23
+ import itertools
24
+ import logging
25
+ from collections import deque
26
+ from typing import (
27
+ TYPE_CHECKING,
28
+ AbstractSet,
29
+ Any,
30
+ Awaitable,
31
+ Callable,
32
+ ClassVar,
33
+ Collection,
34
+ Generator,
35
+ Generic,
36
+ Iterable,
37
+ Optional,
38
+ TypeVar,
39
+ Union,
40
+ )
41
+
42
+ import attr
43
+ from prometheus_client import Counter, Histogram
44
+
45
+ from twisted.internet import defer
46
+
47
+ from synapse.api.constants import EventTypes, Membership
48
+ from synapse.events import EventBase
49
+ from synapse.events.snapshot import EventContext, EventPersistencePair
50
+ from synapse.handlers.worker_lock import NEW_EVENT_DURING_PURGE_LOCK_NAME
51
+ from synapse.logging.context import PreserveLoggingContext, make_deferred_yieldable
52
+ from synapse.logging.opentracing import (
53
+ SynapseTags,
54
+ active_span,
55
+ set_tag,
56
+ start_active_span_follows_from,
57
+ trace,
58
+ )
59
+ from synapse.metrics import SERVER_NAME_LABEL
60
+ from synapse.storage.controllers.state import StateStorageController
61
+ from synapse.storage.databases import Databases
62
+ from synapse.storage.databases.main.events import DeltaState
63
+ from synapse.storage.databases.main.events_worker import EventRedactBehaviour
64
+ from synapse.types import (
65
+ PersistedEventPosition,
66
+ RoomStreamToken,
67
+ StateMap,
68
+ get_domain_from_id,
69
+ )
70
+ from synapse.types.state import StateFilter
71
+ from synapse.util.async_helpers import ObservableDeferred, yieldable_gather_results
72
+ from synapse.util.metrics import Measure
73
+
74
+ if TYPE_CHECKING:
75
+ from synapse.server import HomeServer
76
+
77
+ logger = logging.getLogger(__name__)
78
+
79
+ # The number of times we are recalculating the current state
80
+ state_delta_counter = Counter(
81
+ "synapse_storage_events_state_delta", "", labelnames=[SERVER_NAME_LABEL]
82
+ )
83
+
84
+ # The number of times we are recalculating state when there is only a
85
+ # single forward extremity
86
+ state_delta_single_event_counter = Counter(
87
+ "synapse_storage_events_state_delta_single_event",
88
+ "",
89
+ labelnames=[SERVER_NAME_LABEL],
90
+ )
91
+
92
+ # The number of times we are reculating state when we could have resonably
93
+ # calculated the delta when we calculated the state for an event we were
94
+ # persisting.
95
+ state_delta_reuse_delta_counter = Counter(
96
+ "synapse_storage_events_state_delta_reuse_delta", "", labelnames=[SERVER_NAME_LABEL]
97
+ )
98
+
99
+ # The number of forward extremities for each new event.
100
+ forward_extremities_counter = Histogram(
101
+ "synapse_storage_events_forward_extremities_persisted",
102
+ "Number of forward extremities for each new event",
103
+ labelnames=[SERVER_NAME_LABEL],
104
+ buckets=(1, 2, 3, 5, 7, 10, 15, 20, 50, 100, 200, 500, "+Inf"),
105
+ )
106
+
107
+ # The number of stale forward extremities for each new event. Stale extremities
108
+ # are those that were in the previous set of extremities as well as the new.
109
+ stale_forward_extremities_counter = Histogram(
110
+ "synapse_storage_events_stale_forward_extremities_persisted",
111
+ "Number of unchanged forward extremities for each new event",
112
+ labelnames=[SERVER_NAME_LABEL],
113
+ buckets=(0, 1, 2, 3, 5, 7, 10, 15, 20, 50, 100, 200, 500, "+Inf"),
114
+ )
115
+
116
+ state_resolutions_during_persistence = Counter(
117
+ "synapse_storage_events_state_resolutions_during_persistence",
118
+ "Number of times we had to do state res to calculate new current state",
119
+ labelnames=[SERVER_NAME_LABEL],
120
+ )
121
+
122
+ potential_times_prune_extremities = Counter(
123
+ "synapse_storage_events_potential_times_prune_extremities",
124
+ "Number of times we might be able to prune extremities",
125
+ labelnames=[SERVER_NAME_LABEL],
126
+ )
127
+
128
+ times_pruned_extremities = Counter(
129
+ "synapse_storage_events_times_pruned_extremities",
130
+ "Number of times we were actually be able to prune extremities",
131
+ labelnames=[SERVER_NAME_LABEL],
132
+ )
133
+
134
+
135
+ @attr.s(auto_attribs=True, slots=True)
136
+ class _PersistEventsTask:
137
+ """A batch of events to persist."""
138
+
139
+ name: ClassVar[str] = "persist_event_batch" # used for opentracing
140
+
141
+ events_and_contexts: list[EventPersistencePair]
142
+ backfilled: bool
143
+
144
+ def try_merge(self, task: "_EventPersistQueueTask") -> bool:
145
+ """Batches events with the same backfilled option together."""
146
+ if (
147
+ not isinstance(task, _PersistEventsTask)
148
+ or self.backfilled != task.backfilled
149
+ ):
150
+ return False
151
+
152
+ self.events_and_contexts.extend(task.events_and_contexts)
153
+ return True
154
+
155
+
156
+ @attr.s(auto_attribs=True, slots=True)
157
+ class _UpdateCurrentStateTask:
158
+ """A room whose current state needs recalculating."""
159
+
160
+ name: ClassVar[str] = "update_current_state" # used for opentracing
161
+
162
+ def try_merge(self, task: "_EventPersistQueueTask") -> bool:
163
+ """Deduplicates consecutive recalculations of current state."""
164
+ return isinstance(task, _UpdateCurrentStateTask)
165
+
166
+
167
+ _EventPersistQueueTask = Union[_PersistEventsTask, _UpdateCurrentStateTask]
168
+ _PersistResult = TypeVar("_PersistResult")
169
+
170
+
171
+ @attr.s(auto_attribs=True, slots=True)
172
+ class _EventPersistQueueItem(Generic[_PersistResult]):
173
+ task: _EventPersistQueueTask
174
+ deferred: ObservableDeferred[_PersistResult]
175
+
176
+ parent_opentracing_span_contexts: list = attr.ib(factory=list)
177
+ """A list of opentracing spans waiting for this batch"""
178
+
179
+ opentracing_span_context: Any = None
180
+ """The opentracing span under which the persistence actually happened"""
181
+
182
+
183
+ class _EventPeristenceQueue(Generic[_PersistResult]):
184
+ """Queues up tasks so that they can be processed with only one concurrent
185
+ transaction per room.
186
+
187
+ Tasks can be bulk persistence of events or recalculation of a room's current state.
188
+ """
189
+
190
+ def __init__(
191
+ self,
192
+ hs: "HomeServer",
193
+ server_name: str,
194
+ per_item_callback: Callable[
195
+ [str, _EventPersistQueueTask],
196
+ Awaitable[_PersistResult],
197
+ ],
198
+ ):
199
+ """Create a new event persistence queue
200
+
201
+ The per_item_callback will be called for each item added via add_to_queue,
202
+ and its result will be returned via the Deferreds returned from add_to_queue.
203
+ """
204
+ self.server_name = server_name
205
+ self.hs = hs
206
+ self._event_persist_queues: dict[str, deque[_EventPersistQueueItem]] = {}
207
+ self._currently_persisting_rooms: set[str] = set()
208
+ self._per_item_callback = per_item_callback
209
+
210
+ async def add_to_queue(
211
+ self,
212
+ room_id: str,
213
+ task: _EventPersistQueueTask,
214
+ ) -> _PersistResult:
215
+ """Add a task to the queue.
216
+
217
+ If we are not already processing tasks in this room, starts off a background
218
+ process to to so, calling the per_item_callback for each item.
219
+
220
+ Args:
221
+ room_id:
222
+ task: A _PersistEventsTask or _UpdateCurrentStateTask to process.
223
+
224
+ Returns:
225
+ the result returned by the `_per_item_callback` passed to
226
+ `__init__`.
227
+ """
228
+ queue = self._event_persist_queues.setdefault(room_id, deque())
229
+
230
+ if queue and queue[-1].task.try_merge(task):
231
+ # the new task has been merged into the last task in the queue
232
+ end_item = queue[-1]
233
+ else:
234
+ deferred: ObservableDeferred[_PersistResult] = ObservableDeferred(
235
+ defer.Deferred(), consumeErrors=True
236
+ )
237
+
238
+ end_item = _EventPersistQueueItem(
239
+ task=task,
240
+ deferred=deferred,
241
+ )
242
+ queue.append(end_item)
243
+
244
+ # also add our active opentracing span to the item so that we get a link back
245
+ span = active_span()
246
+ if span:
247
+ end_item.parent_opentracing_span_contexts.append(span.context)
248
+
249
+ # start a processor for the queue, if there isn't one already
250
+ self._handle_queue(room_id)
251
+
252
+ # wait for the queue item to complete
253
+ res = await make_deferred_yieldable(end_item.deferred.observe())
254
+
255
+ # add another opentracing span which links to the persist trace.
256
+ with start_active_span_follows_from(
257
+ f"{task.name}_complete", (end_item.opentracing_span_context,)
258
+ ):
259
+ pass
260
+
261
+ return res
262
+
263
+ def _handle_queue(self, room_id: str) -> None:
264
+ """Attempts to handle the queue for a room if not already being handled.
265
+
266
+ The queue's callback will be invoked with for each item in the queue,
267
+ of type _EventPersistQueueItem. The per_item_callback will continuously
268
+ be called with new items, unless the queue becomes empty. The return
269
+ value of the function will be given to the deferreds waiting on the item,
270
+ exceptions will be passed to the deferreds as well.
271
+
272
+ This function should therefore be called whenever anything is added
273
+ to the queue.
274
+
275
+ If another callback is currently handling the queue then it will not be
276
+ invoked.
277
+ """
278
+ if room_id in self._currently_persisting_rooms:
279
+ return
280
+
281
+ self._currently_persisting_rooms.add(room_id)
282
+
283
+ async def handle_queue_loop() -> None:
284
+ try:
285
+ queue = self._get_drainining_queue(room_id)
286
+ for item in queue:
287
+ try:
288
+ with start_active_span_follows_from(
289
+ item.task.name,
290
+ item.parent_opentracing_span_contexts,
291
+ inherit_force_tracing=True,
292
+ ) as scope:
293
+ if scope:
294
+ item.opentracing_span_context = scope.span.context
295
+
296
+ ret = await self._per_item_callback(room_id, item.task)
297
+ except Exception:
298
+ with PreserveLoggingContext():
299
+ item.deferred.errback()
300
+ else:
301
+ with PreserveLoggingContext():
302
+ item.deferred.callback(ret)
303
+ finally:
304
+ remaining_queue = self._event_persist_queues.pop(room_id, None)
305
+ if remaining_queue:
306
+ self._event_persist_queues[room_id] = remaining_queue
307
+ self._currently_persisting_rooms.discard(room_id)
308
+
309
+ # set handle_queue_loop off in the background
310
+ self.hs.run_as_background_process("persist_events", handle_queue_loop)
311
+
312
+ def _get_drainining_queue(
313
+ self, room_id: str
314
+ ) -> Generator[_EventPersistQueueItem, None, None]:
315
+ queue = self._event_persist_queues.setdefault(room_id, deque())
316
+
317
+ try:
318
+ while True:
319
+ yield queue.popleft()
320
+ except IndexError:
321
+ # Queue has been drained.
322
+ pass
323
+
324
+
325
+ class EventsPersistenceStorageController:
326
+ """High level interface for handling persisting newly received events.
327
+
328
+ Takes care of batching up events by room, and calculating the necessary
329
+ current state and forward extremity changes.
330
+ """
331
+
332
+ def __init__(
333
+ self,
334
+ hs: "HomeServer",
335
+ stores: Databases,
336
+ state_controller: StateStorageController,
337
+ ):
338
+ # We ultimately want to split out the state store from the main store,
339
+ # so we use separate variables here even though they point to the same
340
+ # store for now.
341
+ self.main_store = stores.main
342
+ self.state_store = stores.state
343
+ self._state_deletion_store = stores.state_deletion
344
+
345
+ assert stores.persist_events
346
+ self.persist_events_store = stores.persist_events
347
+
348
+ self.server_name = hs.hostname
349
+ self._clock = hs.get_clock()
350
+ self._instance_name = hs.get_instance_name()
351
+ self.is_mine_id = hs.is_mine_id
352
+ self._event_persist_queue = _EventPeristenceQueue(
353
+ hs, self.server_name, self._process_event_persist_queue_task
354
+ )
355
+ self._state_resolution_handler = hs.get_state_resolution_handler()
356
+ self._state_controller = state_controller
357
+ self.hs = hs
358
+
359
+ async def _process_event_persist_queue_task(
360
+ self,
361
+ room_id: str,
362
+ task: _EventPersistQueueTask,
363
+ ) -> dict[str, str]:
364
+ """Callback for the _event_persist_queue
365
+
366
+ Returns:
367
+ A dictionary of event ID to event ID we didn't persist as we already
368
+ had another event persisted with the same TXN ID.
369
+ """
370
+
371
+ # Ensure that the room can't be deleted while we're persisting events to
372
+ # it. We might already have taken out the lock, but since this is just a
373
+ # "read" lock its inherently reentrant.
374
+ async with self.hs.get_worker_locks_handler().acquire_read_write_lock(
375
+ NEW_EVENT_DURING_PURGE_LOCK_NAME, room_id, write=False
376
+ ):
377
+ if isinstance(task, _PersistEventsTask):
378
+ return await self._persist_event_batch(room_id, task)
379
+ elif isinstance(task, _UpdateCurrentStateTask):
380
+ await self._update_current_state(room_id, task)
381
+ return {}
382
+ else:
383
+ raise AssertionError(
384
+ f"Found an unexpected task type in event persistence queue: {task}"
385
+ )
386
+
387
+ @trace
388
+ async def persist_events(
389
+ self,
390
+ events_and_contexts: Iterable[EventPersistencePair],
391
+ backfilled: bool = False,
392
+ ) -> tuple[list[EventBase], RoomStreamToken]:
393
+ """
394
+ Write events to the database
395
+ Args:
396
+ events_and_contexts: list of tuples of (event, context)
397
+ backfilled: Whether the results are retrieved from federation
398
+ via backfill or not. Used to determine if they're "new" events
399
+ which might update the current state etc.
400
+
401
+ Returns:
402
+ List of events persisted, the current position room stream position.
403
+ The list of events persisted may not be the same as those passed in
404
+ if they were deduplicated due to an event already existing that
405
+ matched the transaction ID; the existing event is returned in such
406
+ a case.
407
+
408
+ Raises:
409
+ PartialStateConflictError: if attempting to persist a partial state event in
410
+ a room that has been un-partial stated.
411
+ """
412
+ event_ids: list[str] = []
413
+ partitioned: dict[str, list[EventPersistencePair]] = {}
414
+ for event, ctx in events_and_contexts:
415
+ partitioned.setdefault(event.room_id, []).append((event, ctx))
416
+ event_ids.append(event.event_id)
417
+
418
+ set_tag(
419
+ SynapseTags.FUNC_ARG_PREFIX + "event_ids",
420
+ str(event_ids),
421
+ )
422
+ set_tag(
423
+ SynapseTags.FUNC_ARG_PREFIX + "event_ids.length",
424
+ str(len(event_ids)),
425
+ )
426
+ set_tag(SynapseTags.FUNC_ARG_PREFIX + "backfilled", str(backfilled))
427
+
428
+ async def enqueue(
429
+ item: tuple[str, list[EventPersistencePair]],
430
+ ) -> dict[str, str]:
431
+ room_id, evs_ctxs = item
432
+ return await self._event_persist_queue.add_to_queue(
433
+ room_id,
434
+ _PersistEventsTask(events_and_contexts=evs_ctxs, backfilled=backfilled),
435
+ )
436
+
437
+ ret_vals = await yieldable_gather_results(enqueue, partitioned.items())
438
+
439
+ # Each call to add_to_queue returns a map from event ID to existing event ID if
440
+ # the event was deduplicated. (The dict may also include other entries if
441
+ # the event was persisted in a batch with other events).
442
+ #
443
+ # Since we use `yieldable_gather_results` we need to merge the returned list
444
+ # of dicts into one.
445
+ replaced_events: dict[str, str] = {}
446
+ for d in ret_vals:
447
+ replaced_events.update(d)
448
+
449
+ persisted_events = []
450
+ for event, _ in events_and_contexts:
451
+ existing_event_id = replaced_events.get(event.event_id)
452
+ if existing_event_id:
453
+ persisted_events.append(
454
+ await self.main_store.get_event(existing_event_id)
455
+ )
456
+ else:
457
+ persisted_events.append(event)
458
+
459
+ return (
460
+ persisted_events,
461
+ self.main_store.get_room_max_token(),
462
+ )
463
+
464
+ @trace
465
+ async def persist_event(
466
+ self, event: EventBase, context: EventContext, backfilled: bool = False
467
+ ) -> tuple[EventBase, PersistedEventPosition, RoomStreamToken]:
468
+ """
469
+ Returns:
470
+ The event, stream ordering of `event`, and the stream ordering of the
471
+ latest persisted event. The returned event may not match the given
472
+ event if it was deduplicated due to an existing event matching the
473
+ transaction ID.
474
+
475
+ Raises:
476
+ PartialStateConflictError: if attempting to persist a partial state event in
477
+ a room that has been un-partial stated.
478
+ """
479
+ # add_to_queue returns a map from event ID to existing event ID if the
480
+ # event was deduplicated. (The dict may also include other entries if
481
+ # the event was persisted in a batch with other events.)
482
+ replaced_events = await self._event_persist_queue.add_to_queue(
483
+ event.room_id,
484
+ _PersistEventsTask(
485
+ events_and_contexts=[(event, context)], backfilled=backfilled
486
+ ),
487
+ )
488
+ replaced_event = replaced_events.get(event.event_id)
489
+ if replaced_event:
490
+ event = await self.main_store.get_event(replaced_event)
491
+
492
+ event_stream_id = event.internal_metadata.stream_ordering
493
+ # stream ordering should have been assigned by now
494
+ assert event_stream_id
495
+
496
+ pos = PersistedEventPosition(self._instance_name, event_stream_id)
497
+ return event, pos, self.main_store.get_room_max_token()
498
+
499
+ async def update_current_state(self, room_id: str) -> None:
500
+ """Recalculate the current state for a room, and persist it"""
501
+ await self._event_persist_queue.add_to_queue(
502
+ room_id,
503
+ _UpdateCurrentStateTask(),
504
+ )
505
+
506
+ async def _update_current_state(
507
+ self, room_id: str, _task: _UpdateCurrentStateTask
508
+ ) -> None:
509
+ """Callback for the _event_persist_queue
510
+
511
+ Recalculates the current state for a room, and persists it.
512
+ """
513
+ state = await self._calculate_current_state(room_id)
514
+ delta = await self._calculate_state_delta(room_id, state)
515
+ sliding_sync_table_changes = (
516
+ await self.persist_events_store._calculate_sliding_sync_table_changes(
517
+ room_id, [], delta
518
+ )
519
+ )
520
+
521
+ await self.persist_events_store.update_current_state(
522
+ room_id, delta, sliding_sync_table_changes
523
+ )
524
+
525
+ async def _calculate_current_state(self, room_id: str) -> StateMap[str]:
526
+ """Calculate the current state of a room, based on the forward extremities
527
+
528
+ Args:
529
+ room_id: room for which to calculate current state
530
+
531
+ Returns:
532
+ map from (type, state_key) to event id for the current state in the room
533
+ """
534
+ latest_event_ids = await self.main_store.get_latest_event_ids_in_room(room_id)
535
+ state_groups = set(
536
+ (
537
+ await self.main_store._get_state_group_for_events(latest_event_ids)
538
+ ).values()
539
+ )
540
+
541
+ state_maps_by_state_group = await self.state_store._get_state_for_groups(
542
+ state_groups
543
+ )
544
+
545
+ if len(state_groups) == 1:
546
+ # If there is only one state group, then we know what the current
547
+ # state is.
548
+ return state_maps_by_state_group[state_groups.pop()]
549
+
550
+ # Ok, we need to defer to the state handler to resolve our state sets.
551
+ logger.debug("calling resolve_state_groups from preserve_events")
552
+
553
+ # Avoid a circular import.
554
+ from synapse.state import StateResolutionStore
555
+
556
+ room_version = await self.main_store.get_room_version_id(room_id)
557
+ res = await self._state_resolution_handler.resolve_state_groups(
558
+ room_id,
559
+ room_version,
560
+ state_maps_by_state_group,
561
+ event_map=None,
562
+ state_res_store=StateResolutionStore(
563
+ self.main_store, self._state_deletion_store
564
+ ),
565
+ )
566
+
567
+ return await res.get_state(self._state_controller, StateFilter.all())
568
+
569
+ async def _persist_event_batch(
570
+ self, room_id: str, task: _PersistEventsTask
571
+ ) -> dict[str, str]:
572
+ """Callback for the _event_persist_queue
573
+
574
+ Calculates the change to current state and forward extremities, and
575
+ persists the given events and with those updates.
576
+
577
+ Assumes that we are only persisting events for one room at a time.
578
+
579
+ Returns:
580
+ A dictionary of event ID to event ID we didn't persist as we already
581
+ had another event persisted with the same TXN ID.
582
+
583
+ Raises:
584
+ PartialStateConflictError: if attempting to persist a partial state event in
585
+ a room that has been un-partial stated.
586
+ """
587
+ events_and_contexts = task.events_and_contexts
588
+ backfilled = task.backfilled
589
+
590
+ replaced_events: dict[str, str] = {}
591
+ if not events_and_contexts:
592
+ return replaced_events
593
+
594
+ # Check if any of the events have a transaction ID that has already been
595
+ # persisted, and if so we don't persist it again.
596
+ #
597
+ # We should have checked this a long time before we get here, but it's
598
+ # possible that different send event requests race in such a way that
599
+ # they both pass the earlier checks. Checking here isn't racey as we can
600
+ # have only one `_persist_events` per room being called at a time.
601
+ replaced_events = await self.main_store.get_already_persisted_events(
602
+ (event for event, _ in events_and_contexts)
603
+ )
604
+
605
+ if replaced_events:
606
+ events_and_contexts = [
607
+ (e, ctx)
608
+ for e, ctx in events_and_contexts
609
+ if e.event_id not in replaced_events
610
+ ]
611
+
612
+ if not events_and_contexts:
613
+ return replaced_events
614
+
615
+ chunks = [
616
+ events_and_contexts[x : x + 100]
617
+ for x in range(0, len(events_and_contexts), 100)
618
+ ]
619
+
620
+ for chunk in chunks:
621
+ # We can't easily parallelize these since different chunks
622
+ # might contain the same event. :(
623
+
624
+ new_forward_extremities = None
625
+ state_delta_for_room = None
626
+
627
+ if not backfilled:
628
+ with Measure(
629
+ self._clock,
630
+ name="_calculate_state_and_extrem",
631
+ server_name=self.server_name,
632
+ ):
633
+ # Work out the new "current state" for the room.
634
+ # We do this by working out what the new extremities are and then
635
+ # calculating the state from that.
636
+ (
637
+ new_forward_extremities,
638
+ state_delta_for_room,
639
+ ) = await self._calculate_new_forward_extremities_and_state_delta(
640
+ room_id, chunk
641
+ )
642
+
643
+ with Measure(
644
+ self._clock,
645
+ name="calculate_chain_cover_index_for_events",
646
+ server_name=self.server_name,
647
+ ):
648
+ # We now calculate chain ID/sequence numbers for any state events we're
649
+ # persisting. We ignore out of band memberships as we're not in the room
650
+ # and won't have their auth chain (we'll fix it up later if we join the
651
+ # room).
652
+ #
653
+ # See: docs/auth_chain_difference_algorithm.md
654
+ new_event_links = await self.persist_events_store.calculate_chain_cover_index_for_events(
655
+ room_id, [e for e, _ in chunk]
656
+ )
657
+
658
+ # Stop the state groups from being deleted while we're persisting
659
+ # them.
660
+ async with self._state_deletion_store.persisting_state_group_references(
661
+ events_and_contexts
662
+ ):
663
+ await self.persist_events_store._persist_events_and_state_updates(
664
+ room_id,
665
+ chunk,
666
+ state_delta_for_room=state_delta_for_room,
667
+ new_forward_extremities=new_forward_extremities,
668
+ use_negative_stream_ordering=backfilled,
669
+ inhibit_local_membership_updates=backfilled,
670
+ new_event_links=new_event_links,
671
+ )
672
+
673
+ return replaced_events
674
+
675
+ async def _calculate_new_forward_extremities_and_state_delta(
676
+ self, room_id: str, ev_ctx_rm: list[EventPersistencePair]
677
+ ) -> tuple[Optional[set[str]], Optional[DeltaState]]:
678
+ """Calculates the new forward extremities and state delta for a room
679
+ given events to persist.
680
+
681
+ Assumes that we are only persisting events for one room at a time.
682
+
683
+ Returns:
684
+ A tuple of:
685
+ A set of str giving the new forward extremities the room
686
+
687
+ The state delta for the room.
688
+ """
689
+
690
+ latest_event_ids = await self.main_store.get_latest_event_ids_in_room(room_id)
691
+ new_latest_event_ids = await self._calculate_new_extremities(
692
+ room_id, ev_ctx_rm, latest_event_ids
693
+ )
694
+
695
+ if new_latest_event_ids == latest_event_ids:
696
+ # No change in extremities, so no change in state
697
+ return (None, None)
698
+
699
+ # there should always be at least one forward extremity.
700
+ # (except during the initial persistence of the send_join
701
+ # results, in which case there will be no existing
702
+ # extremities, so we'll `continue` above and skip this bit.)
703
+ assert new_latest_event_ids, "No forward extremities left!"
704
+
705
+ new_forward_extremities = new_latest_event_ids
706
+
707
+ len_1 = len(latest_event_ids) == 1 and len(new_latest_event_ids) == 1
708
+ if len_1:
709
+ all_single_prev_not_state = all(
710
+ len(event.prev_event_ids()) == 1 and not event.is_state()
711
+ for event, ctx in ev_ctx_rm
712
+ )
713
+ # Don't bother calculating state if they're just
714
+ # a long chain of single ancestor non-state events.
715
+ if all_single_prev_not_state:
716
+ return (new_forward_extremities, None)
717
+
718
+ state_delta_counter.labels(**{SERVER_NAME_LABEL: self.server_name}).inc()
719
+ if len(new_latest_event_ids) == 1:
720
+ state_delta_single_event_counter.labels(
721
+ **{SERVER_NAME_LABEL: self.server_name}
722
+ ).inc()
723
+
724
+ # This is a fairly handwavey check to see if we could
725
+ # have guessed what the delta would have been when
726
+ # processing one of these events.
727
+ # What we're interested in is if the latest extremities
728
+ # were the same when we created the event as they are
729
+ # now. When this server creates a new event (as opposed
730
+ # to receiving it over federation) it will use the
731
+ # forward extremities as the prev_events, so we can
732
+ # guess this by looking at the prev_events and checking
733
+ # if they match the current forward extremities.
734
+ for ev, _ in ev_ctx_rm:
735
+ prev_event_ids = set(ev.prev_event_ids())
736
+ if latest_event_ids == prev_event_ids:
737
+ state_delta_reuse_delta_counter.labels(
738
+ **{SERVER_NAME_LABEL: self.server_name}
739
+ ).inc()
740
+ break
741
+
742
+ logger.debug("Calculating state delta for room %s", room_id)
743
+ with Measure(
744
+ self._clock,
745
+ name="persist_events.get_new_state_after_events",
746
+ server_name=self.server_name,
747
+ ):
748
+ res = await self._get_new_state_after_events(
749
+ room_id,
750
+ ev_ctx_rm,
751
+ latest_event_ids,
752
+ new_latest_event_ids,
753
+ )
754
+ current_state, delta_ids, new_latest_event_ids = res
755
+
756
+ # there should always be at least one forward extremity.
757
+ # (except during the initial persistence of the send_join
758
+ # results, in which case there will be no existing
759
+ # extremities, so we'll `continue` above and skip this bit.)
760
+ assert new_latest_event_ids, "No forward extremities left!"
761
+
762
+ new_forward_extremities = new_latest_event_ids
763
+
764
+ # If either are not None then there has been a change,
765
+ # and we need to work out the delta (or use that
766
+ # given)
767
+ delta = None
768
+ if delta_ids is not None:
769
+ # If there is a delta we know that we've
770
+ # only added or replaced state, never
771
+ # removed keys entirely.
772
+ delta = DeltaState([], delta_ids)
773
+ elif current_state is not None:
774
+ with Measure(
775
+ self._clock,
776
+ name="persist_events.calculate_state_delta",
777
+ server_name=self.server_name,
778
+ ):
779
+ delta = await self._calculate_state_delta(room_id, current_state)
780
+
781
+ if delta:
782
+ # If we have a change of state then lets check
783
+ # whether we're actually still a member of the room,
784
+ # or if our last user left. If we're no longer in
785
+ # the room then we delete the current state and
786
+ # extremities.
787
+ is_still_joined = await self._is_server_still_joined(
788
+ room_id,
789
+ ev_ctx_rm,
790
+ delta,
791
+ )
792
+ if not is_still_joined:
793
+ logger.info("Server no longer in room %s", room_id)
794
+ delta.no_longer_in_room = True
795
+
796
+ return (new_forward_extremities, delta)
797
+
798
+ async def _calculate_new_extremities(
799
+ self,
800
+ room_id: str,
801
+ event_contexts: list[EventPersistencePair],
802
+ latest_event_ids: AbstractSet[str],
803
+ ) -> set[str]:
804
+ """Calculates the new forward extremities for a room given events to
805
+ persist.
806
+
807
+ Assumes that we are only persisting events for one room at a time.
808
+ """
809
+
810
+ # we're only interested in new events which aren't outliers and which aren't
811
+ # being rejected.
812
+ new_events = [
813
+ event
814
+ for event, ctx in event_contexts
815
+ if not event.internal_metadata.is_outlier()
816
+ and not ctx.rejected
817
+ and not event.internal_metadata.is_soft_failed()
818
+ ]
819
+
820
+ # start with the existing forward extremities
821
+ result = set(latest_event_ids)
822
+
823
+ # add all the new events to the list
824
+ result.update(event.event_id for event in new_events)
825
+
826
+ # Now remove all events which are prev_events of any of the new events
827
+ result.difference_update(
828
+ e_id for event in new_events for e_id in event.prev_event_ids()
829
+ )
830
+
831
+ # Remove any events which are prev_events of any existing events.
832
+ existing_prevs: Collection[
833
+ str
834
+ ] = await self.persist_events_store._get_events_which_are_prevs(result)
835
+ result.difference_update(existing_prevs)
836
+
837
+ # Finally handle the case where the new events have soft-failed prev
838
+ # events. If they do we need to remove them and their prev events,
839
+ # otherwise we end up with dangling extremities.
840
+ existing_prevs = await self.persist_events_store._get_prevs_before_rejected(
841
+ e_id for event in new_events for e_id in event.prev_event_ids()
842
+ )
843
+ result.difference_update(existing_prevs)
844
+
845
+ # We only update metrics for events that change forward extremities
846
+ # (e.g. we ignore backfill/outliers/etc)
847
+ if result != latest_event_ids:
848
+ forward_extremities_counter.labels(
849
+ **{SERVER_NAME_LABEL: self.server_name}
850
+ ).observe(len(result))
851
+ stale = latest_event_ids & result
852
+ stale_forward_extremities_counter.labels(
853
+ **{SERVER_NAME_LABEL: self.server_name}
854
+ ).observe(len(stale))
855
+
856
+ return result
857
+
858
+ async def _get_new_state_after_events(
859
+ self,
860
+ room_id: str,
861
+ events_context: list[EventPersistencePair],
862
+ old_latest_event_ids: AbstractSet[str],
863
+ new_latest_event_ids: set[str],
864
+ ) -> tuple[Optional[StateMap[str]], Optional[StateMap[str]], set[str]]:
865
+ """Calculate the current state dict after adding some new events to
866
+ a room
867
+
868
+ Args:
869
+ room_id:
870
+ room to which the events are being added. Used for logging etc
871
+
872
+ events_context:
873
+ events and contexts which are being added to the room
874
+
875
+ old_latest_event_ids:
876
+ the old forward extremities for the room.
877
+
878
+ new_latest_event_ids :
879
+ the new forward extremities for the room.
880
+
881
+ Returns:
882
+ Returns a tuple of two state maps and a set of new forward
883
+ extremities.
884
+
885
+ The first state map is the full new current state and the second
886
+ is the delta to the existing current state. If both are None then
887
+ there has been no change. Either or neither can be None if there
888
+ has been a change.
889
+
890
+ The function may prune some old entries from the set of new
891
+ forward extremities if it's safe to do so.
892
+
893
+ If there has been a change then we only return the delta if its
894
+ already been calculated. Conversely if we do know the delta then
895
+ the new current state is only returned if we've already calculated
896
+ it.
897
+ """
898
+ # Map from (prev state group, new state group) -> delta state dict
899
+ state_group_deltas = {}
900
+
901
+ for ev, ctx in events_context:
902
+ if ctx.state_group is None:
903
+ # This should only happen for outlier events.
904
+ if not ev.internal_metadata.is_outlier():
905
+ raise Exception(
906
+ "Context for new event %s has no state group" % (ev.event_id,)
907
+ )
908
+ continue
909
+ if ctx.state_group_deltas:
910
+ state_group_deltas.update(ctx.state_group_deltas)
911
+
912
+ # We need to map the event_ids to their state groups. First, let's
913
+ # check if the event is one we're persisting, in which case we can
914
+ # pull the state group from its context.
915
+ # Otherwise we need to pull the state group from the database.
916
+
917
+ # Set of events we need to fetch groups for. (We know none of the old
918
+ # extremities are going to be in events_context).
919
+ missing_event_ids = set(old_latest_event_ids)
920
+
921
+ event_id_to_state_group = {}
922
+ for event_id in new_latest_event_ids:
923
+ # First search in the list of new events we're adding.
924
+ for ev, ctx in events_context:
925
+ if event_id == ev.event_id and ctx.state_group is not None:
926
+ event_id_to_state_group[event_id] = ctx.state_group
927
+ break
928
+ else:
929
+ # If we couldn't find it, then we'll need to pull
930
+ # the state from the database
931
+ missing_event_ids.add(event_id)
932
+
933
+ if missing_event_ids:
934
+ # Now pull out the state groups for any missing events from DB
935
+ event_to_groups = await self.main_store._get_state_group_for_events(
936
+ missing_event_ids
937
+ )
938
+ event_id_to_state_group.update(event_to_groups)
939
+
940
+ # State groups of old_latest_event_ids
941
+ old_state_groups = {
942
+ event_id_to_state_group[evid] for evid in old_latest_event_ids
943
+ }
944
+
945
+ # State groups of new_latest_event_ids
946
+ new_state_groups = {
947
+ event_id_to_state_group[evid] for evid in new_latest_event_ids
948
+ }
949
+
950
+ # If they old and new groups are the same then we don't need to do
951
+ # anything.
952
+ if old_state_groups == new_state_groups:
953
+ return None, None, new_latest_event_ids
954
+
955
+ if len(new_state_groups) == 1 and len(old_state_groups) == 1:
956
+ # If we're going from one state group to another, lets check if
957
+ # we have a delta for that transition. If we do then we can just
958
+ # return that.
959
+
960
+ new_state_group = next(iter(new_state_groups))
961
+ old_state_group = next(iter(old_state_groups))
962
+
963
+ delta_ids = state_group_deltas.get((old_state_group, new_state_group), None)
964
+ if delta_ids is not None:
965
+ # We have a delta from the existing to new current state,
966
+ # so lets just return that.
967
+ return None, delta_ids, new_latest_event_ids
968
+
969
+ # Now that we have calculated new_state_groups we need to get
970
+ # their state IDs so we can resolve to a single state set.
971
+ state_groups_map = await self.state_store._get_state_for_groups(
972
+ new_state_groups
973
+ )
974
+
975
+ if len(new_state_groups) == 1:
976
+ # If there is only one state group, then we know what the current
977
+ # state is.
978
+ return state_groups_map[new_state_groups.pop()], None, new_latest_event_ids
979
+
980
+ # Ok, we need to defer to the state handler to resolve our state sets.
981
+
982
+ state_groups = {sg: state_groups_map[sg] for sg in new_state_groups}
983
+
984
+ events_map = {ev.event_id: ev for ev, _ in events_context}
985
+
986
+ # We need to get the room version, which is in the create event.
987
+ # Normally that'd be in the database, but its also possible that we're
988
+ # currently trying to persist it.
989
+ room_version = None
990
+ for ev, _ in events_context:
991
+ if ev.type == EventTypes.Create and ev.state_key == "":
992
+ room_version = ev.content.get("room_version", "1")
993
+ break
994
+
995
+ if not room_version:
996
+ room_version = await self.main_store.get_room_version_id(room_id)
997
+
998
+ logger.debug("calling resolve_state_groups from preserve_events")
999
+
1000
+ # Avoid a circular import.
1001
+ from synapse.state import StateResolutionStore
1002
+
1003
+ res = await self._state_resolution_handler.resolve_state_groups(
1004
+ room_id,
1005
+ room_version,
1006
+ state_groups,
1007
+ events_map,
1008
+ state_res_store=StateResolutionStore(
1009
+ self.main_store, self._state_deletion_store
1010
+ ),
1011
+ )
1012
+
1013
+ state_resolutions_during_persistence.labels(
1014
+ **{SERVER_NAME_LABEL: self.server_name}
1015
+ ).inc()
1016
+
1017
+ # If the returned state matches the state group of one of the new
1018
+ # forward extremities then we check if we are able to prune some state
1019
+ # extremities.
1020
+ if res.state_group and res.state_group in new_state_groups:
1021
+ new_latest_event_ids = await self._prune_extremities(
1022
+ room_id,
1023
+ new_latest_event_ids,
1024
+ res.state_group,
1025
+ event_id_to_state_group,
1026
+ events_context,
1027
+ )
1028
+
1029
+ full_state = await res.get_state(self._state_controller)
1030
+ return full_state, None, new_latest_event_ids
1031
+
1032
+ async def _prune_extremities(
1033
+ self,
1034
+ room_id: str,
1035
+ new_latest_event_ids: set[str],
1036
+ resolved_state_group: int,
1037
+ event_id_to_state_group: dict[str, int],
1038
+ events_context: list[EventPersistencePair],
1039
+ ) -> set[str]:
1040
+ """See if we can prune any of the extremities after calculating the
1041
+ resolved state.
1042
+ """
1043
+ potential_times_prune_extremities.labels(
1044
+ **{SERVER_NAME_LABEL: self.server_name}
1045
+ ).inc()
1046
+
1047
+ # We keep all the extremities that have the same state group, and
1048
+ # see if we can drop the others.
1049
+ new_new_extrems = {
1050
+ e
1051
+ for e in new_latest_event_ids
1052
+ if event_id_to_state_group[e] == resolved_state_group
1053
+ }
1054
+
1055
+ dropped_extrems = set(new_latest_event_ids) - new_new_extrems
1056
+
1057
+ logger.debug("Might drop extremities: %s", dropped_extrems)
1058
+
1059
+ # We only drop events from the extremities list if:
1060
+ # 1. we're not currently persisting them;
1061
+ # 2. they're not our own events (or are dummy events); and
1062
+ # 3. they're either:
1063
+ # 1. over N hours old and more than N events ago (we use depth to
1064
+ # calculate); or
1065
+ # 2. we are persisting an event from the same domain and more than
1066
+ # M events ago.
1067
+ #
1068
+ # The idea is that we don't want to drop events that are "legitimate"
1069
+ # extremities (that we would want to include as prev events), only
1070
+ # "stuck" extremities that are e.g. due to a gap in the graph.
1071
+ #
1072
+ # Note that we either drop all of them or none of them. If we only drop
1073
+ # some of the events we don't know if state res would come to the same
1074
+ # conclusion.
1075
+
1076
+ for ev, _ in events_context:
1077
+ if ev.event_id in dropped_extrems:
1078
+ logger.debug(
1079
+ "Not dropping extremities: %s is being persisted", ev.event_id
1080
+ )
1081
+ return new_latest_event_ids
1082
+
1083
+ dropped_events = await self.main_store.get_events(
1084
+ dropped_extrems,
1085
+ allow_rejected=True,
1086
+ redact_behaviour=EventRedactBehaviour.as_is,
1087
+ )
1088
+
1089
+ new_senders = {get_domain_from_id(e.sender) for e, _ in events_context}
1090
+
1091
+ one_day_ago = self._clock.time_msec() - 24 * 60 * 60 * 1000
1092
+ current_depth = max(e.depth for e, _ in events_context)
1093
+ for event in dropped_events.values():
1094
+ # If the event is a local dummy event then we should check it
1095
+ # doesn't reference any local events, as we want to reference those
1096
+ # if we send any new events.
1097
+ #
1098
+ # Note we do this recursively to handle the case where a dummy event
1099
+ # references a dummy event that only references remote events.
1100
+ #
1101
+ # Ideally we'd figure out a way of still being able to drop old
1102
+ # dummy events that reference local events, but this is good enough
1103
+ # as a first cut.
1104
+ events_to_check: Collection[EventBase] = [event]
1105
+ while events_to_check:
1106
+ new_events: set[str] = set()
1107
+ for event_to_check in events_to_check:
1108
+ if self.is_mine_id(event_to_check.sender):
1109
+ if event_to_check.type != EventTypes.Dummy:
1110
+ logger.debug("Not dropping own event")
1111
+ return new_latest_event_ids
1112
+ new_events.update(event_to_check.prev_event_ids())
1113
+
1114
+ prev_events = await self.main_store.get_events(
1115
+ new_events,
1116
+ allow_rejected=True,
1117
+ redact_behaviour=EventRedactBehaviour.as_is,
1118
+ )
1119
+ events_to_check = prev_events.values()
1120
+
1121
+ if (
1122
+ event.origin_server_ts < one_day_ago
1123
+ and event.depth < current_depth - 100
1124
+ ):
1125
+ continue
1126
+
1127
+ # We can be less conservative about dropping extremities from the
1128
+ # same domain, though we do want to wait a little bit (otherwise
1129
+ # we'll immediately remove all extremities from a given server).
1130
+ if (
1131
+ get_domain_from_id(event.sender) in new_senders
1132
+ and event.depth < current_depth - 20
1133
+ ):
1134
+ continue
1135
+
1136
+ logger.debug(
1137
+ "Not dropping as too new and not in new_senders: %s",
1138
+ new_senders,
1139
+ )
1140
+
1141
+ return new_latest_event_ids
1142
+
1143
+ times_pruned_extremities.labels(**{SERVER_NAME_LABEL: self.server_name}).inc()
1144
+
1145
+ logger.info(
1146
+ "Pruning forward extremities in room %s: from %s -> %s",
1147
+ room_id,
1148
+ new_latest_event_ids,
1149
+ new_new_extrems,
1150
+ )
1151
+ return new_new_extrems
1152
+
1153
+ async def _calculate_state_delta(
1154
+ self, room_id: str, current_state: StateMap[str]
1155
+ ) -> DeltaState:
1156
+ """Calculate the new state deltas for a room.
1157
+
1158
+ Assumes that we are only persisting events for one room at a time.
1159
+ """
1160
+ existing_state = await self.main_store.get_partial_current_state_ids(room_id)
1161
+
1162
+ to_delete = [key for key in existing_state if key not in current_state]
1163
+
1164
+ to_insert = {
1165
+ key: ev_id
1166
+ for key, ev_id in current_state.items()
1167
+ if ev_id != existing_state.get(key)
1168
+ }
1169
+
1170
+ return DeltaState(to_delete=to_delete, to_insert=to_insert)
1171
+
1172
+ async def _is_server_still_joined(
1173
+ self,
1174
+ room_id: str,
1175
+ ev_ctx_rm: list[EventPersistencePair],
1176
+ delta: DeltaState,
1177
+ ) -> bool:
1178
+ """Check if the server will still be joined after the given events have
1179
+ been persised.
1180
+
1181
+ Args:
1182
+ room_id
1183
+ ev_ctx_rm
1184
+ delta: The delta of current state between what is in the database
1185
+ and what the new current state will be.
1186
+ """
1187
+
1188
+ if not any(
1189
+ self.is_mine_id(state_key)
1190
+ for typ, state_key in itertools.chain(delta.to_delete, delta.to_insert)
1191
+ if typ == EventTypes.Member
1192
+ ):
1193
+ # There have been no changes to membership of our users, so nothing
1194
+ # has changed and we assume we're still in the room.
1195
+ return True
1196
+
1197
+ # Check if any of the given events are a local join that appear in the
1198
+ # current state
1199
+ events_to_check = [] # Event IDs that aren't an event we're persisting
1200
+ for (typ, state_key), event_id in delta.to_insert.items():
1201
+ if typ != EventTypes.Member or not self.is_mine_id(state_key):
1202
+ continue
1203
+
1204
+ for event, _ in ev_ctx_rm:
1205
+ if event_id == event.event_id:
1206
+ if event.membership == Membership.JOIN:
1207
+ return True
1208
+
1209
+ # The event is not in `ev_ctx_rm`, so we need to pull it out of
1210
+ # the DB.
1211
+ events_to_check.append(event_id)
1212
+
1213
+ # Check if any of the changes that we don't have events for are joins.
1214
+ if events_to_check:
1215
+ members = await self.main_store.get_membership_from_event_ids(
1216
+ events_to_check
1217
+ )
1218
+ is_still_joined = any(
1219
+ member and member.membership == Membership.JOIN
1220
+ for member in members.values()
1221
+ )
1222
+ if is_still_joined:
1223
+ return True
1224
+
1225
+ # None of the new state events are local joins, so we check the database
1226
+ # to see if there are any other local users in the room. We ignore users
1227
+ # whose state has changed as we've already their new state above.
1228
+ users_to_ignore = [
1229
+ state_key
1230
+ for typ, state_key in itertools.chain(delta.to_insert, delta.to_delete)
1231
+ if typ == EventTypes.Member and self.is_mine_id(state_key)
1232
+ ]
1233
+
1234
+ if await self.main_store.is_local_host_in_room_ignoring_users(
1235
+ room_id, users_to_ignore
1236
+ ):
1237
+ return True
1238
+
1239
+ return False