matrix-synapse 1.143.0rc2__cp310-abi3-manylinux_2_28_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1058) hide show
  1. matrix_synapse-1.143.0rc2.dist-info/AUTHORS.rst +51 -0
  2. matrix_synapse-1.143.0rc2.dist-info/LICENSE-AGPL-3.0 +661 -0
  3. matrix_synapse-1.143.0rc2.dist-info/LICENSE-COMMERCIAL +6 -0
  4. matrix_synapse-1.143.0rc2.dist-info/METADATA +385 -0
  5. matrix_synapse-1.143.0rc2.dist-info/RECORD +1058 -0
  6. matrix_synapse-1.143.0rc2.dist-info/WHEEL +4 -0
  7. matrix_synapse-1.143.0rc2.dist-info/entry_points.txt +14 -0
  8. synapse/__init__.py +97 -0
  9. synapse/_scripts/__init__.py +0 -0
  10. synapse/_scripts/export_signing_key.py +109 -0
  11. synapse/_scripts/generate_config.py +83 -0
  12. synapse/_scripts/generate_log_config.py +56 -0
  13. synapse/_scripts/generate_signing_key.py +55 -0
  14. synapse/_scripts/generate_workers_map.py +318 -0
  15. synapse/_scripts/hash_password.py +95 -0
  16. synapse/_scripts/move_remote_media_to_new_store.py +128 -0
  17. synapse/_scripts/register_new_matrix_user.py +402 -0
  18. synapse/_scripts/review_recent_signups.py +212 -0
  19. synapse/_scripts/synapse_port_db.py +1604 -0
  20. synapse/_scripts/synctl.py +365 -0
  21. synapse/_scripts/update_synapse_database.py +130 -0
  22. synapse/api/__init__.py +20 -0
  23. synapse/api/auth/__init__.py +207 -0
  24. synapse/api/auth/base.py +406 -0
  25. synapse/api/auth/internal.py +299 -0
  26. synapse/api/auth/mas.py +436 -0
  27. synapse/api/auth/msc3861_delegated.py +617 -0
  28. synapse/api/auth_blocking.py +144 -0
  29. synapse/api/constants.py +362 -0
  30. synapse/api/errors.py +907 -0
  31. synapse/api/filtering.py +537 -0
  32. synapse/api/presence.py +102 -0
  33. synapse/api/ratelimiting.py +480 -0
  34. synapse/api/room_versions.py +535 -0
  35. synapse/api/urls.py +118 -0
  36. synapse/app/__init__.py +60 -0
  37. synapse/app/_base.py +862 -0
  38. synapse/app/admin_cmd.py +388 -0
  39. synapse/app/appservice.py +30 -0
  40. synapse/app/client_reader.py +30 -0
  41. synapse/app/complement_fork_starter.py +206 -0
  42. synapse/app/event_creator.py +29 -0
  43. synapse/app/federation_reader.py +30 -0
  44. synapse/app/federation_sender.py +30 -0
  45. synapse/app/frontend_proxy.py +30 -0
  46. synapse/app/generic_worker.py +474 -0
  47. synapse/app/homeserver.py +505 -0
  48. synapse/app/media_repository.py +30 -0
  49. synapse/app/phone_stats_home.py +296 -0
  50. synapse/app/pusher.py +30 -0
  51. synapse/app/synchrotron.py +30 -0
  52. synapse/app/user_dir.py +31 -0
  53. synapse/appservice/__init__.py +458 -0
  54. synapse/appservice/api.py +567 -0
  55. synapse/appservice/scheduler.py +564 -0
  56. synapse/config/__init__.py +27 -0
  57. synapse/config/__main__.py +62 -0
  58. synapse/config/_base.py +1106 -0
  59. synapse/config/_base.pyi +215 -0
  60. synapse/config/_util.py +99 -0
  61. synapse/config/account_validity.py +116 -0
  62. synapse/config/api.py +141 -0
  63. synapse/config/appservice.py +210 -0
  64. synapse/config/auth.py +80 -0
  65. synapse/config/auto_accept_invites.py +43 -0
  66. synapse/config/background_updates.py +44 -0
  67. synapse/config/cache.py +231 -0
  68. synapse/config/captcha.py +90 -0
  69. synapse/config/cas.py +116 -0
  70. synapse/config/consent.py +73 -0
  71. synapse/config/database.py +184 -0
  72. synapse/config/emailconfig.py +367 -0
  73. synapse/config/experimental.py +595 -0
  74. synapse/config/federation.py +114 -0
  75. synapse/config/homeserver.py +141 -0
  76. synapse/config/jwt.py +55 -0
  77. synapse/config/key.py +447 -0
  78. synapse/config/logger.py +390 -0
  79. synapse/config/mas.py +192 -0
  80. synapse/config/matrixrtc.py +66 -0
  81. synapse/config/metrics.py +84 -0
  82. synapse/config/modules.py +40 -0
  83. synapse/config/oembed.py +185 -0
  84. synapse/config/oidc.py +509 -0
  85. synapse/config/password_auth_providers.py +82 -0
  86. synapse/config/push.py +64 -0
  87. synapse/config/ratelimiting.py +254 -0
  88. synapse/config/redis.py +74 -0
  89. synapse/config/registration.py +296 -0
  90. synapse/config/repository.py +311 -0
  91. synapse/config/retention.py +162 -0
  92. synapse/config/room.py +88 -0
  93. synapse/config/room_directory.py +165 -0
  94. synapse/config/saml2.py +251 -0
  95. synapse/config/server.py +1170 -0
  96. synapse/config/server_notices.py +84 -0
  97. synapse/config/spam_checker.py +66 -0
  98. synapse/config/sso.py +121 -0
  99. synapse/config/stats.py +54 -0
  100. synapse/config/third_party_event_rules.py +40 -0
  101. synapse/config/tls.py +192 -0
  102. synapse/config/tracer.py +71 -0
  103. synapse/config/user_directory.py +47 -0
  104. synapse/config/user_types.py +42 -0
  105. synapse/config/voip.py +59 -0
  106. synapse/config/workers.py +642 -0
  107. synapse/crypto/__init__.py +20 -0
  108. synapse/crypto/context_factory.py +278 -0
  109. synapse/crypto/event_signing.py +194 -0
  110. synapse/crypto/keyring.py +931 -0
  111. synapse/event_auth.py +1266 -0
  112. synapse/events/__init__.py +667 -0
  113. synapse/events/auto_accept_invites.py +216 -0
  114. synapse/events/builder.py +387 -0
  115. synapse/events/presence_router.py +243 -0
  116. synapse/events/snapshot.py +559 -0
  117. synapse/events/utils.py +924 -0
  118. synapse/events/validator.py +305 -0
  119. synapse/federation/__init__.py +22 -0
  120. synapse/federation/federation_base.py +382 -0
  121. synapse/federation/federation_client.py +2132 -0
  122. synapse/federation/federation_server.py +1540 -0
  123. synapse/federation/persistence.py +70 -0
  124. synapse/federation/send_queue.py +531 -0
  125. synapse/federation/sender/__init__.py +1164 -0
  126. synapse/federation/sender/per_destination_queue.py +886 -0
  127. synapse/federation/sender/transaction_manager.py +210 -0
  128. synapse/federation/transport/__init__.py +28 -0
  129. synapse/federation/transport/client.py +1199 -0
  130. synapse/federation/transport/server/__init__.py +334 -0
  131. synapse/federation/transport/server/_base.py +429 -0
  132. synapse/federation/transport/server/federation.py +910 -0
  133. synapse/federation/units.py +133 -0
  134. synapse/handlers/__init__.py +20 -0
  135. synapse/handlers/account.py +162 -0
  136. synapse/handlers/account_data.py +360 -0
  137. synapse/handlers/account_validity.py +361 -0
  138. synapse/handlers/admin.py +615 -0
  139. synapse/handlers/appservice.py +989 -0
  140. synapse/handlers/auth.py +2481 -0
  141. synapse/handlers/cas.py +413 -0
  142. synapse/handlers/deactivate_account.py +363 -0
  143. synapse/handlers/delayed_events.py +599 -0
  144. synapse/handlers/device.py +1870 -0
  145. synapse/handlers/devicemessage.py +399 -0
  146. synapse/handlers/directory.py +545 -0
  147. synapse/handlers/e2e_keys.py +1834 -0
  148. synapse/handlers/e2e_room_keys.py +455 -0
  149. synapse/handlers/event_auth.py +390 -0
  150. synapse/handlers/events.py +201 -0
  151. synapse/handlers/federation.py +2039 -0
  152. synapse/handlers/federation_event.py +2419 -0
  153. synapse/handlers/identity.py +812 -0
  154. synapse/handlers/initial_sync.py +528 -0
  155. synapse/handlers/jwt.py +120 -0
  156. synapse/handlers/message.py +2347 -0
  157. synapse/handlers/oidc.py +1801 -0
  158. synapse/handlers/pagination.py +768 -0
  159. synapse/handlers/password_policy.py +102 -0
  160. synapse/handlers/presence.py +2633 -0
  161. synapse/handlers/profile.py +655 -0
  162. synapse/handlers/push_rules.py +164 -0
  163. synapse/handlers/read_marker.py +79 -0
  164. synapse/handlers/receipts.py +351 -0
  165. synapse/handlers/register.py +1059 -0
  166. synapse/handlers/relations.py +623 -0
  167. synapse/handlers/reports.py +98 -0
  168. synapse/handlers/room.py +2448 -0
  169. synapse/handlers/room_list.py +632 -0
  170. synapse/handlers/room_member.py +2365 -0
  171. synapse/handlers/room_member_worker.py +146 -0
  172. synapse/handlers/room_policy.py +186 -0
  173. synapse/handlers/room_summary.py +1057 -0
  174. synapse/handlers/saml.py +524 -0
  175. synapse/handlers/search.py +723 -0
  176. synapse/handlers/send_email.py +209 -0
  177. synapse/handlers/set_password.py +71 -0
  178. synapse/handlers/sliding_sync/__init__.py +1701 -0
  179. synapse/handlers/sliding_sync/extensions.py +969 -0
  180. synapse/handlers/sliding_sync/room_lists.py +2262 -0
  181. synapse/handlers/sliding_sync/store.py +128 -0
  182. synapse/handlers/sso.py +1291 -0
  183. synapse/handlers/state_deltas.py +82 -0
  184. synapse/handlers/stats.py +321 -0
  185. synapse/handlers/sync.py +3106 -0
  186. synapse/handlers/thread_subscriptions.py +190 -0
  187. synapse/handlers/typing.py +606 -0
  188. synapse/handlers/ui_auth/__init__.py +48 -0
  189. synapse/handlers/ui_auth/checkers.py +332 -0
  190. synapse/handlers/user_directory.py +783 -0
  191. synapse/handlers/worker_lock.py +371 -0
  192. synapse/http/__init__.py +105 -0
  193. synapse/http/additional_resource.py +62 -0
  194. synapse/http/client.py +1373 -0
  195. synapse/http/connectproxyclient.py +316 -0
  196. synapse/http/federation/__init__.py +19 -0
  197. synapse/http/federation/matrix_federation_agent.py +490 -0
  198. synapse/http/federation/srv_resolver.py +196 -0
  199. synapse/http/federation/well_known_resolver.py +367 -0
  200. synapse/http/matrixfederationclient.py +1873 -0
  201. synapse/http/proxy.py +290 -0
  202. synapse/http/proxyagent.py +497 -0
  203. synapse/http/replicationagent.py +202 -0
  204. synapse/http/request_metrics.py +309 -0
  205. synapse/http/server.py +1110 -0
  206. synapse/http/servlet.py +1018 -0
  207. synapse/http/site.py +825 -0
  208. synapse/http/types.py +27 -0
  209. synapse/logging/__init__.py +31 -0
  210. synapse/logging/_remote.py +261 -0
  211. synapse/logging/_terse_json.py +95 -0
  212. synapse/logging/context.py +1209 -0
  213. synapse/logging/formatter.py +62 -0
  214. synapse/logging/handlers.py +99 -0
  215. synapse/logging/loggers.py +25 -0
  216. synapse/logging/opentracing.py +1132 -0
  217. synapse/logging/scopecontextmanager.py +160 -0
  218. synapse/media/_base.py +830 -0
  219. synapse/media/filepath.py +417 -0
  220. synapse/media/media_repository.py +1580 -0
  221. synapse/media/media_storage.py +702 -0
  222. synapse/media/oembed.py +277 -0
  223. synapse/media/preview_html.py +556 -0
  224. synapse/media/storage_provider.py +195 -0
  225. synapse/media/thumbnailer.py +833 -0
  226. synapse/media/url_previewer.py +875 -0
  227. synapse/metrics/__init__.py +748 -0
  228. synapse/metrics/_gc.py +219 -0
  229. synapse/metrics/_reactor_metrics.py +171 -0
  230. synapse/metrics/_types.py +38 -0
  231. synapse/metrics/background_process_metrics.py +555 -0
  232. synapse/metrics/common_usage_metrics.py +94 -0
  233. synapse/metrics/jemalloc.py +248 -0
  234. synapse/module_api/__init__.py +2131 -0
  235. synapse/module_api/callbacks/__init__.py +50 -0
  236. synapse/module_api/callbacks/account_validity_callbacks.py +106 -0
  237. synapse/module_api/callbacks/media_repository_callbacks.py +157 -0
  238. synapse/module_api/callbacks/ratelimit_callbacks.py +78 -0
  239. synapse/module_api/callbacks/spamchecker_callbacks.py +991 -0
  240. synapse/module_api/callbacks/third_party_event_rules_callbacks.py +592 -0
  241. synapse/module_api/errors.py +42 -0
  242. synapse/notifier.py +970 -0
  243. synapse/push/__init__.py +212 -0
  244. synapse/push/bulk_push_rule_evaluator.py +635 -0
  245. synapse/push/clientformat.py +126 -0
  246. synapse/push/emailpusher.py +333 -0
  247. synapse/push/httppusher.py +564 -0
  248. synapse/push/mailer.py +1010 -0
  249. synapse/push/presentable_names.py +216 -0
  250. synapse/push/push_tools.py +114 -0
  251. synapse/push/push_types.py +141 -0
  252. synapse/push/pusher.py +87 -0
  253. synapse/push/pusherpool.py +501 -0
  254. synapse/push/rulekinds.py +33 -0
  255. synapse/py.typed +0 -0
  256. synapse/replication/__init__.py +20 -0
  257. synapse/replication/http/__init__.py +68 -0
  258. synapse/replication/http/_base.py +468 -0
  259. synapse/replication/http/account_data.py +297 -0
  260. synapse/replication/http/deactivate_account.py +81 -0
  261. synapse/replication/http/delayed_events.py +62 -0
  262. synapse/replication/http/devices.py +254 -0
  263. synapse/replication/http/federation.py +334 -0
  264. synapse/replication/http/login.py +106 -0
  265. synapse/replication/http/membership.py +364 -0
  266. synapse/replication/http/presence.py +133 -0
  267. synapse/replication/http/push.py +156 -0
  268. synapse/replication/http/register.py +172 -0
  269. synapse/replication/http/send_events.py +182 -0
  270. synapse/replication/http/state.py +82 -0
  271. synapse/replication/http/streams.py +101 -0
  272. synapse/replication/tcp/__init__.py +56 -0
  273. synapse/replication/tcp/client.py +552 -0
  274. synapse/replication/tcp/commands.py +569 -0
  275. synapse/replication/tcp/context.py +41 -0
  276. synapse/replication/tcp/external_cache.py +156 -0
  277. synapse/replication/tcp/handler.py +922 -0
  278. synapse/replication/tcp/protocol.py +608 -0
  279. synapse/replication/tcp/redis.py +509 -0
  280. synapse/replication/tcp/resource.py +348 -0
  281. synapse/replication/tcp/streams/__init__.py +96 -0
  282. synapse/replication/tcp/streams/_base.py +765 -0
  283. synapse/replication/tcp/streams/events.py +287 -0
  284. synapse/replication/tcp/streams/federation.py +92 -0
  285. synapse/replication/tcp/streams/partial_state.py +80 -0
  286. synapse/res/providers.json +29 -0
  287. synapse/res/templates/_base.html +29 -0
  288. synapse/res/templates/account_previously_renewed.html +6 -0
  289. synapse/res/templates/account_renewed.html +6 -0
  290. synapse/res/templates/add_threepid.html +8 -0
  291. synapse/res/templates/add_threepid.txt +6 -0
  292. synapse/res/templates/add_threepid_failure.html +7 -0
  293. synapse/res/templates/add_threepid_success.html +6 -0
  294. synapse/res/templates/already_in_use.html +12 -0
  295. synapse/res/templates/already_in_use.txt +10 -0
  296. synapse/res/templates/auth_success.html +21 -0
  297. synapse/res/templates/invalid_token.html +6 -0
  298. synapse/res/templates/mail-Element.css +7 -0
  299. synapse/res/templates/mail-Vector.css +7 -0
  300. synapse/res/templates/mail-expiry.css +4 -0
  301. synapse/res/templates/mail.css +156 -0
  302. synapse/res/templates/notice_expiry.html +46 -0
  303. synapse/res/templates/notice_expiry.txt +7 -0
  304. synapse/res/templates/notif.html +51 -0
  305. synapse/res/templates/notif.txt +22 -0
  306. synapse/res/templates/notif_mail.html +59 -0
  307. synapse/res/templates/notif_mail.txt +10 -0
  308. synapse/res/templates/password_reset.html +10 -0
  309. synapse/res/templates/password_reset.txt +7 -0
  310. synapse/res/templates/password_reset_confirmation.html +15 -0
  311. synapse/res/templates/password_reset_failure.html +7 -0
  312. synapse/res/templates/password_reset_success.html +6 -0
  313. synapse/res/templates/recaptcha.html +42 -0
  314. synapse/res/templates/registration.html +12 -0
  315. synapse/res/templates/registration.txt +10 -0
  316. synapse/res/templates/registration_failure.html +6 -0
  317. synapse/res/templates/registration_success.html +6 -0
  318. synapse/res/templates/registration_token.html +18 -0
  319. synapse/res/templates/room.html +33 -0
  320. synapse/res/templates/room.txt +9 -0
  321. synapse/res/templates/sso.css +129 -0
  322. synapse/res/templates/sso_account_deactivated.html +25 -0
  323. synapse/res/templates/sso_auth_account_details.html +186 -0
  324. synapse/res/templates/sso_auth_account_details.js +116 -0
  325. synapse/res/templates/sso_auth_bad_user.html +26 -0
  326. synapse/res/templates/sso_auth_confirm.html +27 -0
  327. synapse/res/templates/sso_auth_success.html +26 -0
  328. synapse/res/templates/sso_error.html +71 -0
  329. synapse/res/templates/sso_footer.html +19 -0
  330. synapse/res/templates/sso_login_idp_picker.html +60 -0
  331. synapse/res/templates/sso_new_user_consent.html +30 -0
  332. synapse/res/templates/sso_partial_profile.html +19 -0
  333. synapse/res/templates/sso_redirect_confirm.html +39 -0
  334. synapse/res/templates/style.css +33 -0
  335. synapse/res/templates/terms.html +27 -0
  336. synapse/rest/__init__.py +197 -0
  337. synapse/rest/admin/__init__.py +390 -0
  338. synapse/rest/admin/_base.py +72 -0
  339. synapse/rest/admin/background_updates.py +171 -0
  340. synapse/rest/admin/devices.py +221 -0
  341. synapse/rest/admin/event_reports.py +173 -0
  342. synapse/rest/admin/events.py +69 -0
  343. synapse/rest/admin/experimental_features.py +137 -0
  344. synapse/rest/admin/federation.py +243 -0
  345. synapse/rest/admin/media.py +540 -0
  346. synapse/rest/admin/registration_tokens.py +358 -0
  347. synapse/rest/admin/rooms.py +1061 -0
  348. synapse/rest/admin/scheduled_tasks.py +70 -0
  349. synapse/rest/admin/server_notice_servlet.py +132 -0
  350. synapse/rest/admin/statistics.py +132 -0
  351. synapse/rest/admin/username_available.py +58 -0
  352. synapse/rest/admin/users.py +1606 -0
  353. synapse/rest/client/__init__.py +20 -0
  354. synapse/rest/client/_base.py +113 -0
  355. synapse/rest/client/account.py +930 -0
  356. synapse/rest/client/account_data.py +319 -0
  357. synapse/rest/client/account_validity.py +103 -0
  358. synapse/rest/client/appservice_ping.py +125 -0
  359. synapse/rest/client/auth.py +218 -0
  360. synapse/rest/client/auth_metadata.py +122 -0
  361. synapse/rest/client/capabilities.py +121 -0
  362. synapse/rest/client/delayed_events.py +165 -0
  363. synapse/rest/client/devices.py +587 -0
  364. synapse/rest/client/directory.py +211 -0
  365. synapse/rest/client/events.py +116 -0
  366. synapse/rest/client/filter.py +112 -0
  367. synapse/rest/client/initial_sync.py +65 -0
  368. synapse/rest/client/keys.py +678 -0
  369. synapse/rest/client/knock.py +104 -0
  370. synapse/rest/client/login.py +750 -0
  371. synapse/rest/client/login_token_request.py +127 -0
  372. synapse/rest/client/logout.py +93 -0
  373. synapse/rest/client/matrixrtc.py +52 -0
  374. synapse/rest/client/media.py +285 -0
  375. synapse/rest/client/mutual_rooms.py +93 -0
  376. synapse/rest/client/notifications.py +137 -0
  377. synapse/rest/client/openid.py +109 -0
  378. synapse/rest/client/password_policy.py +69 -0
  379. synapse/rest/client/presence.py +131 -0
  380. synapse/rest/client/profile.py +291 -0
  381. synapse/rest/client/push_rule.py +331 -0
  382. synapse/rest/client/pusher.py +181 -0
  383. synapse/rest/client/read_marker.py +104 -0
  384. synapse/rest/client/receipts.py +165 -0
  385. synapse/rest/client/register.py +1067 -0
  386. synapse/rest/client/relations.py +138 -0
  387. synapse/rest/client/rendezvous.py +76 -0
  388. synapse/rest/client/reporting.py +207 -0
  389. synapse/rest/client/room.py +1669 -0
  390. synapse/rest/client/room_keys.py +426 -0
  391. synapse/rest/client/room_upgrade_rest_servlet.py +112 -0
  392. synapse/rest/client/sendtodevice.py +85 -0
  393. synapse/rest/client/sync.py +1131 -0
  394. synapse/rest/client/tags.py +129 -0
  395. synapse/rest/client/thirdparty.py +130 -0
  396. synapse/rest/client/thread_subscriptions.py +247 -0
  397. synapse/rest/client/tokenrefresh.py +52 -0
  398. synapse/rest/client/transactions.py +149 -0
  399. synapse/rest/client/user_directory.py +90 -0
  400. synapse/rest/client/versions.py +191 -0
  401. synapse/rest/client/voip.py +88 -0
  402. synapse/rest/consent/__init__.py +0 -0
  403. synapse/rest/consent/consent_resource.py +210 -0
  404. synapse/rest/health.py +38 -0
  405. synapse/rest/key/__init__.py +20 -0
  406. synapse/rest/key/v2/__init__.py +40 -0
  407. synapse/rest/key/v2/local_key_resource.py +125 -0
  408. synapse/rest/key/v2/remote_key_resource.py +302 -0
  409. synapse/rest/media/__init__.py +0 -0
  410. synapse/rest/media/config_resource.py +53 -0
  411. synapse/rest/media/create_resource.py +90 -0
  412. synapse/rest/media/download_resource.py +110 -0
  413. synapse/rest/media/media_repository_resource.py +113 -0
  414. synapse/rest/media/preview_url_resource.py +77 -0
  415. synapse/rest/media/thumbnail_resource.py +142 -0
  416. synapse/rest/media/upload_resource.py +187 -0
  417. synapse/rest/media/v1/__init__.py +39 -0
  418. synapse/rest/media/v1/_base.py +23 -0
  419. synapse/rest/media/v1/media_storage.py +23 -0
  420. synapse/rest/media/v1/storage_provider.py +23 -0
  421. synapse/rest/synapse/__init__.py +20 -0
  422. synapse/rest/synapse/client/__init__.py +93 -0
  423. synapse/rest/synapse/client/federation_whitelist.py +66 -0
  424. synapse/rest/synapse/client/jwks.py +77 -0
  425. synapse/rest/synapse/client/new_user_consent.py +115 -0
  426. synapse/rest/synapse/client/oidc/__init__.py +45 -0
  427. synapse/rest/synapse/client/oidc/backchannel_logout_resource.py +42 -0
  428. synapse/rest/synapse/client/oidc/callback_resource.py +48 -0
  429. synapse/rest/synapse/client/password_reset.py +129 -0
  430. synapse/rest/synapse/client/pick_idp.py +107 -0
  431. synapse/rest/synapse/client/pick_username.py +153 -0
  432. synapse/rest/synapse/client/rendezvous.py +58 -0
  433. synapse/rest/synapse/client/saml2/__init__.py +42 -0
  434. synapse/rest/synapse/client/saml2/metadata_resource.py +46 -0
  435. synapse/rest/synapse/client/saml2/response_resource.py +52 -0
  436. synapse/rest/synapse/client/sso_register.py +56 -0
  437. synapse/rest/synapse/client/unsubscribe.py +88 -0
  438. synapse/rest/synapse/mas/__init__.py +71 -0
  439. synapse/rest/synapse/mas/_base.py +55 -0
  440. synapse/rest/synapse/mas/devices.py +239 -0
  441. synapse/rest/synapse/mas/users.py +469 -0
  442. synapse/rest/well_known.py +148 -0
  443. synapse/server.py +1257 -0
  444. synapse/server_notices/__init__.py +0 -0
  445. synapse/server_notices/consent_server_notices.py +136 -0
  446. synapse/server_notices/resource_limits_server_notices.py +215 -0
  447. synapse/server_notices/server_notices_manager.py +388 -0
  448. synapse/server_notices/server_notices_sender.py +67 -0
  449. synapse/server_notices/worker_server_notices_sender.py +46 -0
  450. synapse/spam_checker_api/__init__.py +31 -0
  451. synapse/state/__init__.py +1022 -0
  452. synapse/state/v1.py +369 -0
  453. synapse/state/v2.py +984 -0
  454. synapse/static/client/login/index.html +47 -0
  455. synapse/static/client/login/js/jquery-3.4.1.min.js +2 -0
  456. synapse/static/client/login/js/login.js +291 -0
  457. synapse/static/client/login/spinner.gif +0 -0
  458. synapse/static/client/login/style.css +79 -0
  459. synapse/static/index.html +63 -0
  460. synapse/storage/__init__.py +43 -0
  461. synapse/storage/_base.py +245 -0
  462. synapse/storage/admin_client_config.py +25 -0
  463. synapse/storage/background_updates.py +1188 -0
  464. synapse/storage/controllers/__init__.py +57 -0
  465. synapse/storage/controllers/persist_events.py +1237 -0
  466. synapse/storage/controllers/purge_events.py +455 -0
  467. synapse/storage/controllers/state.py +950 -0
  468. synapse/storage/controllers/stats.py +119 -0
  469. synapse/storage/database.py +2719 -0
  470. synapse/storage/databases/__init__.py +175 -0
  471. synapse/storage/databases/main/__init__.py +420 -0
  472. synapse/storage/databases/main/account_data.py +1059 -0
  473. synapse/storage/databases/main/appservice.py +473 -0
  474. synapse/storage/databases/main/cache.py +911 -0
  475. synapse/storage/databases/main/censor_events.py +225 -0
  476. synapse/storage/databases/main/client_ips.py +815 -0
  477. synapse/storage/databases/main/delayed_events.py +562 -0
  478. synapse/storage/databases/main/deviceinbox.py +1271 -0
  479. synapse/storage/databases/main/devices.py +2578 -0
  480. synapse/storage/databases/main/directory.py +212 -0
  481. synapse/storage/databases/main/e2e_room_keys.py +689 -0
  482. synapse/storage/databases/main/end_to_end_keys.py +1894 -0
  483. synapse/storage/databases/main/event_federation.py +2508 -0
  484. synapse/storage/databases/main/event_push_actions.py +1933 -0
  485. synapse/storage/databases/main/events.py +3765 -0
  486. synapse/storage/databases/main/events_bg_updates.py +2910 -0
  487. synapse/storage/databases/main/events_forward_extremities.py +126 -0
  488. synapse/storage/databases/main/events_worker.py +2786 -0
  489. synapse/storage/databases/main/experimental_features.py +130 -0
  490. synapse/storage/databases/main/filtering.py +231 -0
  491. synapse/storage/databases/main/keys.py +291 -0
  492. synapse/storage/databases/main/lock.py +553 -0
  493. synapse/storage/databases/main/media_repository.py +1068 -0
  494. synapse/storage/databases/main/metrics.py +460 -0
  495. synapse/storage/databases/main/monthly_active_users.py +443 -0
  496. synapse/storage/databases/main/openid.py +60 -0
  497. synapse/storage/databases/main/presence.py +509 -0
  498. synapse/storage/databases/main/profile.py +539 -0
  499. synapse/storage/databases/main/purge_events.py +521 -0
  500. synapse/storage/databases/main/push_rule.py +970 -0
  501. synapse/storage/databases/main/pusher.py +793 -0
  502. synapse/storage/databases/main/receipts.py +1341 -0
  503. synapse/storage/databases/main/registration.py +3072 -0
  504. synapse/storage/databases/main/rejections.py +37 -0
  505. synapse/storage/databases/main/relations.py +1116 -0
  506. synapse/storage/databases/main/room.py +2779 -0
  507. synapse/storage/databases/main/roommember.py +2110 -0
  508. synapse/storage/databases/main/search.py +939 -0
  509. synapse/storage/databases/main/session.py +151 -0
  510. synapse/storage/databases/main/signatures.py +94 -0
  511. synapse/storage/databases/main/sliding_sync.py +603 -0
  512. synapse/storage/databases/main/state.py +1002 -0
  513. synapse/storage/databases/main/state_deltas.py +329 -0
  514. synapse/storage/databases/main/stats.py +789 -0
  515. synapse/storage/databases/main/stream.py +2577 -0
  516. synapse/storage/databases/main/tags.py +360 -0
  517. synapse/storage/databases/main/task_scheduler.py +225 -0
  518. synapse/storage/databases/main/thread_subscriptions.py +589 -0
  519. synapse/storage/databases/main/transactions.py +675 -0
  520. synapse/storage/databases/main/ui_auth.py +420 -0
  521. synapse/storage/databases/main/user_directory.py +1330 -0
  522. synapse/storage/databases/main/user_erasure_store.py +117 -0
  523. synapse/storage/databases/state/__init__.py +22 -0
  524. synapse/storage/databases/state/bg_updates.py +497 -0
  525. synapse/storage/databases/state/deletion.py +557 -0
  526. synapse/storage/databases/state/store.py +948 -0
  527. synapse/storage/engines/__init__.py +70 -0
  528. synapse/storage/engines/_base.py +154 -0
  529. synapse/storage/engines/postgres.py +261 -0
  530. synapse/storage/engines/sqlite.py +199 -0
  531. synapse/storage/invite_rule.py +112 -0
  532. synapse/storage/keys.py +40 -0
  533. synapse/storage/prepare_database.py +730 -0
  534. synapse/storage/push_rule.py +28 -0
  535. synapse/storage/roommember.py +88 -0
  536. synapse/storage/schema/README.md +4 -0
  537. synapse/storage/schema/__init__.py +186 -0
  538. synapse/storage/schema/common/delta/25/00background_updates.sql +40 -0
  539. synapse/storage/schema/common/delta/35/00background_updates_add_col.sql +36 -0
  540. synapse/storage/schema/common/delta/58/00background_update_ordering.sql +38 -0
  541. synapse/storage/schema/common/full_schemas/72/full.sql.postgres +8 -0
  542. synapse/storage/schema/common/full_schemas/72/full.sql.sqlite +6 -0
  543. synapse/storage/schema/common/schema_version.sql +60 -0
  544. synapse/storage/schema/main/delta/12/v12.sql +82 -0
  545. synapse/storage/schema/main/delta/13/v13.sql +38 -0
  546. synapse/storage/schema/main/delta/14/v14.sql +42 -0
  547. synapse/storage/schema/main/delta/15/appservice_txns.sql +50 -0
  548. synapse/storage/schema/main/delta/15/presence_indices.sql +2 -0
  549. synapse/storage/schema/main/delta/15/v15.sql +24 -0
  550. synapse/storage/schema/main/delta/16/events_order_index.sql +4 -0
  551. synapse/storage/schema/main/delta/16/remote_media_cache_index.sql +2 -0
  552. synapse/storage/schema/main/delta/16/remove_duplicates.sql +9 -0
  553. synapse/storage/schema/main/delta/16/room_alias_index.sql +3 -0
  554. synapse/storage/schema/main/delta/16/unique_constraints.sql +72 -0
  555. synapse/storage/schema/main/delta/16/users.sql +56 -0
  556. synapse/storage/schema/main/delta/17/drop_indexes.sql +37 -0
  557. synapse/storage/schema/main/delta/17/server_keys.sql +43 -0
  558. synapse/storage/schema/main/delta/17/user_threepids.sql +9 -0
  559. synapse/storage/schema/main/delta/18/server_keys_bigger_ints.sql +51 -0
  560. synapse/storage/schema/main/delta/19/event_index.sql +38 -0
  561. synapse/storage/schema/main/delta/20/dummy.sql +1 -0
  562. synapse/storage/schema/main/delta/20/pushers.py +93 -0
  563. synapse/storage/schema/main/delta/21/end_to_end_keys.sql +53 -0
  564. synapse/storage/schema/main/delta/21/receipts.sql +57 -0
  565. synapse/storage/schema/main/delta/22/receipts_index.sql +41 -0
  566. synapse/storage/schema/main/delta/22/user_threepids_unique.sql +19 -0
  567. synapse/storage/schema/main/delta/24/stats_reporting.sql +37 -0
  568. synapse/storage/schema/main/delta/25/fts.py +81 -0
  569. synapse/storage/schema/main/delta/25/guest_access.sql +44 -0
  570. synapse/storage/schema/main/delta/25/history_visibility.sql +44 -0
  571. synapse/storage/schema/main/delta/25/tags.sql +57 -0
  572. synapse/storage/schema/main/delta/26/account_data.sql +36 -0
  573. synapse/storage/schema/main/delta/27/account_data.sql +55 -0
  574. synapse/storage/schema/main/delta/27/forgotten_memberships.sql +45 -0
  575. synapse/storage/schema/main/delta/27/ts.py +61 -0
  576. synapse/storage/schema/main/delta/28/event_push_actions.sql +46 -0
  577. synapse/storage/schema/main/delta/28/events_room_stream.sql +39 -0
  578. synapse/storage/schema/main/delta/28/public_roms_index.sql +39 -0
  579. synapse/storage/schema/main/delta/28/receipts_user_id_index.sql +41 -0
  580. synapse/storage/schema/main/delta/28/upgrade_times.sql +40 -0
  581. synapse/storage/schema/main/delta/28/users_is_guest.sql +41 -0
  582. synapse/storage/schema/main/delta/29/push_actions.sql +54 -0
  583. synapse/storage/schema/main/delta/30/alias_creator.sql +35 -0
  584. synapse/storage/schema/main/delta/30/as_users.py +82 -0
  585. synapse/storage/schema/main/delta/30/deleted_pushers.sql +44 -0
  586. synapse/storage/schema/main/delta/30/presence_stream.sql +49 -0
  587. synapse/storage/schema/main/delta/30/public_rooms.sql +42 -0
  588. synapse/storage/schema/main/delta/30/push_rule_stream.sql +57 -0
  589. synapse/storage/schema/main/delta/30/threepid_guest_access_tokens.sql +43 -0
  590. synapse/storage/schema/main/delta/31/invites.sql +61 -0
  591. synapse/storage/schema/main/delta/31/local_media_repository_url_cache.sql +46 -0
  592. synapse/storage/schema/main/delta/31/pushers_0.py +92 -0
  593. synapse/storage/schema/main/delta/31/pushers_index.sql +41 -0
  594. synapse/storage/schema/main/delta/31/search_update.py +65 -0
  595. synapse/storage/schema/main/delta/32/events.sql +35 -0
  596. synapse/storage/schema/main/delta/32/openid.sql +9 -0
  597. synapse/storage/schema/main/delta/32/pusher_throttle.sql +42 -0
  598. synapse/storage/schema/main/delta/32/remove_indices.sql +52 -0
  599. synapse/storage/schema/main/delta/32/reports.sql +44 -0
  600. synapse/storage/schema/main/delta/33/access_tokens_device_index.sql +36 -0
  601. synapse/storage/schema/main/delta/33/devices.sql +40 -0
  602. synapse/storage/schema/main/delta/33/devices_for_e2e_keys.sql +38 -0
  603. synapse/storage/schema/main/delta/33/devices_for_e2e_keys_clear_unknown_device.sql +39 -0
  604. synapse/storage/schema/main/delta/33/event_fields.py +61 -0
  605. synapse/storage/schema/main/delta/33/remote_media_ts.py +43 -0
  606. synapse/storage/schema/main/delta/33/user_ips_index.sql +36 -0
  607. synapse/storage/schema/main/delta/34/appservice_stream.sql +42 -0
  608. synapse/storage/schema/main/delta/34/cache_stream.py +50 -0
  609. synapse/storage/schema/main/delta/34/device_inbox.sql +43 -0
  610. synapse/storage/schema/main/delta/34/push_display_name_rename.sql +39 -0
  611. synapse/storage/schema/main/delta/34/received_txn_purge.py +36 -0
  612. synapse/storage/schema/main/delta/35/contains_url.sql +36 -0
  613. synapse/storage/schema/main/delta/35/device_outbox.sql +58 -0
  614. synapse/storage/schema/main/delta/35/device_stream_id.sql +40 -0
  615. synapse/storage/schema/main/delta/35/event_push_actions_index.sql +36 -0
  616. synapse/storage/schema/main/delta/35/public_room_list_change_stream.sql +52 -0
  617. synapse/storage/schema/main/delta/35/stream_order_to_extrem.sql +56 -0
  618. synapse/storage/schema/main/delta/36/readd_public_rooms.sql +45 -0
  619. synapse/storage/schema/main/delta/37/remove_auth_idx.py +89 -0
  620. synapse/storage/schema/main/delta/37/user_threepids.sql +71 -0
  621. synapse/storage/schema/main/delta/38/postgres_fts_gist.sql +38 -0
  622. synapse/storage/schema/main/delta/39/appservice_room_list.sql +48 -0
  623. synapse/storage/schema/main/delta/39/device_federation_stream_idx.sql +35 -0
  624. synapse/storage/schema/main/delta/39/event_push_index.sql +36 -0
  625. synapse/storage/schema/main/delta/39/federation_out_position.sql +41 -0
  626. synapse/storage/schema/main/delta/39/membership_profile.sql +39 -0
  627. synapse/storage/schema/main/delta/40/current_state_idx.sql +36 -0
  628. synapse/storage/schema/main/delta/40/device_inbox.sql +40 -0
  629. synapse/storage/schema/main/delta/40/device_list_streams.sql +79 -0
  630. synapse/storage/schema/main/delta/40/event_push_summary.sql +57 -0
  631. synapse/storage/schema/main/delta/40/pushers.sql +58 -0
  632. synapse/storage/schema/main/delta/41/device_list_stream_idx.sql +36 -0
  633. synapse/storage/schema/main/delta/41/device_outbound_index.sql +35 -0
  634. synapse/storage/schema/main/delta/41/event_search_event_id_idx.sql +36 -0
  635. synapse/storage/schema/main/delta/41/ratelimit.sql +41 -0
  636. synapse/storage/schema/main/delta/42/current_state_delta.sql +48 -0
  637. synapse/storage/schema/main/delta/42/device_list_last_id.sql +52 -0
  638. synapse/storage/schema/main/delta/42/event_auth_state_only.sql +36 -0
  639. synapse/storage/schema/main/delta/42/user_dir.py +88 -0
  640. synapse/storage/schema/main/delta/43/blocked_rooms.sql +40 -0
  641. synapse/storage/schema/main/delta/43/quarantine_media.sql +36 -0
  642. synapse/storage/schema/main/delta/43/url_cache.sql +35 -0
  643. synapse/storage/schema/main/delta/43/user_share.sql +52 -0
  644. synapse/storage/schema/main/delta/44/expire_url_cache.sql +60 -0
  645. synapse/storage/schema/main/delta/45/group_server.sql +186 -0
  646. synapse/storage/schema/main/delta/45/profile_cache.sql +47 -0
  647. synapse/storage/schema/main/delta/46/drop_refresh_tokens.sql +36 -0
  648. synapse/storage/schema/main/delta/46/drop_unique_deleted_pushers.sql +54 -0
  649. synapse/storage/schema/main/delta/46/group_server.sql +51 -0
  650. synapse/storage/schema/main/delta/46/local_media_repository_url_idx.sql +43 -0
  651. synapse/storage/schema/main/delta/46/user_dir_null_room_ids.sql +54 -0
  652. synapse/storage/schema/main/delta/46/user_dir_typos.sql +43 -0
  653. synapse/storage/schema/main/delta/47/last_access_media.sql +35 -0
  654. synapse/storage/schema/main/delta/47/postgres_fts_gin.sql +36 -0
  655. synapse/storage/schema/main/delta/47/push_actions_staging.sql +47 -0
  656. synapse/storage/schema/main/delta/48/add_user_consent.sql +37 -0
  657. synapse/storage/schema/main/delta/48/add_user_ips_last_seen_index.sql +36 -0
  658. synapse/storage/schema/main/delta/48/deactivated_users.sql +44 -0
  659. synapse/storage/schema/main/delta/48/group_unique_indexes.py +67 -0
  660. synapse/storage/schema/main/delta/48/groups_joinable.sql +41 -0
  661. synapse/storage/schema/main/delta/49/add_user_consent_server_notice_sent.sql +39 -0
  662. synapse/storage/schema/main/delta/49/add_user_daily_visits.sql +40 -0
  663. synapse/storage/schema/main/delta/49/add_user_ips_last_seen_only_index.sql +36 -0
  664. synapse/storage/schema/main/delta/50/add_creation_ts_users_index.sql +38 -0
  665. synapse/storage/schema/main/delta/50/erasure_store.sql +40 -0
  666. synapse/storage/schema/main/delta/50/make_event_content_nullable.py +102 -0
  667. synapse/storage/schema/main/delta/51/e2e_room_keys.sql +58 -0
  668. synapse/storage/schema/main/delta/51/monthly_active_users.sql +46 -0
  669. synapse/storage/schema/main/delta/52/add_event_to_state_group_index.sql +38 -0
  670. synapse/storage/schema/main/delta/52/device_list_streams_unique_idx.sql +55 -0
  671. synapse/storage/schema/main/delta/52/e2e_room_keys.sql +72 -0
  672. synapse/storage/schema/main/delta/53/add_user_type_to_users.sql +38 -0
  673. synapse/storage/schema/main/delta/53/drop_sent_transactions.sql +35 -0
  674. synapse/storage/schema/main/delta/53/event_format_version.sql +35 -0
  675. synapse/storage/schema/main/delta/53/user_dir_populate.sql +49 -0
  676. synapse/storage/schema/main/delta/53/user_ips_index.sql +49 -0
  677. synapse/storage/schema/main/delta/53/user_share.sql +63 -0
  678. synapse/storage/schema/main/delta/53/user_threepid_id.sql +48 -0
  679. synapse/storage/schema/main/delta/53/users_in_public_rooms.sql +47 -0
  680. synapse/storage/schema/main/delta/54/account_validity_with_renewal.sql +49 -0
  681. synapse/storage/schema/main/delta/54/add_validity_to_server_keys.sql +42 -0
  682. synapse/storage/schema/main/delta/54/delete_forward_extremities.sql +42 -0
  683. synapse/storage/schema/main/delta/54/drop_legacy_tables.sql +49 -0
  684. synapse/storage/schema/main/delta/54/drop_presence_list.sql +35 -0
  685. synapse/storage/schema/main/delta/54/relations.sql +46 -0
  686. synapse/storage/schema/main/delta/54/stats.sql +99 -0
  687. synapse/storage/schema/main/delta/54/stats2.sql +47 -0
  688. synapse/storage/schema/main/delta/55/access_token_expiry.sql +37 -0
  689. synapse/storage/schema/main/delta/55/track_threepid_validations.sql +50 -0
  690. synapse/storage/schema/main/delta/55/users_alter_deactivated.sql +38 -0
  691. synapse/storage/schema/main/delta/56/add_spans_to_device_lists.sql +39 -0
  692. synapse/storage/schema/main/delta/56/current_state_events_membership.sql +41 -0
  693. synapse/storage/schema/main/delta/56/current_state_events_membership_mk2.sql +43 -0
  694. synapse/storage/schema/main/delta/56/delete_keys_from_deleted_backups.sql +44 -0
  695. synapse/storage/schema/main/delta/56/destinations_failure_ts.sql +44 -0
  696. synapse/storage/schema/main/delta/56/destinations_retry_interval_type.sql.postgres +18 -0
  697. synapse/storage/schema/main/delta/56/device_stream_id_insert.sql +39 -0
  698. synapse/storage/schema/main/delta/56/devices_last_seen.sql +43 -0
  699. synapse/storage/schema/main/delta/56/drop_unused_event_tables.sql +39 -0
  700. synapse/storage/schema/main/delta/56/event_expiry.sql +40 -0
  701. synapse/storage/schema/main/delta/56/event_labels.sql +49 -0
  702. synapse/storage/schema/main/delta/56/event_labels_background_update.sql +36 -0
  703. synapse/storage/schema/main/delta/56/fix_room_keys_index.sql +37 -0
  704. synapse/storage/schema/main/delta/56/hidden_devices.sql +37 -0
  705. synapse/storage/schema/main/delta/56/hidden_devices_fix.sql.sqlite +42 -0
  706. synapse/storage/schema/main/delta/56/nuke_empty_communities_from_db.sql +48 -0
  707. synapse/storage/schema/main/delta/56/public_room_list_idx.sql +35 -0
  708. synapse/storage/schema/main/delta/56/redaction_censor.sql +35 -0
  709. synapse/storage/schema/main/delta/56/redaction_censor2.sql +41 -0
  710. synapse/storage/schema/main/delta/56/redaction_censor3_fix_update.sql.postgres +25 -0
  711. synapse/storage/schema/main/delta/56/redaction_censor4.sql +35 -0
  712. synapse/storage/schema/main/delta/56/remove_tombstoned_rooms_from_directory.sql +38 -0
  713. synapse/storage/schema/main/delta/56/room_key_etag.sql +36 -0
  714. synapse/storage/schema/main/delta/56/room_membership_idx.sql +37 -0
  715. synapse/storage/schema/main/delta/56/room_retention.sql +52 -0
  716. synapse/storage/schema/main/delta/56/signing_keys.sql +75 -0
  717. synapse/storage/schema/main/delta/56/signing_keys_nonunique_signatures.sql +41 -0
  718. synapse/storage/schema/main/delta/56/stats_separated.sql +175 -0
  719. synapse/storage/schema/main/delta/56/unique_user_filter_index.py +46 -0
  720. synapse/storage/schema/main/delta/56/user_external_ids.sql +43 -0
  721. synapse/storage/schema/main/delta/56/users_in_public_rooms_idx.sql +36 -0
  722. synapse/storage/schema/main/delta/57/delete_old_current_state_events.sql +41 -0
  723. synapse/storage/schema/main/delta/57/device_list_remote_cache_stale.sql +44 -0
  724. synapse/storage/schema/main/delta/57/local_current_membership.py +111 -0
  725. synapse/storage/schema/main/delta/57/remove_sent_outbound_pokes.sql +40 -0
  726. synapse/storage/schema/main/delta/57/rooms_version_column.sql +43 -0
  727. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.postgres +35 -0
  728. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.sqlite +22 -0
  729. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.postgres +39 -0
  730. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.sqlite +23 -0
  731. synapse/storage/schema/main/delta/58/02remove_dup_outbound_pokes.sql +41 -0
  732. synapse/storage/schema/main/delta/58/03persist_ui_auth.sql +55 -0
  733. synapse/storage/schema/main/delta/58/05cache_instance.sql.postgres +30 -0
  734. synapse/storage/schema/main/delta/58/06dlols_unique_idx.py +83 -0
  735. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.postgres +33 -0
  736. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.sqlite +44 -0
  737. synapse/storage/schema/main/delta/58/07persist_ui_auth_ips.sql +44 -0
  738. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.postgres +18 -0
  739. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.sqlite +18 -0
  740. synapse/storage/schema/main/delta/58/09shadow_ban.sql +37 -0
  741. synapse/storage/schema/main/delta/58/10_pushrules_enabled_delete_obsolete.sql +47 -0
  742. synapse/storage/schema/main/delta/58/10drop_local_rejections_stream.sql +41 -0
  743. synapse/storage/schema/main/delta/58/10federation_pos_instance_name.sql +41 -0
  744. synapse/storage/schema/main/delta/58/11dehydration.sql +39 -0
  745. synapse/storage/schema/main/delta/58/11fallback.sql +43 -0
  746. synapse/storage/schema/main/delta/58/11user_id_seq.py +38 -0
  747. synapse/storage/schema/main/delta/58/12room_stats.sql +51 -0
  748. synapse/storage/schema/main/delta/58/13remove_presence_allow_inbound.sql +36 -0
  749. synapse/storage/schema/main/delta/58/14events_instance_name.sql +35 -0
  750. synapse/storage/schema/main/delta/58/14events_instance_name.sql.postgres +28 -0
  751. synapse/storage/schema/main/delta/58/15_catchup_destination_rooms.sql +61 -0
  752. synapse/storage/schema/main/delta/58/15unread_count.sql +45 -0
  753. synapse/storage/schema/main/delta/58/16populate_stats_process_rooms_fix.sql +41 -0
  754. synapse/storage/schema/main/delta/58/17_catchup_last_successful.sql +40 -0
  755. synapse/storage/schema/main/delta/58/18stream_positions.sql +41 -0
  756. synapse/storage/schema/main/delta/58/19instance_map.sql.postgres +25 -0
  757. synapse/storage/schema/main/delta/58/19txn_id.sql +59 -0
  758. synapse/storage/schema/main/delta/58/20instance_name_event_tables.sql +36 -0
  759. synapse/storage/schema/main/delta/58/20user_daily_visits.sql +37 -0
  760. synapse/storage/schema/main/delta/58/21as_device_stream.sql +36 -0
  761. synapse/storage/schema/main/delta/58/21drop_device_max_stream_id.sql +1 -0
  762. synapse/storage/schema/main/delta/58/22puppet_token.sql +36 -0
  763. synapse/storage/schema/main/delta/58/22users_have_local_media.sql +2 -0
  764. synapse/storage/schema/main/delta/58/23e2e_cross_signing_keys_idx.sql +36 -0
  765. synapse/storage/schema/main/delta/58/24drop_event_json_index.sql +38 -0
  766. synapse/storage/schema/main/delta/58/25user_external_ids_user_id_idx.sql +36 -0
  767. synapse/storage/schema/main/delta/58/26access_token_last_validated.sql +37 -0
  768. synapse/storage/schema/main/delta/58/27local_invites.sql +37 -0
  769. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.postgres +16 -0
  770. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.sqlite +62 -0
  771. synapse/storage/schema/main/delta/59/01ignored_user.py +85 -0
  772. synapse/storage/schema/main/delta/59/02shard_send_to_device.sql +37 -0
  773. synapse/storage/schema/main/delta/59/03shard_send_to_device_sequence.sql.postgres +25 -0
  774. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql +71 -0
  775. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql.postgres +16 -0
  776. synapse/storage/schema/main/delta/59/04drop_account_data.sql +36 -0
  777. synapse/storage/schema/main/delta/59/05cache_invalidation.sql +36 -0
  778. synapse/storage/schema/main/delta/59/06chain_cover_index.sql +36 -0
  779. synapse/storage/schema/main/delta/59/06shard_account_data.sql +39 -0
  780. synapse/storage/schema/main/delta/59/06shard_account_data.sql.postgres +32 -0
  781. synapse/storage/schema/main/delta/59/07shard_account_data_fix.sql +37 -0
  782. synapse/storage/schema/main/delta/59/08delete_pushers_for_deactivated_accounts.sql +39 -0
  783. synapse/storage/schema/main/delta/59/08delete_stale_pushers.sql +39 -0
  784. synapse/storage/schema/main/delta/59/09rejected_events_metadata.sql +45 -0
  785. synapse/storage/schema/main/delta/59/10delete_purged_chain_cover.sql +36 -0
  786. synapse/storage/schema/main/delta/59/11add_knock_members_to_stats.sql +39 -0
  787. synapse/storage/schema/main/delta/59/11drop_thumbnail_constraint.sql.postgres +22 -0
  788. synapse/storage/schema/main/delta/59/12account_validity_token_used_ts_ms.sql +37 -0
  789. synapse/storage/schema/main/delta/59/12presence_stream_instance.sql +37 -0
  790. synapse/storage/schema/main/delta/59/12presence_stream_instance_seq.sql.postgres +20 -0
  791. synapse/storage/schema/main/delta/59/13users_to_send_full_presence_to.sql +53 -0
  792. synapse/storage/schema/main/delta/59/14refresh_tokens.sql +53 -0
  793. synapse/storage/schema/main/delta/59/15locks.sql +56 -0
  794. synapse/storage/schema/main/delta/59/16federation_inbound_staging.sql +51 -0
  795. synapse/storage/schema/main/delta/60/01recreate_stream_ordering.sql.postgres +45 -0
  796. synapse/storage/schema/main/delta/60/02change_stream_ordering_columns.sql.postgres +30 -0
  797. synapse/storage/schema/main/delta/61/01change_appservices_txns.sql.postgres +23 -0
  798. synapse/storage/schema/main/delta/61/01insertion_event_lookups.sql +68 -0
  799. synapse/storage/schema/main/delta/61/02drop_redundant_room_depth_index.sql +37 -0
  800. synapse/storage/schema/main/delta/61/03recreate_min_depth.py +74 -0
  801. synapse/storage/schema/main/delta/62/01insertion_event_extremities.sql +43 -0
  802. synapse/storage/schema/main/delta/63/01create_registration_tokens.sql +42 -0
  803. synapse/storage/schema/main/delta/63/02delete_unlinked_email_pushers.sql +39 -0
  804. synapse/storage/schema/main/delta/63/02populate-rooms-creator.sql +36 -0
  805. synapse/storage/schema/main/delta/63/03session_store.sql +42 -0
  806. synapse/storage/schema/main/delta/63/04add_presence_stream_not_offline_index.sql +37 -0
  807. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.postgres +23 -0
  808. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.sqlite +37 -0
  809. synapse/storage/schema/main/delta/65/01msc2716_insertion_event_edges.sql +38 -0
  810. synapse/storage/schema/main/delta/65/03remove_hidden_devices_from_device_inbox.sql +41 -0
  811. synapse/storage/schema/main/delta/65/04_local_group_updates.sql +37 -0
  812. synapse/storage/schema/main/delta/65/05_remove_room_stats_historical_and_user_stats_historical.sql +38 -0
  813. synapse/storage/schema/main/delta/65/06remove_deleted_devices_from_device_inbox.sql +53 -0
  814. synapse/storage/schema/main/delta/65/07_arbitrary_relations.sql +37 -0
  815. synapse/storage/schema/main/delta/65/08_device_inbox_background_updates.sql +37 -0
  816. synapse/storage/schema/main/delta/65/10_expirable_refresh_tokens.sql +47 -0
  817. synapse/storage/schema/main/delta/65/11_devices_auth_provider_session.sql +46 -0
  818. synapse/storage/schema/main/delta/67/01drop_public_room_list_stream.sql +37 -0
  819. synapse/storage/schema/main/delta/68/01event_columns.sql +45 -0
  820. synapse/storage/schema/main/delta/68/02_msc2409_add_device_id_appservice_stream_type.sql +40 -0
  821. synapse/storage/schema/main/delta/68/03_delete_account_data_for_deactivated_accounts.sql +39 -0
  822. synapse/storage/schema/main/delta/68/04_refresh_tokens_index_next_token_id.sql +47 -0
  823. synapse/storage/schema/main/delta/68/04partial_state_rooms.sql +60 -0
  824. synapse/storage/schema/main/delta/68/05_delete_non_strings_from_event_search.sql.sqlite +22 -0
  825. synapse/storage/schema/main/delta/68/05partial_state_rooms_triggers.py +80 -0
  826. synapse/storage/schema/main/delta/68/06_msc3202_add_device_list_appservice_stream_type.sql +42 -0
  827. synapse/storage/schema/main/delta/69/01as_txn_seq.py +54 -0
  828. synapse/storage/schema/main/delta/69/01device_list_oubound_by_room.sql +57 -0
  829. synapse/storage/schema/main/delta/69/02cache_invalidation_index.sql +37 -0
  830. synapse/storage/schema/main/delta/70/01clean_table_purged_rooms.sql +39 -0
  831. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.postgres +43 -0
  832. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.sqlite +47 -0
  833. synapse/storage/schema/main/delta/71/01remove_noop_background_updates.sql +80 -0
  834. synapse/storage/schema/main/delta/71/02event_push_summary_unique.sql +37 -0
  835. synapse/storage/schema/main/delta/72/01add_room_type_to_state_stats.sql +38 -0
  836. synapse/storage/schema/main/delta/72/01event_push_summary_receipt.sql +54 -0
  837. synapse/storage/schema/main/delta/72/02event_push_actions_index.sql +38 -0
  838. synapse/storage/schema/main/delta/72/03bg_populate_events_columns.py +57 -0
  839. synapse/storage/schema/main/delta/72/03drop_event_reference_hashes.sql +36 -0
  840. synapse/storage/schema/main/delta/72/03remove_groups.sql +50 -0
  841. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.postgres +17 -0
  842. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.sqlite +40 -0
  843. synapse/storage/schema/main/delta/72/05receipts_event_stream_ordering.sql +38 -0
  844. synapse/storage/schema/main/delta/72/05remove_unstable_private_read_receipts.sql +38 -0
  845. synapse/storage/schema/main/delta/72/06add_consent_ts_to_users.sql +35 -0
  846. synapse/storage/schema/main/delta/72/06thread_notifications.sql +49 -0
  847. synapse/storage/schema/main/delta/72/07force_update_current_state_events_membership.py +67 -0
  848. synapse/storage/schema/main/delta/72/07thread_receipts.sql.postgres +30 -0
  849. synapse/storage/schema/main/delta/72/07thread_receipts.sql.sqlite +70 -0
  850. synapse/storage/schema/main/delta/72/08begin_cache_invalidation_seq_at_2.sql.postgres +23 -0
  851. synapse/storage/schema/main/delta/72/08thread_receipts.sql +39 -0
  852. synapse/storage/schema/main/delta/72/09partial_indices.sql.sqlite +56 -0
  853. synapse/storage/schema/main/delta/73/01event_failed_pull_attempts.sql +48 -0
  854. synapse/storage/schema/main/delta/73/02add_pusher_enabled.sql +35 -0
  855. synapse/storage/schema/main/delta/73/02room_id_indexes_for_purging.sql +41 -0
  856. synapse/storage/schema/main/delta/73/03pusher_device_id.sql +39 -0
  857. synapse/storage/schema/main/delta/73/03users_approved_column.sql +39 -0
  858. synapse/storage/schema/main/delta/73/04partial_join_details.sql +42 -0
  859. synapse/storage/schema/main/delta/73/04pending_device_list_updates.sql +47 -0
  860. synapse/storage/schema/main/delta/73/05old_push_actions.sql.postgres +22 -0
  861. synapse/storage/schema/main/delta/73/05old_push_actions.sql.sqlite +24 -0
  862. synapse/storage/schema/main/delta/73/06thread_notifications_thread_id_idx.sql +42 -0
  863. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.postgres +23 -0
  864. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.sqlite +76 -0
  865. synapse/storage/schema/main/delta/73/09partial_joined_via_destination.sql +37 -0
  866. synapse/storage/schema/main/delta/73/09threads_table.sql +49 -0
  867. synapse/storage/schema/main/delta/73/10_update_sqlite_fts4_tokenizer.py +71 -0
  868. synapse/storage/schema/main/delta/73/10login_tokens.sql +54 -0
  869. synapse/storage/schema/main/delta/73/11event_search_room_id_n_distinct.sql.postgres +33 -0
  870. synapse/storage/schema/main/delta/73/12refactor_device_list_outbound_pokes.sql +72 -0
  871. synapse/storage/schema/main/delta/73/13add_device_lists_index.sql +39 -0
  872. synapse/storage/schema/main/delta/73/20_un_partial_stated_room_stream.sql +51 -0
  873. synapse/storage/schema/main/delta/73/21_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  874. synapse/storage/schema/main/delta/73/22_rebuild_user_dir_stats.sql +48 -0
  875. synapse/storage/schema/main/delta/73/22_un_partial_stated_event_stream.sql +53 -0
  876. synapse/storage/schema/main/delta/73/23_fix_thread_index.sql +52 -0
  877. synapse/storage/schema/main/delta/73/23_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  878. synapse/storage/schema/main/delta/73/24_events_jump_to_date_index.sql +36 -0
  879. synapse/storage/schema/main/delta/73/25drop_presence.sql +36 -0
  880. synapse/storage/schema/main/delta/74/01_user_directory_stale_remote_users.sql +58 -0
  881. synapse/storage/schema/main/delta/74/02_set_device_id_for_pushers_bg_update.sql +38 -0
  882. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.postgres +29 -0
  883. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.sqlite +23 -0
  884. synapse/storage/schema/main/delta/74/03_room_membership_index.sql +38 -0
  885. synapse/storage/schema/main/delta/74/04_delete_e2e_backup_keys_for_deactivated_users.sql +36 -0
  886. synapse/storage/schema/main/delta/74/04_membership_tables_event_stream_ordering_triggers.py +87 -0
  887. synapse/storage/schema/main/delta/74/05_events_txn_id_device_id.sql +72 -0
  888. synapse/storage/schema/main/delta/74/90COMMENTS_destinations.sql.postgres +52 -0
  889. synapse/storage/schema/main/delta/76/01_add_profiles_full_user_id_column.sql +39 -0
  890. synapse/storage/schema/main/delta/76/02_add_user_filters_full_user_id_column.sql +39 -0
  891. synapse/storage/schema/main/delta/76/03_per_user_experimental_features.sql +46 -0
  892. synapse/storage/schema/main/delta/76/04_add_room_forgetter.sql +43 -0
  893. synapse/storage/schema/main/delta/77/01_add_profiles_not_valid_check.sql.postgres +16 -0
  894. synapse/storage/schema/main/delta/77/02_add_user_filters_not_valid_check.sql.postgres +16 -0
  895. synapse/storage/schema/main/delta/77/03bg_populate_full_user_id_profiles.sql +35 -0
  896. synapse/storage/schema/main/delta/77/04bg_populate_full_user_id_user_filters.sql +35 -0
  897. synapse/storage/schema/main/delta/77/05thread_notifications_backfill.sql +67 -0
  898. synapse/storage/schema/main/delta/77/06thread_notifications_not_null.sql.sqlite +102 -0
  899. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions.sql.postgres +27 -0
  900. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions_staging.sql.postgres +27 -0
  901. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_summary.sql.postgres +29 -0
  902. synapse/storage/schema/main/delta/77/14bg_indices_event_stream_ordering.sql +39 -0
  903. synapse/storage/schema/main/delta/78/01_validate_and_update_profiles.py +99 -0
  904. synapse/storage/schema/main/delta/78/02_validate_and_update_user_filters.py +100 -0
  905. synapse/storage/schema/main/delta/78/03_remove_unused_indexes_user_filters.py +72 -0
  906. synapse/storage/schema/main/delta/78/03event_extremities_constraints.py +65 -0
  907. synapse/storage/schema/main/delta/78/04_add_full_user_id_index_user_filters.py +32 -0
  908. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.postgres +102 -0
  909. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.sqlite +72 -0
  910. synapse/storage/schema/main/delta/79/04_mitigate_stream_ordering_update_race.py +70 -0
  911. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.postgres +69 -0
  912. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.sqlite +65 -0
  913. synapse/storage/schema/main/delta/80/01_users_alter_locked.sql +35 -0
  914. synapse/storage/schema/main/delta/80/02_read_write_locks_unlogged.sql.postgres +30 -0
  915. synapse/storage/schema/main/delta/80/02_scheduled_tasks.sql +47 -0
  916. synapse/storage/schema/main/delta/80/03_read_write_locks_triggers.sql.postgres +37 -0
  917. synapse/storage/schema/main/delta/80/04_read_write_locks_deadlock.sql.postgres +71 -0
  918. synapse/storage/schema/main/delta/82/02_scheduled_tasks_index.sql +35 -0
  919. synapse/storage/schema/main/delta/82/04_add_indices_for_purging_rooms.sql +39 -0
  920. synapse/storage/schema/main/delta/82/05gaps.sql +44 -0
  921. synapse/storage/schema/main/delta/83/01_drop_old_tables.sql +43 -0
  922. synapse/storage/schema/main/delta/83/03_instance_name_receipts.sql.sqlite +17 -0
  923. synapse/storage/schema/main/delta/83/05_cross_signing_key_update_grant.sql +34 -0
  924. synapse/storage/schema/main/delta/83/06_event_push_summary_room.sql +36 -0
  925. synapse/storage/schema/main/delta/84/01_auth_links_stats.sql.postgres +20 -0
  926. synapse/storage/schema/main/delta/84/02_auth_links_index.sql +16 -0
  927. synapse/storage/schema/main/delta/84/03_auth_links_analyze.sql.postgres +16 -0
  928. synapse/storage/schema/main/delta/84/04_access_token_index.sql +15 -0
  929. synapse/storage/schema/main/delta/85/01_add_suspended.sql +14 -0
  930. synapse/storage/schema/main/delta/85/02_add_instance_names.sql +27 -0
  931. synapse/storage/schema/main/delta/85/03_new_sequences.sql.postgres +54 -0
  932. synapse/storage/schema/main/delta/85/04_cleanup_device_federation_outbox.sql +15 -0
  933. synapse/storage/schema/main/delta/85/05_add_instance_names_converted_pos.sql +16 -0
  934. synapse/storage/schema/main/delta/85/06_add_room_reports.sql +20 -0
  935. synapse/storage/schema/main/delta/86/01_authenticate_media.sql +15 -0
  936. synapse/storage/schema/main/delta/86/02_receipts_event_id_index.sql +15 -0
  937. synapse/storage/schema/main/delta/87/01_sliding_sync_memberships.sql +169 -0
  938. synapse/storage/schema/main/delta/87/02_per_connection_state.sql +81 -0
  939. synapse/storage/schema/main/delta/87/03_current_state_index.sql +19 -0
  940. synapse/storage/schema/main/delta/88/01_add_delayed_events.sql +43 -0
  941. synapse/storage/schema/main/delta/88/01_custom_profile_fields.sql +15 -0
  942. synapse/storage/schema/main/delta/88/02_fix_sliding_sync_membership_snapshots_forgotten_column.sql +21 -0
  943. synapse/storage/schema/main/delta/88/03_add_otk_ts_added_index.sql +18 -0
  944. synapse/storage/schema/main/delta/88/04_current_state_delta_index.sql +18 -0
  945. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.postgres +19 -0
  946. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.sqlite +19 -0
  947. synapse/storage/schema/main/delta/88/05_sliding_sync_room_config_index.sql +20 -0
  948. synapse/storage/schema/main/delta/88/06_events_received_ts_index.sql +17 -0
  949. synapse/storage/schema/main/delta/89/01_sliding_sync_membership_snapshot_index.sql +15 -0
  950. synapse/storage/schema/main/delta/90/01_add_column_participant_room_memberships_table.sql +16 -0
  951. synapse/storage/schema/main/delta/91/01_media_hash.sql +28 -0
  952. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.postgres +16 -0
  953. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.sqlite +16 -0
  954. synapse/storage/schema/main/delta/92/02_remove_populate_participant_bg_update.sql +17 -0
  955. synapse/storage/schema/main/delta/92/04_ss_membership_snapshot_idx.sql +16 -0
  956. synapse/storage/schema/main/delta/92/04_thread_subscriptions.sql +59 -0
  957. synapse/storage/schema/main/delta/92/04_thread_subscriptions_seq.sql.postgres +19 -0
  958. synapse/storage/schema/main/delta/92/05_fixup_max_depth_cap.sql +17 -0
  959. synapse/storage/schema/main/delta/92/05_thread_subscriptions_comments.sql.postgres +18 -0
  960. synapse/storage/schema/main/delta/92/06_device_federation_inbox_index.sql +16 -0
  961. synapse/storage/schema/main/delta/92/06_threads_last_sent_stream_ordering_comments.sql.postgres +24 -0
  962. synapse/storage/schema/main/delta/92/07_add_user_reports.sql +22 -0
  963. synapse/storage/schema/main/delta/92/07_event_txn_id_device_id_txn_id2.sql +15 -0
  964. synapse/storage/schema/main/delta/92/08_room_ban_redactions.sql +21 -0
  965. synapse/storage/schema/main/delta/92/08_thread_subscriptions_seq_fixup.sql.postgres +19 -0
  966. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql +20 -0
  967. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql.postgres +18 -0
  968. synapse/storage/schema/main/delta/93/01_add_delayed_events.sql +15 -0
  969. synapse/storage/schema/main/full_schemas/72/full.sql.postgres +1344 -0
  970. synapse/storage/schema/main/full_schemas/72/full.sql.sqlite +646 -0
  971. synapse/storage/schema/state/delta/23/drop_state_index.sql +35 -0
  972. synapse/storage/schema/state/delta/32/remove_state_indices.sql +38 -0
  973. synapse/storage/schema/state/delta/35/add_state_index.sql +36 -0
  974. synapse/storage/schema/state/delta/35/state.sql +41 -0
  975. synapse/storage/schema/state/delta/35/state_dedupe.sql +36 -0
  976. synapse/storage/schema/state/delta/47/state_group_seq.py +38 -0
  977. synapse/storage/schema/state/delta/56/state_group_room_idx.sql +36 -0
  978. synapse/storage/schema/state/delta/61/02state_groups_state_n_distinct.sql.postgres +34 -0
  979. synapse/storage/schema/state/delta/70/08_state_group_edges_unique.sql +36 -0
  980. synapse/storage/schema/state/delta/89/01_state_groups_deletion.sql +39 -0
  981. synapse/storage/schema/state/delta/90/02_delete_unreferenced_state_groups.sql +16 -0
  982. synapse/storage/schema/state/delta/90/03_remove_old_deletion_bg_update.sql +15 -0
  983. synapse/storage/schema/state/full_schemas/72/full.sql.postgres +30 -0
  984. synapse/storage/schema/state/full_schemas/72/full.sql.sqlite +20 -0
  985. synapse/storage/types.py +183 -0
  986. synapse/storage/util/__init__.py +20 -0
  987. synapse/storage/util/id_generators.py +928 -0
  988. synapse/storage/util/partial_state_events_tracker.py +194 -0
  989. synapse/storage/util/sequence.py +315 -0
  990. synapse/streams/__init__.py +43 -0
  991. synapse/streams/config.py +91 -0
  992. synapse/streams/events.py +203 -0
  993. synapse/synapse_rust/__init__.pyi +3 -0
  994. synapse/synapse_rust/acl.pyi +20 -0
  995. synapse/synapse_rust/events.pyi +136 -0
  996. synapse/synapse_rust/http_client.pyi +32 -0
  997. synapse/synapse_rust/push.pyi +86 -0
  998. synapse/synapse_rust/rendezvous.pyi +30 -0
  999. synapse/synapse_rust/segmenter.pyi +1 -0
  1000. synapse/synapse_rust.abi3.so +0 -0
  1001. synapse/types/__init__.py +1600 -0
  1002. synapse/types/handlers/__init__.py +93 -0
  1003. synapse/types/handlers/policy_server.py +16 -0
  1004. synapse/types/handlers/sliding_sync.py +908 -0
  1005. synapse/types/rest/__init__.py +25 -0
  1006. synapse/types/rest/client/__init__.py +413 -0
  1007. synapse/types/state.py +634 -0
  1008. synapse/types/storage/__init__.py +66 -0
  1009. synapse/util/__init__.py +169 -0
  1010. synapse/util/async_helpers.py +1045 -0
  1011. synapse/util/background_queue.py +142 -0
  1012. synapse/util/batching_queue.py +202 -0
  1013. synapse/util/caches/__init__.py +300 -0
  1014. synapse/util/caches/cached_call.py +143 -0
  1015. synapse/util/caches/deferred_cache.py +530 -0
  1016. synapse/util/caches/descriptors.py +692 -0
  1017. synapse/util/caches/dictionary_cache.py +346 -0
  1018. synapse/util/caches/expiringcache.py +249 -0
  1019. synapse/util/caches/lrucache.py +975 -0
  1020. synapse/util/caches/response_cache.py +322 -0
  1021. synapse/util/caches/stream_change_cache.py +370 -0
  1022. synapse/util/caches/treecache.py +189 -0
  1023. synapse/util/caches/ttlcache.py +197 -0
  1024. synapse/util/cancellation.py +63 -0
  1025. synapse/util/check_dependencies.py +335 -0
  1026. synapse/util/clock.py +567 -0
  1027. synapse/util/constants.py +22 -0
  1028. synapse/util/daemonize.py +165 -0
  1029. synapse/util/distributor.py +157 -0
  1030. synapse/util/events.py +134 -0
  1031. synapse/util/file_consumer.py +164 -0
  1032. synapse/util/frozenutils.py +57 -0
  1033. synapse/util/gai_resolver.py +178 -0
  1034. synapse/util/hash.py +38 -0
  1035. synapse/util/httpresourcetree.py +108 -0
  1036. synapse/util/iterutils.py +189 -0
  1037. synapse/util/json.py +56 -0
  1038. synapse/util/linked_list.py +156 -0
  1039. synapse/util/logcontext.py +46 -0
  1040. synapse/util/logformatter.py +28 -0
  1041. synapse/util/macaroons.py +325 -0
  1042. synapse/util/manhole.py +191 -0
  1043. synapse/util/metrics.py +339 -0
  1044. synapse/util/module_loader.py +116 -0
  1045. synapse/util/msisdn.py +51 -0
  1046. synapse/util/patch_inline_callbacks.py +250 -0
  1047. synapse/util/pydantic_models.py +63 -0
  1048. synapse/util/ratelimitutils.py +419 -0
  1049. synapse/util/retryutils.py +339 -0
  1050. synapse/util/rlimit.py +42 -0
  1051. synapse/util/rust.py +133 -0
  1052. synapse/util/sentinel.py +21 -0
  1053. synapse/util/stringutils.py +293 -0
  1054. synapse/util/task_scheduler.py +493 -0
  1055. synapse/util/templates.py +126 -0
  1056. synapse/util/threepids.py +123 -0
  1057. synapse/util/wheel_timer.py +112 -0
  1058. synapse/visibility.py +835 -0
@@ -0,0 +1,1604 @@
1
+ #!/usr/bin/env python
2
+ #
3
+ # This file is licensed under the Affero General Public License (AGPL) version 3.
4
+ #
5
+ # Copyright 2019 The Matrix.org Foundation C.I.C.
6
+ # Copyright 2015, 2016 OpenMarket Ltd
7
+ # Copyright (C) 2023 New Vector, Ltd
8
+ #
9
+ # This program is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU Affero General Public License as
11
+ # published by the Free Software Foundation, either version 3 of the
12
+ # License, or (at your option) any later version.
13
+ #
14
+ # See the GNU Affero General Public License for more details:
15
+ # <https://www.gnu.org/licenses/agpl-3.0.html>.
16
+ #
17
+ # Originally licensed under the Apache License, Version 2.0:
18
+ # <http://www.apache.org/licenses/LICENSE-2.0>.
19
+ #
20
+ # [This file includes modifications made by New Vector Limited]
21
+ #
22
+ #
23
+
24
+ import argparse
25
+ import curses
26
+ import logging
27
+ import os
28
+ import sys
29
+ import time
30
+ import traceback
31
+ from types import TracebackType
32
+ from typing import (
33
+ Any,
34
+ Awaitable,
35
+ Callable,
36
+ Generator,
37
+ Iterable,
38
+ NoReturn,
39
+ Optional,
40
+ TypedDict,
41
+ TypeVar,
42
+ cast,
43
+ )
44
+
45
+ import yaml
46
+
47
+ from twisted.internet import defer, reactor as reactor_
48
+
49
+ from synapse.config.database import DatabaseConnectionConfig
50
+ from synapse.config.homeserver import HomeServerConfig
51
+ from synapse.logging.context import (
52
+ make_deferred_yieldable,
53
+ run_in_background,
54
+ )
55
+ from synapse.server import HomeServer
56
+ from synapse.storage import DataStore
57
+ from synapse.storage.database import DatabasePool, LoggingTransaction, make_conn
58
+ from synapse.storage.databases.main import FilteringWorkerStore
59
+ from synapse.storage.databases.main.account_data import AccountDataWorkerStore
60
+ from synapse.storage.databases.main.client_ips import ClientIpBackgroundUpdateStore
61
+ from synapse.storage.databases.main.delayed_events import DelayedEventsStore
62
+ from synapse.storage.databases.main.deviceinbox import DeviceInboxBackgroundUpdateStore
63
+ from synapse.storage.databases.main.devices import DeviceBackgroundUpdateStore
64
+ from synapse.storage.databases.main.e2e_room_keys import EndToEndRoomKeyBackgroundStore
65
+ from synapse.storage.databases.main.end_to_end_keys import EndToEndKeyBackgroundStore
66
+ from synapse.storage.databases.main.event_federation import EventFederationWorkerStore
67
+ from synapse.storage.databases.main.event_push_actions import EventPushActionsStore
68
+ from synapse.storage.databases.main.events_bg_updates import (
69
+ EventsBackgroundUpdatesStore,
70
+ )
71
+ from synapse.storage.databases.main.media_repository import (
72
+ MediaRepositoryBackgroundUpdateStore,
73
+ )
74
+ from synapse.storage.databases.main.presence import PresenceBackgroundUpdateStore
75
+ from synapse.storage.databases.main.profile import ProfileWorkerStore
76
+ from synapse.storage.databases.main.push_rule import PusherWorkerStore
77
+ from synapse.storage.databases.main.pusher import PusherBackgroundUpdatesStore
78
+ from synapse.storage.databases.main.receipts import ReceiptsBackgroundUpdateStore
79
+ from synapse.storage.databases.main.registration import (
80
+ RegistrationBackgroundUpdateStore,
81
+ find_max_generated_user_id_localpart,
82
+ )
83
+ from synapse.storage.databases.main.relations import RelationsWorkerStore
84
+ from synapse.storage.databases.main.room import RoomBackgroundUpdateStore
85
+ from synapse.storage.databases.main.roommember import RoomMemberBackgroundUpdateStore
86
+ from synapse.storage.databases.main.search import SearchBackgroundUpdateStore
87
+ from synapse.storage.databases.main.sliding_sync import SlidingSyncStore
88
+ from synapse.storage.databases.main.state import MainStateBackgroundUpdateStore
89
+ from synapse.storage.databases.main.stats import StatsStore
90
+ from synapse.storage.databases.main.user_directory import (
91
+ UserDirectoryBackgroundUpdateStore,
92
+ )
93
+ from synapse.storage.databases.state.bg_updates import StateBackgroundUpdateStore
94
+ from synapse.storage.engines import create_engine
95
+ from synapse.storage.prepare_database import prepare_database
96
+ from synapse.types import ISynapseReactor
97
+
98
+ # Cast safety: Twisted does some naughty magic which replaces the
99
+ # twisted.internet.reactor module with a Reactor instance at runtime.
100
+ reactor = cast(ISynapseReactor, reactor_)
101
+ logger = logging.getLogger("synapse_port_db")
102
+
103
+
104
+ # SQLite doesn't have a dedicated boolean type (it stores True/False as 1/0). This means
105
+ # portdb will read sqlite bools as integers, then try to insert them into postgres
106
+ # boolean columns---which fails. Lacking some Python-parseable metaschema, we must
107
+ # specify which integer columns should be inserted as booleans into postgres.
108
+ BOOLEAN_COLUMNS = {
109
+ "access_tokens": ["used"],
110
+ "account_validity": ["email_sent"],
111
+ "delayed_events": ["is_processed"],
112
+ "device_lists_changes_in_room": ["converted_to_destinations"],
113
+ "device_lists_outbound_pokes": ["sent"],
114
+ "devices": ["hidden"],
115
+ "e2e_fallback_keys_json": ["used"],
116
+ "e2e_room_keys": ["is_verified"],
117
+ "event_edges": ["is_state"],
118
+ "events": ["processed", "outlier", "contains_url"],
119
+ "local_media_repository": ["safe_from_quarantine", "authenticated"],
120
+ "per_user_experimental_features": ["enabled"],
121
+ "presence_list": ["accepted"],
122
+ "presence_stream": ["currently_active"],
123
+ "public_room_list_stream": ["visibility"],
124
+ "pushers": ["enabled"],
125
+ "redactions": ["have_censored"],
126
+ "remote_media_cache": ["authenticated"],
127
+ "room_memberships": ["participant"],
128
+ "room_stats_state": ["is_federatable"],
129
+ "rooms": ["is_public", "has_auth_chain_index"],
130
+ "sliding_sync_joined_rooms": ["is_encrypted"],
131
+ "sliding_sync_membership_snapshots": [
132
+ "has_known_state",
133
+ "is_encrypted",
134
+ ],
135
+ "thread_subscriptions": ["subscribed", "automatic"],
136
+ "users": ["shadow_banned", "approved", "locked", "suspended"],
137
+ "un_partial_stated_event_stream": ["rejection_status_changed"],
138
+ "users_who_share_rooms": ["share_private"],
139
+ }
140
+
141
+
142
+ # These tables are never deleted from in normal operation [*], so we can resume porting
143
+ # over rows from a previous attempt rather than starting from scratch.
144
+ #
145
+ # [*]: We do delete from many of these tables when purging a room, and
146
+ # presumably when purging old events. So we might e.g.
147
+ #
148
+ # 1. Run portdb and port half of some table.
149
+ # 2. Stop portdb.
150
+ # 3. Purge something, deleting some of the rows we've ported over.
151
+ # 4. Restart portdb. The rows deleted from sqlite are still present in postgres.
152
+ #
153
+ # But this isn't the end of the world: we should be able to repeat the purge
154
+ # on the postgres DB when porting completes.
155
+ APPEND_ONLY_TABLES = [
156
+ "cache_invalidation_stream_by_instance",
157
+ "event_auth",
158
+ "event_edges",
159
+ "event_json",
160
+ "event_reference_hashes",
161
+ "event_search",
162
+ "event_to_state_groups",
163
+ "events",
164
+ "ex_outlier_stream",
165
+ "local_media_repository",
166
+ "local_media_repository_thumbnails",
167
+ "presence_stream",
168
+ "public_room_list_stream",
169
+ "push_rules_stream",
170
+ "received_transactions",
171
+ "redactions",
172
+ "rejections",
173
+ "remote_media_cache",
174
+ "remote_media_cache_thumbnails",
175
+ "room_memberships",
176
+ "room_names",
177
+ "rooms",
178
+ "sent_transactions",
179
+ "state_events",
180
+ "state_group_edges",
181
+ "state_groups",
182
+ "state_groups_state",
183
+ "stream_ordering_to_exterm",
184
+ "topics",
185
+ "transaction_id_to_pdu",
186
+ "un_partial_stated_event_stream",
187
+ "users",
188
+ ]
189
+
190
+ # These tables declare their id column with "PRIMARY KEY AUTOINCREMENT" on sqlite side
191
+ # and with "PRIMARY KEY GENERATED ALWAYS AS IDENTITY" on postgres side. This creates an
192
+ # implicit sequence that needs its value to be migrated separately. Additionally,
193
+ # inserting on postgres side needs to use the "OVERRIDING SYSTEM VALUE" modifier.
194
+ AUTOINCREMENT_TABLES = {
195
+ "sliding_sync_connections",
196
+ "sliding_sync_connection_positions",
197
+ "sliding_sync_connection_required_state",
198
+ "state_groups_pending_deletion",
199
+ }
200
+
201
+ IGNORED_TABLES = {
202
+ # We don't port these tables, as they're a faff and we can regenerate
203
+ # them anyway.
204
+ "user_directory",
205
+ "user_directory_search",
206
+ "user_directory_search_content",
207
+ "user_directory_search_docsize",
208
+ "user_directory_search_segdir",
209
+ "user_directory_search_segments",
210
+ "user_directory_search_stat",
211
+ "user_directory_search_pos",
212
+ "users_who_share_private_rooms",
213
+ "users_in_public_rooms",
214
+ # UI auth sessions have foreign keys so additional care needs to be taken,
215
+ # the sessions are transient anyway, so ignore them.
216
+ "ui_auth_sessions",
217
+ "ui_auth_sessions_credentials",
218
+ "ui_auth_sessions_ips",
219
+ # Ignore the worker locks table, as a) there shouldn't be any acquired locks
220
+ # after porting, and b) the circular foreign key constraints make it hard to
221
+ # port.
222
+ "worker_read_write_locks_mode",
223
+ "worker_read_write_locks",
224
+ }
225
+
226
+
227
+ # These background updates will not be applied upon creation of the postgres database.
228
+ IGNORED_BACKGROUND_UPDATES = {
229
+ # Reapplying this background update to the postgres database is unnecessary after
230
+ # already having waited for the SQLite database to complete all running background
231
+ # updates.
232
+ "mark_unreferenced_state_groups_for_deletion_bg_update",
233
+ }
234
+
235
+
236
+ # Error returned by the run function. Used at the top-level part of the script to
237
+ # handle errors and return codes.
238
+ end_error: str | None = None
239
+ # The exec_info for the error, if any. If error is defined but not exec_info the script
240
+ # will show only the error message without the stacktrace, if exec_info is defined but
241
+ # not the error then the script will show nothing outside of what's printed in the run
242
+ # function. If both are defined, the script will print both the error and the stacktrace.
243
+ end_error_exec_info: tuple[type[BaseException], BaseException, TracebackType] | None = (
244
+ None
245
+ )
246
+
247
+ R = TypeVar("R")
248
+
249
+
250
+ class Store(
251
+ EventPushActionsStore,
252
+ ClientIpBackgroundUpdateStore,
253
+ DeviceInboxBackgroundUpdateStore,
254
+ DeviceBackgroundUpdateStore,
255
+ EventsBackgroundUpdatesStore,
256
+ MediaRepositoryBackgroundUpdateStore,
257
+ RegistrationBackgroundUpdateStore,
258
+ RoomBackgroundUpdateStore,
259
+ RoomMemberBackgroundUpdateStore,
260
+ SearchBackgroundUpdateStore,
261
+ StateBackgroundUpdateStore,
262
+ MainStateBackgroundUpdateStore,
263
+ UserDirectoryBackgroundUpdateStore,
264
+ EndToEndKeyBackgroundStore,
265
+ EndToEndRoomKeyBackgroundStore,
266
+ StatsStore,
267
+ AccountDataWorkerStore,
268
+ FilteringWorkerStore,
269
+ ProfileWorkerStore,
270
+ PusherWorkerStore,
271
+ PusherBackgroundUpdatesStore,
272
+ PresenceBackgroundUpdateStore,
273
+ ReceiptsBackgroundUpdateStore,
274
+ RelationsWorkerStore,
275
+ EventFederationWorkerStore,
276
+ SlidingSyncStore,
277
+ DelayedEventsStore,
278
+ ):
279
+ def execute(self, f: Callable[..., R], *args: Any, **kwargs: Any) -> Awaitable[R]:
280
+ return self.db_pool.runInteraction(f.__name__, f, *args, **kwargs)
281
+
282
+ def execute_sql(self, sql: str, *args: object) -> Awaitable[list[tuple]]:
283
+ def r(txn: LoggingTransaction) -> list[tuple]:
284
+ txn.execute(sql, args)
285
+ return txn.fetchall()
286
+
287
+ return self.db_pool.runInteraction("execute_sql", r)
288
+
289
+ def insert_many_txn(
290
+ self,
291
+ txn: LoggingTransaction,
292
+ table: str,
293
+ headers: list[str],
294
+ rows: list[tuple],
295
+ override_system_value: bool = False,
296
+ ) -> None:
297
+ sql = "INSERT INTO %s (%s) %s VALUES (%s)" % (
298
+ table,
299
+ ", ".join(k for k in headers),
300
+ "OVERRIDING SYSTEM VALUE" if override_system_value else "",
301
+ ", ".join("%s" for _ in headers),
302
+ )
303
+
304
+ try:
305
+ txn.executemany(sql, rows)
306
+ except Exception:
307
+ logger.exception("Failed to insert: %s", table)
308
+ raise
309
+
310
+ # Note: the parent method is an `async def`.
311
+ def set_room_is_public(self, room_id: str, is_public: bool) -> NoReturn:
312
+ raise Exception(
313
+ "Attempt to set room_is_public during port_db: database not empty?"
314
+ )
315
+
316
+
317
+ class MockHomeserver(HomeServer):
318
+ DATASTORE_CLASS = DataStore
319
+
320
+ def __init__(self, config: HomeServerConfig):
321
+ super().__init__(
322
+ hostname=config.server.server_name,
323
+ config=config,
324
+ reactor=reactor,
325
+ )
326
+
327
+
328
+ class Porter:
329
+ def __init__(
330
+ self,
331
+ sqlite_config: dict[str, Any],
332
+ progress: "Progress",
333
+ batch_size: int,
334
+ hs: HomeServer,
335
+ ):
336
+ self.sqlite_config = sqlite_config
337
+ self.progress = progress
338
+ self.batch_size = batch_size
339
+ self.hs = hs
340
+
341
+ async def setup_table(self, table: str) -> tuple[str, int, int, int, int]:
342
+ if table in APPEND_ONLY_TABLES:
343
+ # It's safe to just carry on inserting.
344
+ row = await self.postgres_store.db_pool.simple_select_one(
345
+ table="port_from_sqlite3",
346
+ keyvalues={"table_name": table},
347
+ retcols=("forward_rowid", "backward_rowid"),
348
+ allow_none=True,
349
+ )
350
+
351
+ total_to_port = None
352
+ if row is None:
353
+ if table == "sent_transactions":
354
+ (
355
+ forward_chunk,
356
+ already_ported,
357
+ total_to_port,
358
+ ) = await self._setup_sent_transactions()
359
+ backward_chunk = 0
360
+ else:
361
+ await self.postgres_store.db_pool.simple_insert(
362
+ table="port_from_sqlite3",
363
+ values={
364
+ "table_name": table,
365
+ "forward_rowid": 1,
366
+ "backward_rowid": 0,
367
+ },
368
+ )
369
+
370
+ forward_chunk = 1
371
+ backward_chunk = 0
372
+ already_ported = 0
373
+ else:
374
+ forward_chunk, backward_chunk = row
375
+
376
+ if total_to_port is None:
377
+ already_ported, total_to_port = await self._get_total_count_to_port(
378
+ table, forward_chunk, backward_chunk
379
+ )
380
+ else:
381
+
382
+ def delete_all(txn: LoggingTransaction) -> None:
383
+ txn.execute(
384
+ "DELETE FROM port_from_sqlite3 WHERE table_name = %s", (table,)
385
+ )
386
+ txn.execute("TRUNCATE %s CASCADE" % (table,))
387
+
388
+ await self.postgres_store.execute(delete_all)
389
+
390
+ await self.postgres_store.db_pool.simple_insert(
391
+ table="port_from_sqlite3",
392
+ values={"table_name": table, "forward_rowid": 1, "backward_rowid": 0},
393
+ )
394
+
395
+ forward_chunk = 1
396
+ backward_chunk = 0
397
+
398
+ already_ported, total_to_port = await self._get_total_count_to_port(
399
+ table, forward_chunk, backward_chunk
400
+ )
401
+
402
+ return table, already_ported, total_to_port, forward_chunk, backward_chunk
403
+
404
+ async def get_table_constraints(self) -> dict[str, set[str]]:
405
+ """Returns a map of tables that have foreign key constraints to tables they depend on."""
406
+
407
+ def _get_constraints(txn: LoggingTransaction) -> dict[str, set[str]]:
408
+ # We can pull the information about foreign key constraints out from
409
+ # the postgres schema tables.
410
+ sql = """
411
+ SELECT DISTINCT
412
+ tc.table_name,
413
+ ccu.table_name AS foreign_table_name
414
+ FROM
415
+ information_schema.table_constraints AS tc
416
+ INNER JOIN information_schema.constraint_column_usage AS ccu
417
+ USING (table_schema, constraint_name)
418
+ WHERE tc.constraint_type = 'FOREIGN KEY'
419
+ AND tc.table_name != ccu.table_name;
420
+ """
421
+ txn.execute(sql)
422
+
423
+ results: dict[str, set[str]] = {}
424
+ for table, foreign_table in txn:
425
+ results.setdefault(table, set()).add(foreign_table)
426
+ return results
427
+
428
+ return await self.postgres_store.db_pool.runInteraction(
429
+ "get_table_constraints", _get_constraints
430
+ )
431
+
432
+ async def handle_table(
433
+ self,
434
+ table: str,
435
+ postgres_size: int,
436
+ table_size: int,
437
+ forward_chunk: int,
438
+ backward_chunk: int,
439
+ ) -> None:
440
+ logger.info(
441
+ "Table %s: %i/%i (rows %i-%i) already ported",
442
+ table,
443
+ postgres_size,
444
+ table_size,
445
+ backward_chunk + 1,
446
+ forward_chunk - 1,
447
+ )
448
+
449
+ if not table_size:
450
+ return
451
+
452
+ self.progress.add_table(table, postgres_size, table_size)
453
+
454
+ if table == "event_search":
455
+ await self.handle_search_table(
456
+ postgres_size, table_size, forward_chunk, backward_chunk
457
+ )
458
+ return
459
+
460
+ if table in IGNORED_TABLES:
461
+ self.progress.update(table, table_size) # Mark table as done
462
+ return
463
+
464
+ if table == "user_directory_stream_pos":
465
+ # We need to make sure there is a single row, `(X, null), as that is
466
+ # what synapse expects to be there.
467
+ await self.postgres_store.db_pool.simple_insert(
468
+ table=table, values={"stream_id": None}
469
+ )
470
+ self.progress.update(table, table_size) # Mark table as done
471
+ return
472
+
473
+ # We sweep over rowids in two directions: one forwards (rowids 1, 2, 3, ...)
474
+ # and another backwards (rowids 0, -1, -2, ...).
475
+ forward_select = (
476
+ "SELECT rowid, * FROM %s WHERE rowid >= ? ORDER BY rowid LIMIT ?" % (table,)
477
+ )
478
+
479
+ backward_select = (
480
+ "SELECT rowid, * FROM %s WHERE rowid <= ? ORDER BY rowid DESC LIMIT ?"
481
+ % (table,)
482
+ )
483
+
484
+ do_forward = [True]
485
+ do_backward = [True]
486
+
487
+ while True:
488
+
489
+ def r(
490
+ txn: LoggingTransaction,
491
+ ) -> tuple[list[str] | None, list[tuple], list[tuple]]:
492
+ forward_rows = []
493
+ backward_rows = []
494
+ if do_forward[0]:
495
+ txn.execute(forward_select, (forward_chunk, self.batch_size))
496
+ forward_rows = txn.fetchall()
497
+ if not forward_rows:
498
+ do_forward[0] = False
499
+
500
+ if do_backward[0]:
501
+ txn.execute(backward_select, (backward_chunk, self.batch_size))
502
+ backward_rows = txn.fetchall()
503
+ if not backward_rows:
504
+ do_backward[0] = False
505
+
506
+ if forward_rows or backward_rows:
507
+ assert txn.description is not None
508
+ headers: list[str] | None = [
509
+ column[0] for column in txn.description
510
+ ]
511
+ else:
512
+ headers = None
513
+
514
+ return headers, forward_rows, backward_rows
515
+
516
+ headers, frows, brows = await self.sqlite_store.db_pool.runInteraction(
517
+ "select", r
518
+ )
519
+
520
+ if frows or brows:
521
+ assert headers is not None
522
+ if frows:
523
+ forward_chunk = max(row[0] for row in frows) + 1
524
+ if brows:
525
+ backward_chunk = min(row[0] for row in brows) - 1
526
+
527
+ rows = frows + brows
528
+ rows = self._convert_rows(table, headers, rows)
529
+
530
+ def insert(txn: LoggingTransaction) -> None:
531
+ assert headers is not None
532
+ self.postgres_store.insert_many_txn(
533
+ txn,
534
+ table,
535
+ headers[1:],
536
+ rows,
537
+ override_system_value=table in AUTOINCREMENT_TABLES,
538
+ )
539
+
540
+ self.postgres_store.db_pool.simple_update_one_txn(
541
+ txn,
542
+ table="port_from_sqlite3",
543
+ keyvalues={"table_name": table},
544
+ updatevalues={
545
+ "forward_rowid": forward_chunk,
546
+ "backward_rowid": backward_chunk,
547
+ },
548
+ )
549
+
550
+ await self.postgres_store.execute(insert)
551
+
552
+ postgres_size += len(rows)
553
+
554
+ self.progress.update(table, postgres_size)
555
+ else:
556
+ return
557
+
558
+ async def handle_search_table(
559
+ self,
560
+ postgres_size: int,
561
+ table_size: int,
562
+ forward_chunk: int,
563
+ backward_chunk: int,
564
+ ) -> None:
565
+ select = (
566
+ "SELECT es.rowid, es.*, e.origin_server_ts, e.stream_ordering"
567
+ " FROM event_search as es"
568
+ " INNER JOIN events AS e USING (event_id, room_id)"
569
+ " WHERE es.rowid >= ?"
570
+ " ORDER BY es.rowid LIMIT ?"
571
+ )
572
+
573
+ while True:
574
+
575
+ def r(txn: LoggingTransaction) -> tuple[list[str], list[tuple]]:
576
+ txn.execute(select, (forward_chunk, self.batch_size))
577
+ rows = txn.fetchall()
578
+ assert txn.description is not None
579
+ headers = [column[0] for column in txn.description]
580
+
581
+ return headers, rows
582
+
583
+ headers, rows = await self.sqlite_store.db_pool.runInteraction("select", r)
584
+
585
+ if rows:
586
+ forward_chunk = rows[-1][0] + 1
587
+
588
+ # We have to treat event_search differently since it has a
589
+ # different structure in the two different databases.
590
+ def insert(txn: LoggingTransaction) -> None:
591
+ sql = (
592
+ "INSERT INTO event_search (event_id, room_id, key,"
593
+ " sender, vector, origin_server_ts, stream_ordering)"
594
+ " VALUES (?,?,?,?,to_tsvector('english', ?),?,?)"
595
+ )
596
+
597
+ rows_dict = []
598
+ for row in rows:
599
+ d = dict(zip(headers, row))
600
+ if "\0" in d["value"]:
601
+ logger.warning("dropping search row %s", d)
602
+ else:
603
+ rows_dict.append(d)
604
+
605
+ txn.executemany(
606
+ sql,
607
+ [
608
+ (
609
+ row["event_id"],
610
+ row["room_id"],
611
+ row["key"],
612
+ row["sender"],
613
+ row["value"],
614
+ row["origin_server_ts"],
615
+ row["stream_ordering"],
616
+ )
617
+ for row in rows_dict
618
+ ],
619
+ )
620
+
621
+ self.postgres_store.db_pool.simple_update_one_txn(
622
+ txn,
623
+ table="port_from_sqlite3",
624
+ keyvalues={"table_name": "event_search"},
625
+ updatevalues={
626
+ "forward_rowid": forward_chunk,
627
+ "backward_rowid": backward_chunk,
628
+ },
629
+ )
630
+
631
+ await self.postgres_store.execute(insert)
632
+
633
+ postgres_size += len(rows)
634
+
635
+ self.progress.update("event_search", postgres_size)
636
+
637
+ else:
638
+ return
639
+
640
+ def build_db_store(
641
+ self,
642
+ db_config: DatabaseConnectionConfig,
643
+ allow_outdated_version: bool = False,
644
+ ) -> Store:
645
+ """Builds and returns a database store using the provided configuration.
646
+
647
+ Args:
648
+ db_config: The database configuration
649
+ allow_outdated_version: True to suppress errors about the database server
650
+ version being too old to run a complete synapse
651
+
652
+ Returns:
653
+ The built Store object.
654
+ """
655
+ self.progress.set_state("Preparing %s" % db_config.config["name"])
656
+
657
+ engine = create_engine(db_config.config)
658
+
659
+ server_name = self.hs.hostname
660
+
661
+ with make_conn(
662
+ db_config=db_config,
663
+ engine=engine,
664
+ default_txn_name="portdb",
665
+ server_name=server_name,
666
+ ) as db_conn:
667
+ engine.check_database(
668
+ db_conn, allow_outdated_version=allow_outdated_version
669
+ )
670
+ prepare_database(db_conn, engine, config=self.hs.config)
671
+ # Type safety: ignore that we're using Mock homeservers here.
672
+ store = Store(
673
+ DatabasePool(
674
+ self.hs,
675
+ db_config,
676
+ engine,
677
+ ),
678
+ db_conn,
679
+ self.hs,
680
+ )
681
+ db_conn.commit()
682
+
683
+ return store
684
+
685
+ async def run_background_updates_on_postgres(self) -> None:
686
+ # Manually apply all background updates on the PostgreSQL database.
687
+ postgres_ready = (
688
+ await self.postgres_store.db_pool.updates.has_completed_background_updates()
689
+ )
690
+
691
+ if not postgres_ready:
692
+ # Only say that we're running background updates when there are background
693
+ # updates to run.
694
+ self.progress.set_state("Running background updates on PostgreSQL")
695
+
696
+ while not postgres_ready:
697
+ await self.postgres_store.db_pool.updates.do_next_background_update(True)
698
+ postgres_ready = await (
699
+ self.postgres_store.db_pool.updates.has_completed_background_updates()
700
+ )
701
+
702
+ @staticmethod
703
+ def _is_sqlite_autovacuum_enabled(txn: LoggingTransaction) -> bool:
704
+ """
705
+ Returns true if auto_vacuum is enabled in SQLite.
706
+ https://www.sqlite.org/pragma.html#pragma_auto_vacuum
707
+
708
+ Vacuuming changes the rowids on rows in the database.
709
+ Auto-vacuuming is therefore dangerous when used in conjunction with this script.
710
+
711
+ Note that the auto_vacuum setting can't be changed without performing
712
+ a VACUUM after trying to change the pragma.
713
+ """
714
+ txn.execute("PRAGMA auto_vacuum")
715
+ row = txn.fetchone()
716
+ assert row is not None, "`PRAGMA auto_vacuum` did not give a row."
717
+ (autovacuum_setting,) = row
718
+ # 0 means off. 1 means full. 2 means incremental.
719
+ return autovacuum_setting != 0
720
+
721
+ async def remove_ignored_background_updates_from_database(self) -> None:
722
+ def _remove_delete_unreferenced_state_groups_bg_updates(
723
+ txn: LoggingTransaction,
724
+ ) -> None:
725
+ txn.execute(
726
+ "DELETE FROM background_updates WHERE update_name = ANY(?)",
727
+ (list(IGNORED_BACKGROUND_UPDATES),),
728
+ )
729
+
730
+ await self.postgres_store.db_pool.runInteraction(
731
+ "remove_delete_unreferenced_state_groups_bg_updates",
732
+ _remove_delete_unreferenced_state_groups_bg_updates,
733
+ )
734
+
735
+ async def run(self) -> None:
736
+ """Ports the SQLite database to a PostgreSQL database.
737
+
738
+ When a fatal error is met, its message is assigned to the global "end_error"
739
+ variable. When this error comes with a stacktrace, its exec_info is assigned to
740
+ the global "end_error_exec_info" variable.
741
+ """
742
+ global end_error
743
+
744
+ try:
745
+ # we allow people to port away from outdated versions of sqlite.
746
+ self.sqlite_store = self.build_db_store(
747
+ DatabaseConnectionConfig("master-sqlite", self.sqlite_config),
748
+ allow_outdated_version=True,
749
+ )
750
+
751
+ # For safety, ensure auto_vacuums are disabled.
752
+ if await self.sqlite_store.db_pool.runInteraction(
753
+ "is_sqlite_autovacuum_enabled", self._is_sqlite_autovacuum_enabled
754
+ ):
755
+ end_error = (
756
+ "auto_vacuum is enabled in the SQLite database."
757
+ " (This is not the default configuration.)\n"
758
+ " This script relies on rowids being consistent and must not"
759
+ " be used if the database could be vacuumed between re-runs.\n"
760
+ " To disable auto_vacuum, you need to stop Synapse and run the following SQL:\n"
761
+ " PRAGMA auto_vacuum=off;\n"
762
+ " VACUUM;"
763
+ )
764
+ return
765
+
766
+ # Check if all background updates are done, abort if not.
767
+ updates_complete = await self.sqlite_store.db_pool.updates.has_completed_background_updates()
768
+ if not updates_complete:
769
+ end_error = (
770
+ "Pending background updates exist in the SQLite3 database."
771
+ " Please start Synapse again and wait until every update has finished"
772
+ " before running this script.\n"
773
+ )
774
+ return
775
+
776
+ self.postgres_store = self.build_db_store(
777
+ self.hs.config.database.get_single_database()
778
+ )
779
+
780
+ await self.remove_ignored_background_updates_from_database()
781
+
782
+ await self.run_background_updates_on_postgres()
783
+
784
+ self.progress.set_state("Creating port tables")
785
+
786
+ def create_port_table(txn: LoggingTransaction) -> None:
787
+ txn.execute(
788
+ "CREATE TABLE IF NOT EXISTS port_from_sqlite3 ("
789
+ " table_name varchar(100) NOT NULL UNIQUE,"
790
+ " forward_rowid bigint NOT NULL,"
791
+ " backward_rowid bigint NOT NULL"
792
+ ")"
793
+ )
794
+
795
+ # The old port script created a table with just a "rowid" column.
796
+ # We want people to be able to rerun this script from an old port
797
+ # so that they can pick up any missing events that were not
798
+ # ported across.
799
+ def alter_table(txn: LoggingTransaction) -> None:
800
+ txn.execute(
801
+ "ALTER TABLE IF EXISTS port_from_sqlite3"
802
+ " RENAME rowid TO forward_rowid"
803
+ )
804
+ txn.execute(
805
+ "ALTER TABLE IF EXISTS port_from_sqlite3"
806
+ " ADD backward_rowid bigint NOT NULL DEFAULT 0"
807
+ )
808
+
809
+ try:
810
+ await self.postgres_store.db_pool.runInteraction(
811
+ "alter_table", alter_table
812
+ )
813
+ except Exception:
814
+ # On Error Resume Next
815
+ pass
816
+
817
+ await self.postgres_store.db_pool.runInteraction(
818
+ "create_port_table", create_port_table
819
+ )
820
+
821
+ # Step 2. Set up sequences
822
+ #
823
+ # We do this before porting the tables so that even if we fail half
824
+ # way through the postgres DB always have sequences that are greater
825
+ # than their respective tables. If we don't then creating the
826
+ # `DataStore` object will fail due to the inconsistency.
827
+ self.progress.set_state("Setting up sequence generators")
828
+ await self._setup_state_group_id_seq()
829
+ await self._setup_user_id_seq()
830
+ await self._setup_events_stream_seqs()
831
+ await self._setup_sequence(
832
+ "un_partial_stated_event_stream_sequence",
833
+ [("un_partial_stated_event_stream", "stream_id")],
834
+ )
835
+ await self._setup_sequence(
836
+ "device_inbox_sequence",
837
+ [
838
+ ("device_inbox", "stream_id"),
839
+ ("device_federation_outbox", "stream_id"),
840
+ ],
841
+ )
842
+ await self._setup_sequence(
843
+ "account_data_sequence",
844
+ [
845
+ ("room_account_data", "stream_id"),
846
+ ("room_tags_revisions", "stream_id"),
847
+ ("account_data", "stream_id"),
848
+ ],
849
+ )
850
+ await self._setup_sequence(
851
+ "receipts_sequence",
852
+ [
853
+ ("receipts_linearized", "stream_id"),
854
+ ],
855
+ )
856
+ await self._setup_sequence(
857
+ "presence_stream_sequence",
858
+ [
859
+ ("presence_stream", "stream_id"),
860
+ ],
861
+ )
862
+ await self._setup_auth_chain_sequence()
863
+ await self._setup_sequence(
864
+ "application_services_txn_id_seq",
865
+ [
866
+ (
867
+ "application_services_txns",
868
+ "txn_id",
869
+ )
870
+ ],
871
+ )
872
+ await self._setup_sequence(
873
+ "device_lists_sequence",
874
+ [
875
+ ("device_lists_stream", "stream_id"),
876
+ ("user_signature_stream", "stream_id"),
877
+ ("device_lists_outbound_pokes", "stream_id"),
878
+ ("device_lists_changes_in_room", "stream_id"),
879
+ ("device_lists_remote_pending", "stream_id"),
880
+ ("device_lists_changes_converted_stream_position", "stream_id"),
881
+ ],
882
+ )
883
+ await self._setup_sequence(
884
+ "e2e_cross_signing_keys_sequence",
885
+ [
886
+ ("e2e_cross_signing_keys", "stream_id"),
887
+ ],
888
+ )
889
+ await self._setup_sequence(
890
+ "push_rules_stream_sequence",
891
+ [
892
+ ("push_rules_stream", "stream_id"),
893
+ ],
894
+ )
895
+ await self._setup_sequence(
896
+ "pushers_sequence",
897
+ [
898
+ ("pushers", "id"),
899
+ ("deleted_pushers", "stream_id"),
900
+ ],
901
+ )
902
+
903
+ await self._setup_autoincrement_sequence(
904
+ "sliding_sync_connection_positions", "connection_position"
905
+ )
906
+ await self._setup_autoincrement_sequence(
907
+ "sliding_sync_connection_required_state", "required_state_id"
908
+ )
909
+ await self._setup_autoincrement_sequence(
910
+ "sliding_sync_connections", "connection_key"
911
+ )
912
+ await self._setup_autoincrement_sequence(
913
+ "state_groups_pending_deletion", "sequence_number"
914
+ )
915
+
916
+ # Step 3. Get tables.
917
+ self.progress.set_state("Fetching tables")
918
+ sqlite_tables = await self.sqlite_store.db_pool.simple_select_onecol(
919
+ table="sqlite_master", keyvalues={"type": "table"}, retcol="name"
920
+ )
921
+
922
+ postgres_tables = await self.postgres_store.db_pool.simple_select_onecol(
923
+ table="information_schema.tables",
924
+ keyvalues={},
925
+ retcol="distinct table_name",
926
+ )
927
+
928
+ tables = set(sqlite_tables) & set(postgres_tables)
929
+ logger.info("Found %d tables", len(tables))
930
+
931
+ # Step 4. Figure out what still needs copying
932
+ self.progress.set_state("Checking on port progress")
933
+ setup_res = await make_deferred_yieldable(
934
+ defer.gatherResults(
935
+ [
936
+ run_in_background(self.setup_table, table)
937
+ for table in tables
938
+ if table not in ["schema_version", "applied_schema_deltas"]
939
+ and not table.startswith("sqlite_")
940
+ ],
941
+ consumeErrors=True,
942
+ )
943
+ )
944
+ # Map from table name to args passed to `handle_table`, i.e. a tuple
945
+ # of: `postgres_size`, `table_size`, `forward_chunk`, `backward_chunk`.
946
+ tables_to_port_info_map = {
947
+ r[0]: r[1:] for r in setup_res if r[0] not in IGNORED_TABLES
948
+ }
949
+
950
+ # Step 5. Do the copying.
951
+ #
952
+ # This is slightly convoluted as we need to ensure tables are ported
953
+ # in the correct order due to foreign key constraints.
954
+ self.progress.set_state("Copying to postgres")
955
+
956
+ constraints = await self.get_table_constraints()
957
+ tables_ported = set() # type: set[str]
958
+
959
+ while tables_to_port_info_map:
960
+ # Pulls out all tables that are still to be ported and which
961
+ # only depend on tables that are already ported (if any).
962
+ tables_to_port = [
963
+ table
964
+ for table in tables_to_port_info_map
965
+ if not constraints.get(table, set()) - tables_ported
966
+ ]
967
+
968
+ await make_deferred_yieldable(
969
+ defer.gatherResults(
970
+ [
971
+ run_in_background(
972
+ self.handle_table,
973
+ table,
974
+ *tables_to_port_info_map.pop(table),
975
+ )
976
+ for table in tables_to_port
977
+ ],
978
+ consumeErrors=True,
979
+ )
980
+ )
981
+
982
+ tables_ported.update(tables_to_port)
983
+
984
+ self.progress.done()
985
+ except Exception as e:
986
+ global end_error_exec_info
987
+ end_error = str(e)
988
+ # Type safety: we're in an exception handler, so the exc_info() tuple
989
+ # will not be (None, None, None).
990
+ end_error_exec_info = sys.exc_info() # type: ignore[assignment]
991
+ logger.exception("")
992
+ finally:
993
+ reactor.stop()
994
+
995
+ def _convert_rows(
996
+ self, table: str, headers: list[str], rows: list[tuple]
997
+ ) -> list[tuple]:
998
+ bool_col_names = BOOLEAN_COLUMNS.get(table, [])
999
+
1000
+ bool_cols = [i for i, h in enumerate(headers) if h in bool_col_names]
1001
+
1002
+ class BadValueException(Exception):
1003
+ pass
1004
+
1005
+ def conv(j: int, col: object) -> object:
1006
+ if j in bool_cols:
1007
+ return bool(col)
1008
+ if isinstance(col, bytes):
1009
+ return bytearray(col)
1010
+ elif isinstance(col, str) and "\0" in col:
1011
+ logger.warning(
1012
+ "DROPPING ROW: NUL value in table %s col %s: %r",
1013
+ table,
1014
+ headers[j],
1015
+ col,
1016
+ )
1017
+ raise BadValueException()
1018
+ return col
1019
+
1020
+ outrows = []
1021
+ for row in rows:
1022
+ try:
1023
+ outrows.append(
1024
+ tuple(conv(j, col) for j, col in enumerate(row) if j > 0)
1025
+ )
1026
+ except BadValueException:
1027
+ pass
1028
+
1029
+ return outrows
1030
+
1031
+ async def _setup_sent_transactions(self) -> tuple[int, int, int]:
1032
+ # Only save things from the last day
1033
+ yesterday = int(time.time() * 1000) - 86400000
1034
+
1035
+ # And save the max transaction id from each destination
1036
+ select = (
1037
+ "SELECT rowid, * FROM sent_transactions WHERE rowid IN ("
1038
+ "SELECT max(rowid) FROM sent_transactions"
1039
+ " GROUP BY destination"
1040
+ ")"
1041
+ )
1042
+
1043
+ def r(txn: LoggingTransaction) -> tuple[list[str], list[tuple]]:
1044
+ txn.execute(select)
1045
+ rows = txn.fetchall()
1046
+ assert txn.description is not None
1047
+ headers = [column[0] for column in txn.description]
1048
+
1049
+ ts_ind = headers.index("ts")
1050
+
1051
+ return headers, [r for r in rows if r[ts_ind] < yesterday]
1052
+
1053
+ headers, rows = await self.sqlite_store.db_pool.runInteraction("select", r)
1054
+
1055
+ rows = self._convert_rows("sent_transactions", headers, rows)
1056
+
1057
+ inserted_rows = len(rows)
1058
+ if inserted_rows:
1059
+ max_inserted_rowid = max(r[0] for r in rows)
1060
+
1061
+ def insert(txn: LoggingTransaction) -> None:
1062
+ self.postgres_store.insert_many_txn(
1063
+ txn, "sent_transactions", headers[1:], rows
1064
+ )
1065
+
1066
+ await self.postgres_store.execute(insert)
1067
+ else:
1068
+ max_inserted_rowid = 0
1069
+
1070
+ def get_start_id(txn: LoggingTransaction) -> int:
1071
+ txn.execute(
1072
+ "SELECT rowid FROM sent_transactions WHERE ts >= ?"
1073
+ " ORDER BY rowid ASC LIMIT 1",
1074
+ (yesterday,),
1075
+ )
1076
+
1077
+ rows = txn.fetchall()
1078
+ if rows:
1079
+ return rows[0][0]
1080
+ else:
1081
+ return 1
1082
+
1083
+ next_chunk = await self.sqlite_store.execute(get_start_id)
1084
+ next_chunk = max(max_inserted_rowid + 1, next_chunk)
1085
+
1086
+ await self.postgres_store.db_pool.simple_insert(
1087
+ table="port_from_sqlite3",
1088
+ values={
1089
+ "table_name": "sent_transactions",
1090
+ "forward_rowid": next_chunk,
1091
+ "backward_rowid": 0,
1092
+ },
1093
+ )
1094
+
1095
+ def get_sent_table_size(txn: LoggingTransaction) -> int:
1096
+ txn.execute(
1097
+ "SELECT count(*) FROM sent_transactions WHERE ts >= ?", (yesterday,)
1098
+ )
1099
+ result = txn.fetchone()
1100
+ assert result is not None
1101
+ return int(result[0])
1102
+
1103
+ remaining_count = await self.sqlite_store.execute(get_sent_table_size)
1104
+
1105
+ total_count = remaining_count + inserted_rows
1106
+
1107
+ return next_chunk, inserted_rows, total_count
1108
+
1109
+ async def _get_remaining_count_to_port(
1110
+ self, table: str, forward_chunk: int, backward_chunk: int
1111
+ ) -> int:
1112
+ frows = cast(
1113
+ list[tuple[int]],
1114
+ await self.sqlite_store.execute_sql(
1115
+ "SELECT count(*) FROM %s WHERE rowid >= ?" % (table,), forward_chunk
1116
+ ),
1117
+ )
1118
+
1119
+ brows = cast(
1120
+ list[tuple[int]],
1121
+ await self.sqlite_store.execute_sql(
1122
+ "SELECT count(*) FROM %s WHERE rowid <= ?" % (table,), backward_chunk
1123
+ ),
1124
+ )
1125
+
1126
+ return frows[0][0] + brows[0][0]
1127
+
1128
+ async def _get_already_ported_count(self, table: str) -> int:
1129
+ rows = await self.postgres_store.execute_sql(
1130
+ "SELECT count(*) FROM %s" % (table,)
1131
+ )
1132
+
1133
+ return rows[0][0]
1134
+
1135
+ async def _get_total_count_to_port(
1136
+ self, table: str, forward_chunk: int, backward_chunk: int
1137
+ ) -> tuple[int, int]:
1138
+ remaining, done = await make_deferred_yieldable(
1139
+ defer.gatherResults(
1140
+ [
1141
+ run_in_background(
1142
+ self._get_remaining_count_to_port,
1143
+ table,
1144
+ forward_chunk,
1145
+ backward_chunk,
1146
+ ),
1147
+ run_in_background(self._get_already_ported_count, table),
1148
+ ],
1149
+ )
1150
+ )
1151
+
1152
+ remaining = int(remaining) if remaining else 0
1153
+ done = int(done) if done else 0
1154
+
1155
+ return done, remaining + done
1156
+
1157
+ async def _setup_state_group_id_seq(self) -> None:
1158
+ curr_id: int | None = await self.sqlite_store.db_pool.simple_select_one_onecol(
1159
+ table="state_groups", keyvalues={}, retcol="MAX(id)", allow_none=True
1160
+ )
1161
+
1162
+ if not curr_id:
1163
+ return
1164
+
1165
+ def r(txn: LoggingTransaction) -> None:
1166
+ assert curr_id is not None
1167
+ next_id = curr_id + 1
1168
+ txn.execute("ALTER SEQUENCE state_group_id_seq RESTART WITH %s", (next_id,))
1169
+
1170
+ await self.postgres_store.db_pool.runInteraction("setup_state_group_id_seq", r)
1171
+
1172
+ async def _setup_user_id_seq(self) -> None:
1173
+ curr_id = await self.sqlite_store.db_pool.runInteraction(
1174
+ "setup_user_id_seq", find_max_generated_user_id_localpart
1175
+ )
1176
+
1177
+ def r(txn: LoggingTransaction) -> None:
1178
+ next_id = curr_id + 1
1179
+ txn.execute("ALTER SEQUENCE user_id_seq RESTART WITH %s", (next_id,))
1180
+
1181
+ await self.postgres_store.db_pool.runInteraction("setup_user_id_seq", r)
1182
+
1183
+ async def _setup_events_stream_seqs(self) -> None:
1184
+ """Set the event stream sequences to the correct values."""
1185
+
1186
+ # We get called before we've ported the events table, so we need to
1187
+ # fetch the current positions from the SQLite store.
1188
+ curr_forward_id = await self.sqlite_store.db_pool.simple_select_one_onecol(
1189
+ table="events", keyvalues={}, retcol="MAX(stream_ordering)", allow_none=True
1190
+ )
1191
+
1192
+ curr_backward_id = await self.sqlite_store.db_pool.simple_select_one_onecol(
1193
+ table="events",
1194
+ keyvalues={},
1195
+ retcol="MAX(-MIN(stream_ordering), 1)",
1196
+ allow_none=True,
1197
+ )
1198
+
1199
+ def _setup_events_stream_seqs_set_pos(txn: LoggingTransaction) -> None:
1200
+ if curr_forward_id:
1201
+ txn.execute(
1202
+ "ALTER SEQUENCE events_stream_seq RESTART WITH %s",
1203
+ (curr_forward_id + 1,),
1204
+ )
1205
+
1206
+ if curr_backward_id:
1207
+ txn.execute(
1208
+ "ALTER SEQUENCE events_backfill_stream_seq RESTART WITH %s",
1209
+ (curr_backward_id + 1,),
1210
+ )
1211
+
1212
+ await self.postgres_store.db_pool.runInteraction(
1213
+ "_setup_events_stream_seqs",
1214
+ _setup_events_stream_seqs_set_pos,
1215
+ )
1216
+
1217
+ async def _setup_sequence(
1218
+ self,
1219
+ sequence_name: str,
1220
+ stream_id_tables: Iterable[tuple[str, str]],
1221
+ ) -> None:
1222
+ """Set a sequence to the correct value."""
1223
+ current_stream_ids = []
1224
+ for stream_id_table, column_name in stream_id_tables:
1225
+ max_stream_id = cast(
1226
+ int,
1227
+ await self.sqlite_store.db_pool.simple_select_one_onecol(
1228
+ table=stream_id_table,
1229
+ keyvalues={},
1230
+ retcol=f"COALESCE(MAX({column_name}), 1)",
1231
+ allow_none=True,
1232
+ ),
1233
+ )
1234
+ current_stream_ids.append(max_stream_id)
1235
+
1236
+ next_id = max(current_stream_ids) + 1
1237
+
1238
+ def r(txn: LoggingTransaction) -> None:
1239
+ sql = "ALTER SEQUENCE %s RESTART WITH" % (sequence_name,)
1240
+ txn.execute(sql + " %s", (next_id,))
1241
+
1242
+ await self.postgres_store.db_pool.runInteraction(
1243
+ "_setup_%s" % (sequence_name,), r
1244
+ )
1245
+
1246
+ async def _setup_autoincrement_sequence(
1247
+ self,
1248
+ sqlite_table_name: str,
1249
+ sqlite_id_column_name: str,
1250
+ ) -> None:
1251
+ """Set a sequence to the correct value. Use where id column was declared with PRIMARY KEY AUTOINCREMENT."""
1252
+ seq_name = await self._pg_get_serial_sequence(
1253
+ sqlite_table_name, sqlite_id_column_name
1254
+ )
1255
+ if seq_name is None:
1256
+ raise Exception(
1257
+ "implicit sequence not found for table " + sqlite_table_name
1258
+ )
1259
+
1260
+ seq_value = await self.sqlite_store.db_pool.simple_select_one_onecol(
1261
+ table="sqlite_sequence",
1262
+ keyvalues={"name": sqlite_table_name},
1263
+ retcol="seq",
1264
+ allow_none=True,
1265
+ )
1266
+ if seq_value is None:
1267
+ return
1268
+
1269
+ def r(txn: LoggingTransaction) -> None:
1270
+ sql = "ALTER SEQUENCE %s RESTART WITH" % (seq_name,)
1271
+ txn.execute(sql + " %s", (seq_value + 1,))
1272
+
1273
+ await self.postgres_store.db_pool.runInteraction("_setup_%s" % (seq_name,), r)
1274
+
1275
+ async def _pg_get_serial_sequence(self, table: str, column: str) -> str | None:
1276
+ """Returns the name of the postgres sequence associated with a column, or NULL."""
1277
+
1278
+ def r(txn: LoggingTransaction) -> str | None:
1279
+ txn.execute("SELECT pg_get_serial_sequence('%s', '%s')" % (table, column))
1280
+ result = txn.fetchone()
1281
+ if not result:
1282
+ return None
1283
+ return result[0]
1284
+
1285
+ return await self.postgres_store.db_pool.runInteraction(
1286
+ "_pg_get_serial_sequence", r
1287
+ )
1288
+
1289
+ async def _setup_auth_chain_sequence(self) -> None:
1290
+ curr_chain_id: (
1291
+ int | None
1292
+ ) = await self.sqlite_store.db_pool.simple_select_one_onecol(
1293
+ table="event_auth_chains",
1294
+ keyvalues={},
1295
+ retcol="MAX(chain_id)",
1296
+ allow_none=True,
1297
+ )
1298
+
1299
+ def r(txn: LoggingTransaction) -> None:
1300
+ # Presumably there is at least one row in event_auth_chains.
1301
+ assert curr_chain_id is not None
1302
+ txn.execute(
1303
+ "ALTER SEQUENCE event_auth_chain_id RESTART WITH %s",
1304
+ (curr_chain_id + 1,),
1305
+ )
1306
+
1307
+ if curr_chain_id is not None:
1308
+ await self.postgres_store.db_pool.runInteraction(
1309
+ "_setup_event_auth_chain_id",
1310
+ r,
1311
+ )
1312
+
1313
+
1314
+ ##############################################
1315
+ # The following is simply UI stuff
1316
+ ##############################################
1317
+
1318
+
1319
+ class TableProgress(TypedDict):
1320
+ start: int
1321
+ num_done: int
1322
+ total: int
1323
+ perc: int
1324
+
1325
+
1326
+ class Progress:
1327
+ """Used to report progress of the port"""
1328
+
1329
+ def __init__(self) -> None:
1330
+ self.tables: dict[str, TableProgress] = {}
1331
+
1332
+ self.start_time = int(time.time())
1333
+
1334
+ def add_table(self, table: str, cur: int, size: int) -> None:
1335
+ self.tables[table] = {
1336
+ "start": cur,
1337
+ "num_done": cur,
1338
+ "total": size,
1339
+ "perc": int(cur * 100 / size),
1340
+ }
1341
+
1342
+ def update(self, table: str, num_done: int) -> None:
1343
+ data = self.tables[table]
1344
+ data["num_done"] = num_done
1345
+ data["perc"] = int(num_done * 100 / data["total"])
1346
+
1347
+ def done(self) -> None:
1348
+ pass
1349
+
1350
+ def set_state(self, state: str) -> None:
1351
+ pass
1352
+
1353
+
1354
+ class CursesProgress(Progress):
1355
+ """Reports progress to a curses window"""
1356
+
1357
+ def __init__(self, stdscr: "curses.window"):
1358
+ self.stdscr = stdscr
1359
+
1360
+ curses.use_default_colors()
1361
+ curses.curs_set(0)
1362
+
1363
+ curses.init_pair(1, curses.COLOR_RED, -1)
1364
+ curses.init_pair(2, curses.COLOR_GREEN, -1)
1365
+
1366
+ self.last_update = 0.0
1367
+
1368
+ self.finished = False
1369
+
1370
+ self.total_processed = 0
1371
+ self.total_remaining = 0
1372
+
1373
+ super().__init__()
1374
+
1375
+ def update(self, table: str, num_done: int) -> None:
1376
+ super().update(table, num_done)
1377
+
1378
+ self.total_processed = 0
1379
+ self.total_remaining = 0
1380
+ for data in self.tables.values():
1381
+ self.total_processed += data["num_done"] - data["start"]
1382
+ self.total_remaining += data["total"] - data["num_done"]
1383
+
1384
+ self.render()
1385
+
1386
+ def render(self, force: bool = False) -> None:
1387
+ now = time.time()
1388
+
1389
+ if not force and now - self.last_update < 0.2:
1390
+ # reactor.callLater(1, self.render)
1391
+ return
1392
+
1393
+ self.stdscr.clear()
1394
+
1395
+ rows, cols = self.stdscr.getmaxyx()
1396
+
1397
+ duration = int(now) - int(self.start_time)
1398
+
1399
+ minutes, seconds = divmod(duration, 60)
1400
+ duration_str = "%02dm %02ds" % (minutes, seconds)
1401
+
1402
+ if self.finished:
1403
+ status = "Time spent: %s (Done!)" % (duration_str,)
1404
+ else:
1405
+ if self.total_processed > 0:
1406
+ left = float(self.total_remaining) / self.total_processed
1407
+
1408
+ est_remaining = (int(now) - self.start_time) * left
1409
+ est_remaining_str = "%02dm %02ds remaining" % divmod(est_remaining, 60)
1410
+ else:
1411
+ est_remaining_str = "Unknown"
1412
+ status = "Time spent: %s (est. remaining: %s)" % (
1413
+ duration_str,
1414
+ est_remaining_str,
1415
+ )
1416
+
1417
+ self.stdscr.addstr(0, 0, status, curses.A_BOLD)
1418
+
1419
+ max_len = max(len(t) for t in self.tables.keys())
1420
+
1421
+ left_margin = 5
1422
+ middle_space = 1
1423
+
1424
+ items = sorted(self.tables.items(), key=lambda i: (i[1]["perc"], i[0]))
1425
+
1426
+ for i, (table, data) in enumerate(items):
1427
+ if i + 2 >= rows:
1428
+ break
1429
+
1430
+ perc = data["perc"]
1431
+
1432
+ color = curses.color_pair(2) if perc == 100 else curses.color_pair(1)
1433
+
1434
+ self.stdscr.addstr(
1435
+ i + 2, left_margin + max_len - len(table), table, curses.A_BOLD | color
1436
+ )
1437
+
1438
+ size = 20
1439
+
1440
+ progress = "[%s%s]" % (
1441
+ "#" * int(perc * size / 100),
1442
+ " " * (size - int(perc * size / 100)),
1443
+ )
1444
+
1445
+ self.stdscr.addstr(
1446
+ i + 2,
1447
+ left_margin + max_len + middle_space,
1448
+ "%s %3d%% (%d/%d)" % (progress, perc, data["num_done"], data["total"]),
1449
+ )
1450
+
1451
+ if self.finished:
1452
+ self.stdscr.addstr(rows - 1, 0, "Press any key to exit...")
1453
+
1454
+ self.stdscr.refresh()
1455
+ self.last_update = time.time()
1456
+
1457
+ def done(self) -> None:
1458
+ self.finished = True
1459
+ self.render(True)
1460
+ self.stdscr.getch()
1461
+
1462
+ def set_state(self, state: str) -> None:
1463
+ self.stdscr.clear()
1464
+ self.stdscr.addstr(0, 0, state + "...", curses.A_BOLD)
1465
+ self.stdscr.refresh()
1466
+
1467
+
1468
+ class TerminalProgress(Progress):
1469
+ """Just prints progress to the terminal"""
1470
+
1471
+ def update(self, table: str, num_done: int) -> None:
1472
+ super().update(table, num_done)
1473
+
1474
+ data = self.tables[table]
1475
+
1476
+ print(
1477
+ "%s: %d%% (%d/%d)" % (table, data["perc"], data["num_done"], data["total"])
1478
+ )
1479
+
1480
+ def set_state(self, state: str) -> None:
1481
+ print(state + "...")
1482
+
1483
+
1484
+ ##############################################
1485
+ ##############################################
1486
+
1487
+
1488
+ def main() -> None:
1489
+ parser = argparse.ArgumentParser(
1490
+ description="A script to port an existing synapse SQLite database to"
1491
+ " a new PostgreSQL database."
1492
+ )
1493
+ parser.add_argument("-v", action="store_true")
1494
+ parser.add_argument(
1495
+ "--sqlite-database",
1496
+ required=True,
1497
+ help="The snapshot of the SQLite database file. This must not be"
1498
+ " currently used by a running synapse server",
1499
+ )
1500
+ parser.add_argument(
1501
+ "--postgres-config",
1502
+ type=argparse.FileType("r"),
1503
+ required=True,
1504
+ help="The database config file for the PostgreSQL database",
1505
+ )
1506
+ parser.add_argument(
1507
+ "--curses", action="store_true", help="display a curses based progress UI"
1508
+ )
1509
+
1510
+ parser.add_argument(
1511
+ "--batch-size",
1512
+ type=int,
1513
+ default=1000,
1514
+ help="The number of rows to select from the SQLite table each"
1515
+ " iteration [default=1000]",
1516
+ )
1517
+
1518
+ args = parser.parse_args()
1519
+
1520
+ logging.basicConfig(
1521
+ level=logging.DEBUG if args.v else logging.INFO,
1522
+ format="%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s",
1523
+ filename="port-synapse.log" if args.curses else None,
1524
+ )
1525
+
1526
+ if not os.path.isfile(args.sqlite_database):
1527
+ sys.stderr.write(
1528
+ "The sqlite database you specified does not exist, please check that you have the"
1529
+ "correct path."
1530
+ )
1531
+ sys.exit(1)
1532
+
1533
+ sqlite_config = {
1534
+ "name": "sqlite3",
1535
+ "args": {
1536
+ "database": args.sqlite_database,
1537
+ "cp_min": 1,
1538
+ "cp_max": 1,
1539
+ "check_same_thread": False,
1540
+ },
1541
+ }
1542
+
1543
+ hs_config = yaml.safe_load(args.postgres_config)
1544
+
1545
+ if "database" not in hs_config:
1546
+ sys.stderr.write("The configuration file must have a 'database' section.\n")
1547
+ sys.exit(4)
1548
+
1549
+ postgres_config = hs_config["database"]
1550
+
1551
+ if "name" not in postgres_config:
1552
+ sys.stderr.write("Malformed database config: no 'name'\n")
1553
+ sys.exit(2)
1554
+ if postgres_config["name"] != "psycopg2":
1555
+ sys.stderr.write("Database must use the 'psycopg2' connector.\n")
1556
+ sys.exit(3)
1557
+
1558
+ # Don't run the background tasks that get started by the data stores.
1559
+ hs_config["run_background_tasks_on"] = "some_other_process"
1560
+
1561
+ config = HomeServerConfig()
1562
+ config.parse_config_dict(hs_config, "", "")
1563
+
1564
+ hs = MockHomeserver(config)
1565
+
1566
+ def start(stdscr: Optional["curses.window"] = None) -> None:
1567
+ progress: Progress
1568
+ if stdscr:
1569
+ progress = CursesProgress(stdscr)
1570
+ else:
1571
+ progress = TerminalProgress()
1572
+
1573
+ porter = Porter(
1574
+ sqlite_config=sqlite_config,
1575
+ progress=progress,
1576
+ batch_size=args.batch_size,
1577
+ hs=hs,
1578
+ )
1579
+
1580
+ @defer.inlineCallbacks
1581
+ def run() -> Generator["defer.Deferred[Any]", Any, None]:
1582
+ yield defer.ensureDeferred(porter.run())
1583
+
1584
+ hs.get_clock().call_when_running(run)
1585
+
1586
+ reactor.run()
1587
+
1588
+ if args.curses:
1589
+ curses.wrapper(start)
1590
+ else:
1591
+ start()
1592
+
1593
+ if end_error:
1594
+ if end_error_exec_info:
1595
+ exc_type, exc_value, exc_traceback = end_error_exec_info
1596
+ traceback.print_exception(exc_type, exc_value, exc_traceback)
1597
+
1598
+ sys.stderr.write(end_error)
1599
+
1600
+ sys.exit(5)
1601
+
1602
+
1603
+ if __name__ == "__main__":
1604
+ main()