matrix-synapse 1.142.0rc3__cp314-abi3-musllinux_1_2_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (1057) hide show
  1. matrix_synapse-1.142.0rc3.dist-info/AUTHORS.rst +51 -0
  2. matrix_synapse-1.142.0rc3.dist-info/LICENSE-AGPL-3.0 +661 -0
  3. matrix_synapse-1.142.0rc3.dist-info/LICENSE-COMMERCIAL +6 -0
  4. matrix_synapse-1.142.0rc3.dist-info/METADATA +375 -0
  5. matrix_synapse-1.142.0rc3.dist-info/RECORD +1057 -0
  6. matrix_synapse-1.142.0rc3.dist-info/WHEEL +4 -0
  7. matrix_synapse-1.142.0rc3.dist-info/entry_points.txt +14 -0
  8. matrix_synapse.libs/libgcc_s-2d945d6c.so.1 +0 -0
  9. synapse/__init__.py +97 -0
  10. synapse/_scripts/__init__.py +0 -0
  11. synapse/_scripts/export_signing_key.py +109 -0
  12. synapse/_scripts/generate_config.py +83 -0
  13. synapse/_scripts/generate_log_config.py +56 -0
  14. synapse/_scripts/generate_signing_key.py +55 -0
  15. synapse/_scripts/generate_workers_map.py +318 -0
  16. synapse/_scripts/hash_password.py +95 -0
  17. synapse/_scripts/move_remote_media_to_new_store.py +128 -0
  18. synapse/_scripts/register_new_matrix_user.py +374 -0
  19. synapse/_scripts/review_recent_signups.py +212 -0
  20. synapse/_scripts/synapse_port_db.py +1603 -0
  21. synapse/_scripts/synctl.py +365 -0
  22. synapse/_scripts/update_synapse_database.py +130 -0
  23. synapse/api/__init__.py +20 -0
  24. synapse/api/auth/__init__.py +207 -0
  25. synapse/api/auth/base.py +406 -0
  26. synapse/api/auth/internal.py +299 -0
  27. synapse/api/auth/mas.py +457 -0
  28. synapse/api/auth/msc3861_delegated.py +617 -0
  29. synapse/api/auth_blocking.py +144 -0
  30. synapse/api/constants.py +362 -0
  31. synapse/api/errors.py +907 -0
  32. synapse/api/filtering.py +539 -0
  33. synapse/api/presence.py +104 -0
  34. synapse/api/ratelimiting.py +482 -0
  35. synapse/api/room_versions.py +535 -0
  36. synapse/api/urls.py +119 -0
  37. synapse/app/__init__.py +60 -0
  38. synapse/app/_base.py +866 -0
  39. synapse/app/admin_cmd.py +388 -0
  40. synapse/app/appservice.py +30 -0
  41. synapse/app/client_reader.py +30 -0
  42. synapse/app/complement_fork_starter.py +206 -0
  43. synapse/app/event_creator.py +29 -0
  44. synapse/app/federation_reader.py +30 -0
  45. synapse/app/federation_sender.py +30 -0
  46. synapse/app/frontend_proxy.py +30 -0
  47. synapse/app/generic_worker.py +475 -0
  48. synapse/app/homeserver.py +504 -0
  49. synapse/app/media_repository.py +30 -0
  50. synapse/app/phone_stats_home.py +296 -0
  51. synapse/app/pusher.py +30 -0
  52. synapse/app/synchrotron.py +30 -0
  53. synapse/app/user_dir.py +31 -0
  54. synapse/appservice/__init__.py +461 -0
  55. synapse/appservice/api.py +569 -0
  56. synapse/appservice/scheduler.py +567 -0
  57. synapse/config/__init__.py +27 -0
  58. synapse/config/__main__.py +62 -0
  59. synapse/config/_base.py +1108 -0
  60. synapse/config/_base.pyi +217 -0
  61. synapse/config/_util.py +99 -0
  62. synapse/config/account_validity.py +116 -0
  63. synapse/config/api.py +141 -0
  64. synapse/config/appservice.py +210 -0
  65. synapse/config/auth.py +80 -0
  66. synapse/config/auto_accept_invites.py +43 -0
  67. synapse/config/background_updates.py +44 -0
  68. synapse/config/cache.py +231 -0
  69. synapse/config/captcha.py +90 -0
  70. synapse/config/cas.py +116 -0
  71. synapse/config/consent.py +73 -0
  72. synapse/config/database.py +184 -0
  73. synapse/config/emailconfig.py +367 -0
  74. synapse/config/experimental.py +595 -0
  75. synapse/config/federation.py +114 -0
  76. synapse/config/homeserver.py +141 -0
  77. synapse/config/jwt.py +55 -0
  78. synapse/config/key.py +447 -0
  79. synapse/config/logger.py +390 -0
  80. synapse/config/mas.py +191 -0
  81. synapse/config/matrixrtc.py +66 -0
  82. synapse/config/metrics.py +84 -0
  83. synapse/config/modules.py +40 -0
  84. synapse/config/oembed.py +185 -0
  85. synapse/config/oidc.py +509 -0
  86. synapse/config/password_auth_providers.py +82 -0
  87. synapse/config/push.py +64 -0
  88. synapse/config/ratelimiting.py +254 -0
  89. synapse/config/redis.py +74 -0
  90. synapse/config/registration.py +296 -0
  91. synapse/config/repository.py +311 -0
  92. synapse/config/retention.py +162 -0
  93. synapse/config/room.py +88 -0
  94. synapse/config/room_directory.py +165 -0
  95. synapse/config/saml2.py +251 -0
  96. synapse/config/server.py +1170 -0
  97. synapse/config/server_notices.py +84 -0
  98. synapse/config/spam_checker.py +66 -0
  99. synapse/config/sso.py +121 -0
  100. synapse/config/stats.py +54 -0
  101. synapse/config/third_party_event_rules.py +40 -0
  102. synapse/config/tls.py +192 -0
  103. synapse/config/tracer.py +71 -0
  104. synapse/config/user_directory.py +47 -0
  105. synapse/config/user_types.py +44 -0
  106. synapse/config/voip.py +59 -0
  107. synapse/config/workers.py +642 -0
  108. synapse/crypto/__init__.py +20 -0
  109. synapse/crypto/context_factory.py +278 -0
  110. synapse/crypto/event_signing.py +194 -0
  111. synapse/crypto/keyring.py +931 -0
  112. synapse/event_auth.py +1266 -0
  113. synapse/events/__init__.py +668 -0
  114. synapse/events/auto_accept_invites.py +216 -0
  115. synapse/events/builder.py +387 -0
  116. synapse/events/presence_router.py +245 -0
  117. synapse/events/snapshot.py +559 -0
  118. synapse/events/utils.py +928 -0
  119. synapse/events/validator.py +305 -0
  120. synapse/federation/__init__.py +22 -0
  121. synapse/federation/federation_base.py +383 -0
  122. synapse/federation/federation_client.py +2134 -0
  123. synapse/federation/federation_server.py +1544 -0
  124. synapse/federation/persistence.py +71 -0
  125. synapse/federation/send_queue.py +532 -0
  126. synapse/federation/sender/__init__.py +1165 -0
  127. synapse/federation/sender/per_destination_queue.py +884 -0
  128. synapse/federation/sender/transaction_manager.py +210 -0
  129. synapse/federation/transport/__init__.py +28 -0
  130. synapse/federation/transport/client.py +1201 -0
  131. synapse/federation/transport/server/__init__.py +334 -0
  132. synapse/federation/transport/server/_base.py +429 -0
  133. synapse/federation/transport/server/federation.py +912 -0
  134. synapse/federation/units.py +133 -0
  135. synapse/handlers/__init__.py +20 -0
  136. synapse/handlers/account.py +162 -0
  137. synapse/handlers/account_data.py +362 -0
  138. synapse/handlers/account_validity.py +361 -0
  139. synapse/handlers/admin.py +618 -0
  140. synapse/handlers/appservice.py +991 -0
  141. synapse/handlers/auth.py +2494 -0
  142. synapse/handlers/cas.py +413 -0
  143. synapse/handlers/deactivate_account.py +363 -0
  144. synapse/handlers/delayed_events.py +635 -0
  145. synapse/handlers/device.py +1873 -0
  146. synapse/handlers/devicemessage.py +399 -0
  147. synapse/handlers/directory.py +554 -0
  148. synapse/handlers/e2e_keys.py +1834 -0
  149. synapse/handlers/e2e_room_keys.py +455 -0
  150. synapse/handlers/event_auth.py +390 -0
  151. synapse/handlers/events.py +201 -0
  152. synapse/handlers/federation.py +2043 -0
  153. synapse/handlers/federation_event.py +2420 -0
  154. synapse/handlers/identity.py +812 -0
  155. synapse/handlers/initial_sync.py +528 -0
  156. synapse/handlers/jwt.py +120 -0
  157. synapse/handlers/message.py +2347 -0
  158. synapse/handlers/oidc.py +1803 -0
  159. synapse/handlers/pagination.py +768 -0
  160. synapse/handlers/password_policy.py +102 -0
  161. synapse/handlers/presence.py +2638 -0
  162. synapse/handlers/profile.py +655 -0
  163. synapse/handlers/push_rules.py +164 -0
  164. synapse/handlers/read_marker.py +79 -0
  165. synapse/handlers/receipts.py +351 -0
  166. synapse/handlers/register.py +1060 -0
  167. synapse/handlers/relations.py +624 -0
  168. synapse/handlers/reports.py +98 -0
  169. synapse/handlers/room.py +2447 -0
  170. synapse/handlers/room_list.py +632 -0
  171. synapse/handlers/room_member.py +2365 -0
  172. synapse/handlers/room_member_worker.py +146 -0
  173. synapse/handlers/room_policy.py +186 -0
  174. synapse/handlers/room_summary.py +1057 -0
  175. synapse/handlers/saml.py +524 -0
  176. synapse/handlers/search.py +723 -0
  177. synapse/handlers/send_email.py +209 -0
  178. synapse/handlers/set_password.py +71 -0
  179. synapse/handlers/sliding_sync/__init__.py +1701 -0
  180. synapse/handlers/sliding_sync/extensions.py +970 -0
  181. synapse/handlers/sliding_sync/room_lists.py +2266 -0
  182. synapse/handlers/sliding_sync/store.py +128 -0
  183. synapse/handlers/sso.py +1292 -0
  184. synapse/handlers/state_deltas.py +82 -0
  185. synapse/handlers/stats.py +322 -0
  186. synapse/handlers/sync.py +3109 -0
  187. synapse/handlers/thread_subscriptions.py +190 -0
  188. synapse/handlers/typing.py +606 -0
  189. synapse/handlers/ui_auth/__init__.py +48 -0
  190. synapse/handlers/ui_auth/checkers.py +332 -0
  191. synapse/handlers/user_directory.py +783 -0
  192. synapse/handlers/worker_lock.py +365 -0
  193. synapse/http/__init__.py +106 -0
  194. synapse/http/additional_resource.py +62 -0
  195. synapse/http/client.py +1360 -0
  196. synapse/http/connectproxyclient.py +309 -0
  197. synapse/http/federation/__init__.py +19 -0
  198. synapse/http/federation/matrix_federation_agent.py +490 -0
  199. synapse/http/federation/srv_resolver.py +196 -0
  200. synapse/http/federation/well_known_resolver.py +367 -0
  201. synapse/http/matrixfederationclient.py +1875 -0
  202. synapse/http/proxy.py +290 -0
  203. synapse/http/proxyagent.py +497 -0
  204. synapse/http/replicationagent.py +203 -0
  205. synapse/http/request_metrics.py +309 -0
  206. synapse/http/server.py +1114 -0
  207. synapse/http/servlet.py +1019 -0
  208. synapse/http/site.py +825 -0
  209. synapse/http/types.py +27 -0
  210. synapse/logging/__init__.py +31 -0
  211. synapse/logging/_remote.py +261 -0
  212. synapse/logging/_terse_json.py +95 -0
  213. synapse/logging/context.py +1211 -0
  214. synapse/logging/formatter.py +63 -0
  215. synapse/logging/handlers.py +99 -0
  216. synapse/logging/loggers.py +25 -0
  217. synapse/logging/opentracing.py +1132 -0
  218. synapse/logging/scopecontextmanager.py +161 -0
  219. synapse/media/_base.py +827 -0
  220. synapse/media/filepath.py +417 -0
  221. synapse/media/media_repository.py +1580 -0
  222. synapse/media/media_storage.py +704 -0
  223. synapse/media/oembed.py +277 -0
  224. synapse/media/preview_html.py +559 -0
  225. synapse/media/storage_provider.py +195 -0
  226. synapse/media/thumbnailer.py +833 -0
  227. synapse/media/url_previewer.py +875 -0
  228. synapse/metrics/__init__.py +754 -0
  229. synapse/metrics/_gc.py +219 -0
  230. synapse/metrics/_reactor_metrics.py +171 -0
  231. synapse/metrics/_types.py +38 -0
  232. synapse/metrics/background_process_metrics.py +556 -0
  233. synapse/metrics/common_usage_metrics.py +94 -0
  234. synapse/metrics/jemalloc.py +248 -0
  235. synapse/module_api/__init__.py +2154 -0
  236. synapse/module_api/callbacks/__init__.py +50 -0
  237. synapse/module_api/callbacks/account_validity_callbacks.py +106 -0
  238. synapse/module_api/callbacks/media_repository_callbacks.py +160 -0
  239. synapse/module_api/callbacks/ratelimit_callbacks.py +79 -0
  240. synapse/module_api/callbacks/spamchecker_callbacks.py +1113 -0
  241. synapse/module_api/callbacks/third_party_event_rules_callbacks.py +599 -0
  242. synapse/module_api/errors.py +42 -0
  243. synapse/notifier.py +972 -0
  244. synapse/push/__init__.py +212 -0
  245. synapse/push/bulk_push_rule_evaluator.py +637 -0
  246. synapse/push/clientformat.py +126 -0
  247. synapse/push/emailpusher.py +333 -0
  248. synapse/push/httppusher.py +564 -0
  249. synapse/push/mailer.py +1012 -0
  250. synapse/push/presentable_names.py +216 -0
  251. synapse/push/push_tools.py +114 -0
  252. synapse/push/push_types.py +141 -0
  253. synapse/push/pusher.py +87 -0
  254. synapse/push/pusherpool.py +501 -0
  255. synapse/push/rulekinds.py +33 -0
  256. synapse/py.typed +0 -0
  257. synapse/replication/__init__.py +20 -0
  258. synapse/replication/http/__init__.py +68 -0
  259. synapse/replication/http/_base.py +468 -0
  260. synapse/replication/http/account_data.py +297 -0
  261. synapse/replication/http/deactivate_account.py +81 -0
  262. synapse/replication/http/delayed_events.py +62 -0
  263. synapse/replication/http/devices.py +254 -0
  264. synapse/replication/http/federation.py +334 -0
  265. synapse/replication/http/login.py +106 -0
  266. synapse/replication/http/membership.py +364 -0
  267. synapse/replication/http/presence.py +133 -0
  268. synapse/replication/http/push.py +156 -0
  269. synapse/replication/http/register.py +172 -0
  270. synapse/replication/http/send_events.py +182 -0
  271. synapse/replication/http/state.py +82 -0
  272. synapse/replication/http/streams.py +101 -0
  273. synapse/replication/tcp/__init__.py +56 -0
  274. synapse/replication/tcp/client.py +552 -0
  275. synapse/replication/tcp/commands.py +569 -0
  276. synapse/replication/tcp/context.py +41 -0
  277. synapse/replication/tcp/external_cache.py +156 -0
  278. synapse/replication/tcp/handler.py +942 -0
  279. synapse/replication/tcp/protocol.py +608 -0
  280. synapse/replication/tcp/redis.py +509 -0
  281. synapse/replication/tcp/resource.py +348 -0
  282. synapse/replication/tcp/streams/__init__.py +96 -0
  283. synapse/replication/tcp/streams/_base.py +766 -0
  284. synapse/replication/tcp/streams/events.py +287 -0
  285. synapse/replication/tcp/streams/federation.py +92 -0
  286. synapse/replication/tcp/streams/partial_state.py +80 -0
  287. synapse/res/providers.json +29 -0
  288. synapse/res/templates/_base.html +29 -0
  289. synapse/res/templates/account_previously_renewed.html +6 -0
  290. synapse/res/templates/account_renewed.html +6 -0
  291. synapse/res/templates/add_threepid.html +8 -0
  292. synapse/res/templates/add_threepid.txt +6 -0
  293. synapse/res/templates/add_threepid_failure.html +7 -0
  294. synapse/res/templates/add_threepid_success.html +6 -0
  295. synapse/res/templates/already_in_use.html +12 -0
  296. synapse/res/templates/already_in_use.txt +10 -0
  297. synapse/res/templates/auth_success.html +21 -0
  298. synapse/res/templates/invalid_token.html +6 -0
  299. synapse/res/templates/mail-Element.css +7 -0
  300. synapse/res/templates/mail-Vector.css +7 -0
  301. synapse/res/templates/mail-expiry.css +4 -0
  302. synapse/res/templates/mail.css +156 -0
  303. synapse/res/templates/notice_expiry.html +46 -0
  304. synapse/res/templates/notice_expiry.txt +7 -0
  305. synapse/res/templates/notif.html +51 -0
  306. synapse/res/templates/notif.txt +22 -0
  307. synapse/res/templates/notif_mail.html +59 -0
  308. synapse/res/templates/notif_mail.txt +10 -0
  309. synapse/res/templates/password_reset.html +10 -0
  310. synapse/res/templates/password_reset.txt +7 -0
  311. synapse/res/templates/password_reset_confirmation.html +15 -0
  312. synapse/res/templates/password_reset_failure.html +7 -0
  313. synapse/res/templates/password_reset_success.html +6 -0
  314. synapse/res/templates/recaptcha.html +42 -0
  315. synapse/res/templates/registration.html +12 -0
  316. synapse/res/templates/registration.txt +10 -0
  317. synapse/res/templates/registration_failure.html +6 -0
  318. synapse/res/templates/registration_success.html +6 -0
  319. synapse/res/templates/registration_token.html +18 -0
  320. synapse/res/templates/room.html +33 -0
  321. synapse/res/templates/room.txt +9 -0
  322. synapse/res/templates/sso.css +129 -0
  323. synapse/res/templates/sso_account_deactivated.html +25 -0
  324. synapse/res/templates/sso_auth_account_details.html +186 -0
  325. synapse/res/templates/sso_auth_account_details.js +116 -0
  326. synapse/res/templates/sso_auth_bad_user.html +26 -0
  327. synapse/res/templates/sso_auth_confirm.html +27 -0
  328. synapse/res/templates/sso_auth_success.html +26 -0
  329. synapse/res/templates/sso_error.html +71 -0
  330. synapse/res/templates/sso_footer.html +19 -0
  331. synapse/res/templates/sso_login_idp_picker.html +60 -0
  332. synapse/res/templates/sso_new_user_consent.html +30 -0
  333. synapse/res/templates/sso_partial_profile.html +19 -0
  334. synapse/res/templates/sso_redirect_confirm.html +39 -0
  335. synapse/res/templates/style.css +33 -0
  336. synapse/res/templates/terms.html +27 -0
  337. synapse/rest/__init__.py +197 -0
  338. synapse/rest/admin/__init__.py +390 -0
  339. synapse/rest/admin/_base.py +72 -0
  340. synapse/rest/admin/background_updates.py +171 -0
  341. synapse/rest/admin/devices.py +221 -0
  342. synapse/rest/admin/event_reports.py +173 -0
  343. synapse/rest/admin/events.py +69 -0
  344. synapse/rest/admin/experimental_features.py +137 -0
  345. synapse/rest/admin/federation.py +243 -0
  346. synapse/rest/admin/media.py +540 -0
  347. synapse/rest/admin/registration_tokens.py +358 -0
  348. synapse/rest/admin/rooms.py +1061 -0
  349. synapse/rest/admin/scheduled_tasks.py +70 -0
  350. synapse/rest/admin/server_notice_servlet.py +132 -0
  351. synapse/rest/admin/statistics.py +132 -0
  352. synapse/rest/admin/username_available.py +58 -0
  353. synapse/rest/admin/users.py +1608 -0
  354. synapse/rest/client/__init__.py +20 -0
  355. synapse/rest/client/_base.py +113 -0
  356. synapse/rest/client/account.py +930 -0
  357. synapse/rest/client/account_data.py +319 -0
  358. synapse/rest/client/account_validity.py +103 -0
  359. synapse/rest/client/appservice_ping.py +125 -0
  360. synapse/rest/client/auth.py +218 -0
  361. synapse/rest/client/auth_metadata.py +122 -0
  362. synapse/rest/client/capabilities.py +121 -0
  363. synapse/rest/client/delayed_events.py +111 -0
  364. synapse/rest/client/devices.py +587 -0
  365. synapse/rest/client/directory.py +211 -0
  366. synapse/rest/client/events.py +116 -0
  367. synapse/rest/client/filter.py +112 -0
  368. synapse/rest/client/initial_sync.py +65 -0
  369. synapse/rest/client/keys.py +678 -0
  370. synapse/rest/client/knock.py +104 -0
  371. synapse/rest/client/login.py +754 -0
  372. synapse/rest/client/login_token_request.py +127 -0
  373. synapse/rest/client/logout.py +93 -0
  374. synapse/rest/client/matrixrtc.py +52 -0
  375. synapse/rest/client/media.py +286 -0
  376. synapse/rest/client/mutual_rooms.py +93 -0
  377. synapse/rest/client/notifications.py +137 -0
  378. synapse/rest/client/openid.py +109 -0
  379. synapse/rest/client/password_policy.py +69 -0
  380. synapse/rest/client/presence.py +131 -0
  381. synapse/rest/client/profile.py +291 -0
  382. synapse/rest/client/push_rule.py +331 -0
  383. synapse/rest/client/pusher.py +181 -0
  384. synapse/rest/client/read_marker.py +104 -0
  385. synapse/rest/client/receipts.py +165 -0
  386. synapse/rest/client/register.py +1067 -0
  387. synapse/rest/client/relations.py +138 -0
  388. synapse/rest/client/rendezvous.py +76 -0
  389. synapse/rest/client/reporting.py +207 -0
  390. synapse/rest/client/room.py +1669 -0
  391. synapse/rest/client/room_keys.py +426 -0
  392. synapse/rest/client/room_upgrade_rest_servlet.py +112 -0
  393. synapse/rest/client/sendtodevice.py +85 -0
  394. synapse/rest/client/sync.py +1131 -0
  395. synapse/rest/client/tags.py +129 -0
  396. synapse/rest/client/thirdparty.py +130 -0
  397. synapse/rest/client/thread_subscriptions.py +247 -0
  398. synapse/rest/client/tokenrefresh.py +52 -0
  399. synapse/rest/client/transactions.py +149 -0
  400. synapse/rest/client/user_directory.py +90 -0
  401. synapse/rest/client/versions.py +191 -0
  402. synapse/rest/client/voip.py +88 -0
  403. synapse/rest/consent/__init__.py +0 -0
  404. synapse/rest/consent/consent_resource.py +210 -0
  405. synapse/rest/health.py +38 -0
  406. synapse/rest/key/__init__.py +20 -0
  407. synapse/rest/key/v2/__init__.py +40 -0
  408. synapse/rest/key/v2/local_key_resource.py +125 -0
  409. synapse/rest/key/v2/remote_key_resource.py +302 -0
  410. synapse/rest/media/__init__.py +0 -0
  411. synapse/rest/media/config_resource.py +53 -0
  412. synapse/rest/media/create_resource.py +90 -0
  413. synapse/rest/media/download_resource.py +110 -0
  414. synapse/rest/media/media_repository_resource.py +113 -0
  415. synapse/rest/media/preview_url_resource.py +77 -0
  416. synapse/rest/media/thumbnail_resource.py +142 -0
  417. synapse/rest/media/upload_resource.py +187 -0
  418. synapse/rest/media/v1/__init__.py +39 -0
  419. synapse/rest/media/v1/_base.py +23 -0
  420. synapse/rest/media/v1/media_storage.py +23 -0
  421. synapse/rest/media/v1/storage_provider.py +23 -0
  422. synapse/rest/synapse/__init__.py +20 -0
  423. synapse/rest/synapse/client/__init__.py +93 -0
  424. synapse/rest/synapse/client/federation_whitelist.py +66 -0
  425. synapse/rest/synapse/client/jwks.py +77 -0
  426. synapse/rest/synapse/client/new_user_consent.py +115 -0
  427. synapse/rest/synapse/client/oidc/__init__.py +45 -0
  428. synapse/rest/synapse/client/oidc/backchannel_logout_resource.py +42 -0
  429. synapse/rest/synapse/client/oidc/callback_resource.py +48 -0
  430. synapse/rest/synapse/client/password_reset.py +129 -0
  431. synapse/rest/synapse/client/pick_idp.py +107 -0
  432. synapse/rest/synapse/client/pick_username.py +153 -0
  433. synapse/rest/synapse/client/rendezvous.py +58 -0
  434. synapse/rest/synapse/client/saml2/__init__.py +42 -0
  435. synapse/rest/synapse/client/saml2/metadata_resource.py +46 -0
  436. synapse/rest/synapse/client/saml2/response_resource.py +52 -0
  437. synapse/rest/synapse/client/sso_register.py +56 -0
  438. synapse/rest/synapse/client/unsubscribe.py +88 -0
  439. synapse/rest/synapse/mas/__init__.py +71 -0
  440. synapse/rest/synapse/mas/_base.py +55 -0
  441. synapse/rest/synapse/mas/devices.py +239 -0
  442. synapse/rest/synapse/mas/users.py +469 -0
  443. synapse/rest/well_known.py +148 -0
  444. synapse/server.py +1258 -0
  445. synapse/server_notices/__init__.py +0 -0
  446. synapse/server_notices/consent_server_notices.py +136 -0
  447. synapse/server_notices/resource_limits_server_notices.py +215 -0
  448. synapse/server_notices/server_notices_manager.py +388 -0
  449. synapse/server_notices/server_notices_sender.py +67 -0
  450. synapse/server_notices/worker_server_notices_sender.py +46 -0
  451. synapse/spam_checker_api/__init__.py +31 -0
  452. synapse/state/__init__.py +1022 -0
  453. synapse/state/v1.py +370 -0
  454. synapse/state/v2.py +985 -0
  455. synapse/static/client/login/index.html +47 -0
  456. synapse/static/client/login/js/jquery-3.4.1.min.js +2 -0
  457. synapse/static/client/login/js/login.js +291 -0
  458. synapse/static/client/login/spinner.gif +0 -0
  459. synapse/static/client/login/style.css +79 -0
  460. synapse/static/index.html +63 -0
  461. synapse/storage/__init__.py +43 -0
  462. synapse/storage/_base.py +245 -0
  463. synapse/storage/admin_client_config.py +26 -0
  464. synapse/storage/background_updates.py +1189 -0
  465. synapse/storage/controllers/__init__.py +57 -0
  466. synapse/storage/controllers/persist_events.py +1239 -0
  467. synapse/storage/controllers/purge_events.py +456 -0
  468. synapse/storage/controllers/state.py +954 -0
  469. synapse/storage/controllers/stats.py +119 -0
  470. synapse/storage/database.py +2720 -0
  471. synapse/storage/databases/__init__.py +175 -0
  472. synapse/storage/databases/main/__init__.py +424 -0
  473. synapse/storage/databases/main/account_data.py +1060 -0
  474. synapse/storage/databases/main/appservice.py +473 -0
  475. synapse/storage/databases/main/cache.py +911 -0
  476. synapse/storage/databases/main/censor_events.py +225 -0
  477. synapse/storage/databases/main/client_ips.py +817 -0
  478. synapse/storage/databases/main/delayed_events.py +560 -0
  479. synapse/storage/databases/main/deviceinbox.py +1272 -0
  480. synapse/storage/databases/main/devices.py +2581 -0
  481. synapse/storage/databases/main/directory.py +212 -0
  482. synapse/storage/databases/main/e2e_room_keys.py +690 -0
  483. synapse/storage/databases/main/end_to_end_keys.py +1896 -0
  484. synapse/storage/databases/main/event_federation.py +2509 -0
  485. synapse/storage/databases/main/event_push_actions.py +1937 -0
  486. synapse/storage/databases/main/events.py +3746 -0
  487. synapse/storage/databases/main/events_bg_updates.py +2910 -0
  488. synapse/storage/databases/main/events_forward_extremities.py +126 -0
  489. synapse/storage/databases/main/events_worker.py +2784 -0
  490. synapse/storage/databases/main/experimental_features.py +130 -0
  491. synapse/storage/databases/main/filtering.py +231 -0
  492. synapse/storage/databases/main/keys.py +291 -0
  493. synapse/storage/databases/main/lock.py +553 -0
  494. synapse/storage/databases/main/media_repository.py +1070 -0
  495. synapse/storage/databases/main/metrics.py +460 -0
  496. synapse/storage/databases/main/monthly_active_users.py +443 -0
  497. synapse/storage/databases/main/openid.py +61 -0
  498. synapse/storage/databases/main/presence.py +511 -0
  499. synapse/storage/databases/main/profile.py +541 -0
  500. synapse/storage/databases/main/purge_events.py +511 -0
  501. synapse/storage/databases/main/push_rule.py +972 -0
  502. synapse/storage/databases/main/pusher.py +794 -0
  503. synapse/storage/databases/main/receipts.py +1342 -0
  504. synapse/storage/databases/main/registration.py +3076 -0
  505. synapse/storage/databases/main/rejections.py +38 -0
  506. synapse/storage/databases/main/relations.py +1118 -0
  507. synapse/storage/databases/main/room.py +2781 -0
  508. synapse/storage/databases/main/roommember.py +2112 -0
  509. synapse/storage/databases/main/search.py +941 -0
  510. synapse/storage/databases/main/session.py +151 -0
  511. synapse/storage/databases/main/signatures.py +94 -0
  512. synapse/storage/databases/main/sliding_sync.py +603 -0
  513. synapse/storage/databases/main/state.py +1006 -0
  514. synapse/storage/databases/main/state_deltas.py +329 -0
  515. synapse/storage/databases/main/stats.py +791 -0
  516. synapse/storage/databases/main/stream.py +2580 -0
  517. synapse/storage/databases/main/tags.py +360 -0
  518. synapse/storage/databases/main/task_scheduler.py +225 -0
  519. synapse/storage/databases/main/thread_subscriptions.py +591 -0
  520. synapse/storage/databases/main/transactions.py +681 -0
  521. synapse/storage/databases/main/ui_auth.py +420 -0
  522. synapse/storage/databases/main/user_directory.py +1331 -0
  523. synapse/storage/databases/main/user_erasure_store.py +117 -0
  524. synapse/storage/databases/state/__init__.py +22 -0
  525. synapse/storage/databases/state/bg_updates.py +499 -0
  526. synapse/storage/databases/state/deletion.py +558 -0
  527. synapse/storage/databases/state/store.py +949 -0
  528. synapse/storage/engines/__init__.py +70 -0
  529. synapse/storage/engines/_base.py +154 -0
  530. synapse/storage/engines/postgres.py +261 -0
  531. synapse/storage/engines/sqlite.py +199 -0
  532. synapse/storage/invite_rule.py +112 -0
  533. synapse/storage/keys.py +40 -0
  534. synapse/storage/prepare_database.py +731 -0
  535. synapse/storage/push_rule.py +28 -0
  536. synapse/storage/roommember.py +89 -0
  537. synapse/storage/schema/README.md +4 -0
  538. synapse/storage/schema/__init__.py +182 -0
  539. synapse/storage/schema/common/delta/25/00background_updates.sql +40 -0
  540. synapse/storage/schema/common/delta/35/00background_updates_add_col.sql +36 -0
  541. synapse/storage/schema/common/delta/58/00background_update_ordering.sql +38 -0
  542. synapse/storage/schema/common/full_schemas/72/full.sql.postgres +8 -0
  543. synapse/storage/schema/common/full_schemas/72/full.sql.sqlite +6 -0
  544. synapse/storage/schema/common/schema_version.sql +60 -0
  545. synapse/storage/schema/main/delta/12/v12.sql +82 -0
  546. synapse/storage/schema/main/delta/13/v13.sql +38 -0
  547. synapse/storage/schema/main/delta/14/v14.sql +42 -0
  548. synapse/storage/schema/main/delta/15/appservice_txns.sql +50 -0
  549. synapse/storage/schema/main/delta/15/presence_indices.sql +2 -0
  550. synapse/storage/schema/main/delta/15/v15.sql +24 -0
  551. synapse/storage/schema/main/delta/16/events_order_index.sql +4 -0
  552. synapse/storage/schema/main/delta/16/remote_media_cache_index.sql +2 -0
  553. synapse/storage/schema/main/delta/16/remove_duplicates.sql +9 -0
  554. synapse/storage/schema/main/delta/16/room_alias_index.sql +3 -0
  555. synapse/storage/schema/main/delta/16/unique_constraints.sql +72 -0
  556. synapse/storage/schema/main/delta/16/users.sql +56 -0
  557. synapse/storage/schema/main/delta/17/drop_indexes.sql +37 -0
  558. synapse/storage/schema/main/delta/17/server_keys.sql +43 -0
  559. synapse/storage/schema/main/delta/17/user_threepids.sql +9 -0
  560. synapse/storage/schema/main/delta/18/server_keys_bigger_ints.sql +51 -0
  561. synapse/storage/schema/main/delta/19/event_index.sql +38 -0
  562. synapse/storage/schema/main/delta/20/dummy.sql +1 -0
  563. synapse/storage/schema/main/delta/20/pushers.py +93 -0
  564. synapse/storage/schema/main/delta/21/end_to_end_keys.sql +53 -0
  565. synapse/storage/schema/main/delta/21/receipts.sql +57 -0
  566. synapse/storage/schema/main/delta/22/receipts_index.sql +41 -0
  567. synapse/storage/schema/main/delta/22/user_threepids_unique.sql +19 -0
  568. synapse/storage/schema/main/delta/24/stats_reporting.sql +37 -0
  569. synapse/storage/schema/main/delta/25/fts.py +81 -0
  570. synapse/storage/schema/main/delta/25/guest_access.sql +44 -0
  571. synapse/storage/schema/main/delta/25/history_visibility.sql +44 -0
  572. synapse/storage/schema/main/delta/25/tags.sql +57 -0
  573. synapse/storage/schema/main/delta/26/account_data.sql +36 -0
  574. synapse/storage/schema/main/delta/27/account_data.sql +55 -0
  575. synapse/storage/schema/main/delta/27/forgotten_memberships.sql +45 -0
  576. synapse/storage/schema/main/delta/27/ts.py +61 -0
  577. synapse/storage/schema/main/delta/28/event_push_actions.sql +46 -0
  578. synapse/storage/schema/main/delta/28/events_room_stream.sql +39 -0
  579. synapse/storage/schema/main/delta/28/public_roms_index.sql +39 -0
  580. synapse/storage/schema/main/delta/28/receipts_user_id_index.sql +41 -0
  581. synapse/storage/schema/main/delta/28/upgrade_times.sql +40 -0
  582. synapse/storage/schema/main/delta/28/users_is_guest.sql +41 -0
  583. synapse/storage/schema/main/delta/29/push_actions.sql +54 -0
  584. synapse/storage/schema/main/delta/30/alias_creator.sql +35 -0
  585. synapse/storage/schema/main/delta/30/as_users.py +82 -0
  586. synapse/storage/schema/main/delta/30/deleted_pushers.sql +44 -0
  587. synapse/storage/schema/main/delta/30/presence_stream.sql +49 -0
  588. synapse/storage/schema/main/delta/30/public_rooms.sql +42 -0
  589. synapse/storage/schema/main/delta/30/push_rule_stream.sql +57 -0
  590. synapse/storage/schema/main/delta/30/threepid_guest_access_tokens.sql +43 -0
  591. synapse/storage/schema/main/delta/31/invites.sql +61 -0
  592. synapse/storage/schema/main/delta/31/local_media_repository_url_cache.sql +46 -0
  593. synapse/storage/schema/main/delta/31/pushers_0.py +92 -0
  594. synapse/storage/schema/main/delta/31/pushers_index.sql +41 -0
  595. synapse/storage/schema/main/delta/31/search_update.py +65 -0
  596. synapse/storage/schema/main/delta/32/events.sql +35 -0
  597. synapse/storage/schema/main/delta/32/openid.sql +9 -0
  598. synapse/storage/schema/main/delta/32/pusher_throttle.sql +42 -0
  599. synapse/storage/schema/main/delta/32/remove_indices.sql +52 -0
  600. synapse/storage/schema/main/delta/32/reports.sql +44 -0
  601. synapse/storage/schema/main/delta/33/access_tokens_device_index.sql +36 -0
  602. synapse/storage/schema/main/delta/33/devices.sql +40 -0
  603. synapse/storage/schema/main/delta/33/devices_for_e2e_keys.sql +38 -0
  604. synapse/storage/schema/main/delta/33/devices_for_e2e_keys_clear_unknown_device.sql +39 -0
  605. synapse/storage/schema/main/delta/33/event_fields.py +61 -0
  606. synapse/storage/schema/main/delta/33/remote_media_ts.py +43 -0
  607. synapse/storage/schema/main/delta/33/user_ips_index.sql +36 -0
  608. synapse/storage/schema/main/delta/34/appservice_stream.sql +42 -0
  609. synapse/storage/schema/main/delta/34/cache_stream.py +50 -0
  610. synapse/storage/schema/main/delta/34/device_inbox.sql +43 -0
  611. synapse/storage/schema/main/delta/34/push_display_name_rename.sql +39 -0
  612. synapse/storage/schema/main/delta/34/received_txn_purge.py +36 -0
  613. synapse/storage/schema/main/delta/35/contains_url.sql +36 -0
  614. synapse/storage/schema/main/delta/35/device_outbox.sql +58 -0
  615. synapse/storage/schema/main/delta/35/device_stream_id.sql +40 -0
  616. synapse/storage/schema/main/delta/35/event_push_actions_index.sql +36 -0
  617. synapse/storage/schema/main/delta/35/public_room_list_change_stream.sql +52 -0
  618. synapse/storage/schema/main/delta/35/stream_order_to_extrem.sql +56 -0
  619. synapse/storage/schema/main/delta/36/readd_public_rooms.sql +45 -0
  620. synapse/storage/schema/main/delta/37/remove_auth_idx.py +89 -0
  621. synapse/storage/schema/main/delta/37/user_threepids.sql +71 -0
  622. synapse/storage/schema/main/delta/38/postgres_fts_gist.sql +38 -0
  623. synapse/storage/schema/main/delta/39/appservice_room_list.sql +48 -0
  624. synapse/storage/schema/main/delta/39/device_federation_stream_idx.sql +35 -0
  625. synapse/storage/schema/main/delta/39/event_push_index.sql +36 -0
  626. synapse/storage/schema/main/delta/39/federation_out_position.sql +41 -0
  627. synapse/storage/schema/main/delta/39/membership_profile.sql +39 -0
  628. synapse/storage/schema/main/delta/40/current_state_idx.sql +36 -0
  629. synapse/storage/schema/main/delta/40/device_inbox.sql +40 -0
  630. synapse/storage/schema/main/delta/40/device_list_streams.sql +79 -0
  631. synapse/storage/schema/main/delta/40/event_push_summary.sql +57 -0
  632. synapse/storage/schema/main/delta/40/pushers.sql +58 -0
  633. synapse/storage/schema/main/delta/41/device_list_stream_idx.sql +36 -0
  634. synapse/storage/schema/main/delta/41/device_outbound_index.sql +35 -0
  635. synapse/storage/schema/main/delta/41/event_search_event_id_idx.sql +36 -0
  636. synapse/storage/schema/main/delta/41/ratelimit.sql +41 -0
  637. synapse/storage/schema/main/delta/42/current_state_delta.sql +48 -0
  638. synapse/storage/schema/main/delta/42/device_list_last_id.sql +52 -0
  639. synapse/storage/schema/main/delta/42/event_auth_state_only.sql +36 -0
  640. synapse/storage/schema/main/delta/42/user_dir.py +88 -0
  641. synapse/storage/schema/main/delta/43/blocked_rooms.sql +40 -0
  642. synapse/storage/schema/main/delta/43/quarantine_media.sql +36 -0
  643. synapse/storage/schema/main/delta/43/url_cache.sql +35 -0
  644. synapse/storage/schema/main/delta/43/user_share.sql +52 -0
  645. synapse/storage/schema/main/delta/44/expire_url_cache.sql +60 -0
  646. synapse/storage/schema/main/delta/45/group_server.sql +186 -0
  647. synapse/storage/schema/main/delta/45/profile_cache.sql +47 -0
  648. synapse/storage/schema/main/delta/46/drop_refresh_tokens.sql +36 -0
  649. synapse/storage/schema/main/delta/46/drop_unique_deleted_pushers.sql +54 -0
  650. synapse/storage/schema/main/delta/46/group_server.sql +51 -0
  651. synapse/storage/schema/main/delta/46/local_media_repository_url_idx.sql +43 -0
  652. synapse/storage/schema/main/delta/46/user_dir_null_room_ids.sql +54 -0
  653. synapse/storage/schema/main/delta/46/user_dir_typos.sql +43 -0
  654. synapse/storage/schema/main/delta/47/last_access_media.sql +35 -0
  655. synapse/storage/schema/main/delta/47/postgres_fts_gin.sql +36 -0
  656. synapse/storage/schema/main/delta/47/push_actions_staging.sql +47 -0
  657. synapse/storage/schema/main/delta/48/add_user_consent.sql +37 -0
  658. synapse/storage/schema/main/delta/48/add_user_ips_last_seen_index.sql +36 -0
  659. synapse/storage/schema/main/delta/48/deactivated_users.sql +44 -0
  660. synapse/storage/schema/main/delta/48/group_unique_indexes.py +67 -0
  661. synapse/storage/schema/main/delta/48/groups_joinable.sql +41 -0
  662. synapse/storage/schema/main/delta/49/add_user_consent_server_notice_sent.sql +39 -0
  663. synapse/storage/schema/main/delta/49/add_user_daily_visits.sql +40 -0
  664. synapse/storage/schema/main/delta/49/add_user_ips_last_seen_only_index.sql +36 -0
  665. synapse/storage/schema/main/delta/50/add_creation_ts_users_index.sql +38 -0
  666. synapse/storage/schema/main/delta/50/erasure_store.sql +40 -0
  667. synapse/storage/schema/main/delta/50/make_event_content_nullable.py +102 -0
  668. synapse/storage/schema/main/delta/51/e2e_room_keys.sql +58 -0
  669. synapse/storage/schema/main/delta/51/monthly_active_users.sql +46 -0
  670. synapse/storage/schema/main/delta/52/add_event_to_state_group_index.sql +38 -0
  671. synapse/storage/schema/main/delta/52/device_list_streams_unique_idx.sql +55 -0
  672. synapse/storage/schema/main/delta/52/e2e_room_keys.sql +72 -0
  673. synapse/storage/schema/main/delta/53/add_user_type_to_users.sql +38 -0
  674. synapse/storage/schema/main/delta/53/drop_sent_transactions.sql +35 -0
  675. synapse/storage/schema/main/delta/53/event_format_version.sql +35 -0
  676. synapse/storage/schema/main/delta/53/user_dir_populate.sql +49 -0
  677. synapse/storage/schema/main/delta/53/user_ips_index.sql +49 -0
  678. synapse/storage/schema/main/delta/53/user_share.sql +63 -0
  679. synapse/storage/schema/main/delta/53/user_threepid_id.sql +48 -0
  680. synapse/storage/schema/main/delta/53/users_in_public_rooms.sql +47 -0
  681. synapse/storage/schema/main/delta/54/account_validity_with_renewal.sql +49 -0
  682. synapse/storage/schema/main/delta/54/add_validity_to_server_keys.sql +42 -0
  683. synapse/storage/schema/main/delta/54/delete_forward_extremities.sql +42 -0
  684. synapse/storage/schema/main/delta/54/drop_legacy_tables.sql +49 -0
  685. synapse/storage/schema/main/delta/54/drop_presence_list.sql +35 -0
  686. synapse/storage/schema/main/delta/54/relations.sql +46 -0
  687. synapse/storage/schema/main/delta/54/stats.sql +99 -0
  688. synapse/storage/schema/main/delta/54/stats2.sql +47 -0
  689. synapse/storage/schema/main/delta/55/access_token_expiry.sql +37 -0
  690. synapse/storage/schema/main/delta/55/track_threepid_validations.sql +50 -0
  691. synapse/storage/schema/main/delta/55/users_alter_deactivated.sql +38 -0
  692. synapse/storage/schema/main/delta/56/add_spans_to_device_lists.sql +39 -0
  693. synapse/storage/schema/main/delta/56/current_state_events_membership.sql +41 -0
  694. synapse/storage/schema/main/delta/56/current_state_events_membership_mk2.sql +43 -0
  695. synapse/storage/schema/main/delta/56/delete_keys_from_deleted_backups.sql +44 -0
  696. synapse/storage/schema/main/delta/56/destinations_failure_ts.sql +44 -0
  697. synapse/storage/schema/main/delta/56/destinations_retry_interval_type.sql.postgres +18 -0
  698. synapse/storage/schema/main/delta/56/device_stream_id_insert.sql +39 -0
  699. synapse/storage/schema/main/delta/56/devices_last_seen.sql +43 -0
  700. synapse/storage/schema/main/delta/56/drop_unused_event_tables.sql +39 -0
  701. synapse/storage/schema/main/delta/56/event_expiry.sql +40 -0
  702. synapse/storage/schema/main/delta/56/event_labels.sql +49 -0
  703. synapse/storage/schema/main/delta/56/event_labels_background_update.sql +36 -0
  704. synapse/storage/schema/main/delta/56/fix_room_keys_index.sql +37 -0
  705. synapse/storage/schema/main/delta/56/hidden_devices.sql +37 -0
  706. synapse/storage/schema/main/delta/56/hidden_devices_fix.sql.sqlite +42 -0
  707. synapse/storage/schema/main/delta/56/nuke_empty_communities_from_db.sql +48 -0
  708. synapse/storage/schema/main/delta/56/public_room_list_idx.sql +35 -0
  709. synapse/storage/schema/main/delta/56/redaction_censor.sql +35 -0
  710. synapse/storage/schema/main/delta/56/redaction_censor2.sql +41 -0
  711. synapse/storage/schema/main/delta/56/redaction_censor3_fix_update.sql.postgres +25 -0
  712. synapse/storage/schema/main/delta/56/redaction_censor4.sql +35 -0
  713. synapse/storage/schema/main/delta/56/remove_tombstoned_rooms_from_directory.sql +38 -0
  714. synapse/storage/schema/main/delta/56/room_key_etag.sql +36 -0
  715. synapse/storage/schema/main/delta/56/room_membership_idx.sql +37 -0
  716. synapse/storage/schema/main/delta/56/room_retention.sql +52 -0
  717. synapse/storage/schema/main/delta/56/signing_keys.sql +75 -0
  718. synapse/storage/schema/main/delta/56/signing_keys_nonunique_signatures.sql +41 -0
  719. synapse/storage/schema/main/delta/56/stats_separated.sql +175 -0
  720. synapse/storage/schema/main/delta/56/unique_user_filter_index.py +46 -0
  721. synapse/storage/schema/main/delta/56/user_external_ids.sql +43 -0
  722. synapse/storage/schema/main/delta/56/users_in_public_rooms_idx.sql +36 -0
  723. synapse/storage/schema/main/delta/57/delete_old_current_state_events.sql +41 -0
  724. synapse/storage/schema/main/delta/57/device_list_remote_cache_stale.sql +44 -0
  725. synapse/storage/schema/main/delta/57/local_current_membership.py +111 -0
  726. synapse/storage/schema/main/delta/57/remove_sent_outbound_pokes.sql +40 -0
  727. synapse/storage/schema/main/delta/57/rooms_version_column.sql +43 -0
  728. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.postgres +35 -0
  729. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.sqlite +22 -0
  730. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.postgres +39 -0
  731. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.sqlite +23 -0
  732. synapse/storage/schema/main/delta/58/02remove_dup_outbound_pokes.sql +41 -0
  733. synapse/storage/schema/main/delta/58/03persist_ui_auth.sql +55 -0
  734. synapse/storage/schema/main/delta/58/05cache_instance.sql.postgres +30 -0
  735. synapse/storage/schema/main/delta/58/06dlols_unique_idx.py +83 -0
  736. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.postgres +33 -0
  737. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.sqlite +44 -0
  738. synapse/storage/schema/main/delta/58/07persist_ui_auth_ips.sql +44 -0
  739. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.postgres +18 -0
  740. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.sqlite +18 -0
  741. synapse/storage/schema/main/delta/58/09shadow_ban.sql +37 -0
  742. synapse/storage/schema/main/delta/58/10_pushrules_enabled_delete_obsolete.sql +47 -0
  743. synapse/storage/schema/main/delta/58/10drop_local_rejections_stream.sql +41 -0
  744. synapse/storage/schema/main/delta/58/10federation_pos_instance_name.sql +41 -0
  745. synapse/storage/schema/main/delta/58/11dehydration.sql +39 -0
  746. synapse/storage/schema/main/delta/58/11fallback.sql +43 -0
  747. synapse/storage/schema/main/delta/58/11user_id_seq.py +38 -0
  748. synapse/storage/schema/main/delta/58/12room_stats.sql +51 -0
  749. synapse/storage/schema/main/delta/58/13remove_presence_allow_inbound.sql +36 -0
  750. synapse/storage/schema/main/delta/58/14events_instance_name.sql +35 -0
  751. synapse/storage/schema/main/delta/58/14events_instance_name.sql.postgres +28 -0
  752. synapse/storage/schema/main/delta/58/15_catchup_destination_rooms.sql +61 -0
  753. synapse/storage/schema/main/delta/58/15unread_count.sql +45 -0
  754. synapse/storage/schema/main/delta/58/16populate_stats_process_rooms_fix.sql +41 -0
  755. synapse/storage/schema/main/delta/58/17_catchup_last_successful.sql +40 -0
  756. synapse/storage/schema/main/delta/58/18stream_positions.sql +41 -0
  757. synapse/storage/schema/main/delta/58/19instance_map.sql.postgres +25 -0
  758. synapse/storage/schema/main/delta/58/19txn_id.sql +59 -0
  759. synapse/storage/schema/main/delta/58/20instance_name_event_tables.sql +36 -0
  760. synapse/storage/schema/main/delta/58/20user_daily_visits.sql +37 -0
  761. synapse/storage/schema/main/delta/58/21as_device_stream.sql +36 -0
  762. synapse/storage/schema/main/delta/58/21drop_device_max_stream_id.sql +1 -0
  763. synapse/storage/schema/main/delta/58/22puppet_token.sql +36 -0
  764. synapse/storage/schema/main/delta/58/22users_have_local_media.sql +2 -0
  765. synapse/storage/schema/main/delta/58/23e2e_cross_signing_keys_idx.sql +36 -0
  766. synapse/storage/schema/main/delta/58/24drop_event_json_index.sql +38 -0
  767. synapse/storage/schema/main/delta/58/25user_external_ids_user_id_idx.sql +36 -0
  768. synapse/storage/schema/main/delta/58/26access_token_last_validated.sql +37 -0
  769. synapse/storage/schema/main/delta/58/27local_invites.sql +37 -0
  770. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.postgres +16 -0
  771. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.sqlite +62 -0
  772. synapse/storage/schema/main/delta/59/01ignored_user.py +85 -0
  773. synapse/storage/schema/main/delta/59/02shard_send_to_device.sql +37 -0
  774. synapse/storage/schema/main/delta/59/03shard_send_to_device_sequence.sql.postgres +25 -0
  775. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql +71 -0
  776. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql.postgres +16 -0
  777. synapse/storage/schema/main/delta/59/04drop_account_data.sql +36 -0
  778. synapse/storage/schema/main/delta/59/05cache_invalidation.sql +36 -0
  779. synapse/storage/schema/main/delta/59/06chain_cover_index.sql +36 -0
  780. synapse/storage/schema/main/delta/59/06shard_account_data.sql +39 -0
  781. synapse/storage/schema/main/delta/59/06shard_account_data.sql.postgres +32 -0
  782. synapse/storage/schema/main/delta/59/07shard_account_data_fix.sql +37 -0
  783. synapse/storage/schema/main/delta/59/08delete_pushers_for_deactivated_accounts.sql +39 -0
  784. synapse/storage/schema/main/delta/59/08delete_stale_pushers.sql +39 -0
  785. synapse/storage/schema/main/delta/59/09rejected_events_metadata.sql +45 -0
  786. synapse/storage/schema/main/delta/59/10delete_purged_chain_cover.sql +36 -0
  787. synapse/storage/schema/main/delta/59/11add_knock_members_to_stats.sql +39 -0
  788. synapse/storage/schema/main/delta/59/11drop_thumbnail_constraint.sql.postgres +22 -0
  789. synapse/storage/schema/main/delta/59/12account_validity_token_used_ts_ms.sql +37 -0
  790. synapse/storage/schema/main/delta/59/12presence_stream_instance.sql +37 -0
  791. synapse/storage/schema/main/delta/59/12presence_stream_instance_seq.sql.postgres +20 -0
  792. synapse/storage/schema/main/delta/59/13users_to_send_full_presence_to.sql +53 -0
  793. synapse/storage/schema/main/delta/59/14refresh_tokens.sql +53 -0
  794. synapse/storage/schema/main/delta/59/15locks.sql +56 -0
  795. synapse/storage/schema/main/delta/59/16federation_inbound_staging.sql +51 -0
  796. synapse/storage/schema/main/delta/60/01recreate_stream_ordering.sql.postgres +45 -0
  797. synapse/storage/schema/main/delta/60/02change_stream_ordering_columns.sql.postgres +30 -0
  798. synapse/storage/schema/main/delta/61/01change_appservices_txns.sql.postgres +23 -0
  799. synapse/storage/schema/main/delta/61/01insertion_event_lookups.sql +68 -0
  800. synapse/storage/schema/main/delta/61/02drop_redundant_room_depth_index.sql +37 -0
  801. synapse/storage/schema/main/delta/61/03recreate_min_depth.py +74 -0
  802. synapse/storage/schema/main/delta/62/01insertion_event_extremities.sql +43 -0
  803. synapse/storage/schema/main/delta/63/01create_registration_tokens.sql +42 -0
  804. synapse/storage/schema/main/delta/63/02delete_unlinked_email_pushers.sql +39 -0
  805. synapse/storage/schema/main/delta/63/02populate-rooms-creator.sql +36 -0
  806. synapse/storage/schema/main/delta/63/03session_store.sql +42 -0
  807. synapse/storage/schema/main/delta/63/04add_presence_stream_not_offline_index.sql +37 -0
  808. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.postgres +23 -0
  809. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.sqlite +37 -0
  810. synapse/storage/schema/main/delta/65/01msc2716_insertion_event_edges.sql +38 -0
  811. synapse/storage/schema/main/delta/65/03remove_hidden_devices_from_device_inbox.sql +41 -0
  812. synapse/storage/schema/main/delta/65/04_local_group_updates.sql +37 -0
  813. synapse/storage/schema/main/delta/65/05_remove_room_stats_historical_and_user_stats_historical.sql +38 -0
  814. synapse/storage/schema/main/delta/65/06remove_deleted_devices_from_device_inbox.sql +53 -0
  815. synapse/storage/schema/main/delta/65/07_arbitrary_relations.sql +37 -0
  816. synapse/storage/schema/main/delta/65/08_device_inbox_background_updates.sql +37 -0
  817. synapse/storage/schema/main/delta/65/10_expirable_refresh_tokens.sql +47 -0
  818. synapse/storage/schema/main/delta/65/11_devices_auth_provider_session.sql +46 -0
  819. synapse/storage/schema/main/delta/67/01drop_public_room_list_stream.sql +37 -0
  820. synapse/storage/schema/main/delta/68/01event_columns.sql +45 -0
  821. synapse/storage/schema/main/delta/68/02_msc2409_add_device_id_appservice_stream_type.sql +40 -0
  822. synapse/storage/schema/main/delta/68/03_delete_account_data_for_deactivated_accounts.sql +39 -0
  823. synapse/storage/schema/main/delta/68/04_refresh_tokens_index_next_token_id.sql +47 -0
  824. synapse/storage/schema/main/delta/68/04partial_state_rooms.sql +60 -0
  825. synapse/storage/schema/main/delta/68/05_delete_non_strings_from_event_search.sql.sqlite +22 -0
  826. synapse/storage/schema/main/delta/68/05partial_state_rooms_triggers.py +80 -0
  827. synapse/storage/schema/main/delta/68/06_msc3202_add_device_list_appservice_stream_type.sql +42 -0
  828. synapse/storage/schema/main/delta/69/01as_txn_seq.py +54 -0
  829. synapse/storage/schema/main/delta/69/01device_list_oubound_by_room.sql +57 -0
  830. synapse/storage/schema/main/delta/69/02cache_invalidation_index.sql +37 -0
  831. synapse/storage/schema/main/delta/70/01clean_table_purged_rooms.sql +39 -0
  832. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.postgres +43 -0
  833. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.sqlite +47 -0
  834. synapse/storage/schema/main/delta/71/01remove_noop_background_updates.sql +80 -0
  835. synapse/storage/schema/main/delta/71/02event_push_summary_unique.sql +37 -0
  836. synapse/storage/schema/main/delta/72/01add_room_type_to_state_stats.sql +38 -0
  837. synapse/storage/schema/main/delta/72/01event_push_summary_receipt.sql +54 -0
  838. synapse/storage/schema/main/delta/72/02event_push_actions_index.sql +38 -0
  839. synapse/storage/schema/main/delta/72/03bg_populate_events_columns.py +57 -0
  840. synapse/storage/schema/main/delta/72/03drop_event_reference_hashes.sql +36 -0
  841. synapse/storage/schema/main/delta/72/03remove_groups.sql +50 -0
  842. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.postgres +17 -0
  843. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.sqlite +40 -0
  844. synapse/storage/schema/main/delta/72/05receipts_event_stream_ordering.sql +38 -0
  845. synapse/storage/schema/main/delta/72/05remove_unstable_private_read_receipts.sql +38 -0
  846. synapse/storage/schema/main/delta/72/06add_consent_ts_to_users.sql +35 -0
  847. synapse/storage/schema/main/delta/72/06thread_notifications.sql +49 -0
  848. synapse/storage/schema/main/delta/72/07force_update_current_state_events_membership.py +67 -0
  849. synapse/storage/schema/main/delta/72/07thread_receipts.sql.postgres +30 -0
  850. synapse/storage/schema/main/delta/72/07thread_receipts.sql.sqlite +70 -0
  851. synapse/storage/schema/main/delta/72/08begin_cache_invalidation_seq_at_2.sql.postgres +23 -0
  852. synapse/storage/schema/main/delta/72/08thread_receipts.sql +39 -0
  853. synapse/storage/schema/main/delta/72/09partial_indices.sql.sqlite +56 -0
  854. synapse/storage/schema/main/delta/73/01event_failed_pull_attempts.sql +48 -0
  855. synapse/storage/schema/main/delta/73/02add_pusher_enabled.sql +35 -0
  856. synapse/storage/schema/main/delta/73/02room_id_indexes_for_purging.sql +41 -0
  857. synapse/storage/schema/main/delta/73/03pusher_device_id.sql +39 -0
  858. synapse/storage/schema/main/delta/73/03users_approved_column.sql +39 -0
  859. synapse/storage/schema/main/delta/73/04partial_join_details.sql +42 -0
  860. synapse/storage/schema/main/delta/73/04pending_device_list_updates.sql +47 -0
  861. synapse/storage/schema/main/delta/73/05old_push_actions.sql.postgres +22 -0
  862. synapse/storage/schema/main/delta/73/05old_push_actions.sql.sqlite +24 -0
  863. synapse/storage/schema/main/delta/73/06thread_notifications_thread_id_idx.sql +42 -0
  864. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.postgres +23 -0
  865. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.sqlite +76 -0
  866. synapse/storage/schema/main/delta/73/09partial_joined_via_destination.sql +37 -0
  867. synapse/storage/schema/main/delta/73/09threads_table.sql +49 -0
  868. synapse/storage/schema/main/delta/73/10_update_sqlite_fts4_tokenizer.py +71 -0
  869. synapse/storage/schema/main/delta/73/10login_tokens.sql +54 -0
  870. synapse/storage/schema/main/delta/73/11event_search_room_id_n_distinct.sql.postgres +33 -0
  871. synapse/storage/schema/main/delta/73/12refactor_device_list_outbound_pokes.sql +72 -0
  872. synapse/storage/schema/main/delta/73/13add_device_lists_index.sql +39 -0
  873. synapse/storage/schema/main/delta/73/20_un_partial_stated_room_stream.sql +51 -0
  874. synapse/storage/schema/main/delta/73/21_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  875. synapse/storage/schema/main/delta/73/22_rebuild_user_dir_stats.sql +48 -0
  876. synapse/storage/schema/main/delta/73/22_un_partial_stated_event_stream.sql +53 -0
  877. synapse/storage/schema/main/delta/73/23_fix_thread_index.sql +52 -0
  878. synapse/storage/schema/main/delta/73/23_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  879. synapse/storage/schema/main/delta/73/24_events_jump_to_date_index.sql +36 -0
  880. synapse/storage/schema/main/delta/73/25drop_presence.sql +36 -0
  881. synapse/storage/schema/main/delta/74/01_user_directory_stale_remote_users.sql +58 -0
  882. synapse/storage/schema/main/delta/74/02_set_device_id_for_pushers_bg_update.sql +38 -0
  883. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.postgres +29 -0
  884. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.sqlite +23 -0
  885. synapse/storage/schema/main/delta/74/03_room_membership_index.sql +38 -0
  886. synapse/storage/schema/main/delta/74/04_delete_e2e_backup_keys_for_deactivated_users.sql +36 -0
  887. synapse/storage/schema/main/delta/74/04_membership_tables_event_stream_ordering_triggers.py +87 -0
  888. synapse/storage/schema/main/delta/74/05_events_txn_id_device_id.sql +72 -0
  889. synapse/storage/schema/main/delta/74/90COMMENTS_destinations.sql.postgres +52 -0
  890. synapse/storage/schema/main/delta/76/01_add_profiles_full_user_id_column.sql +39 -0
  891. synapse/storage/schema/main/delta/76/02_add_user_filters_full_user_id_column.sql +39 -0
  892. synapse/storage/schema/main/delta/76/03_per_user_experimental_features.sql +46 -0
  893. synapse/storage/schema/main/delta/76/04_add_room_forgetter.sql +43 -0
  894. synapse/storage/schema/main/delta/77/01_add_profiles_not_valid_check.sql.postgres +16 -0
  895. synapse/storage/schema/main/delta/77/02_add_user_filters_not_valid_check.sql.postgres +16 -0
  896. synapse/storage/schema/main/delta/77/03bg_populate_full_user_id_profiles.sql +35 -0
  897. synapse/storage/schema/main/delta/77/04bg_populate_full_user_id_user_filters.sql +35 -0
  898. synapse/storage/schema/main/delta/77/05thread_notifications_backfill.sql +67 -0
  899. synapse/storage/schema/main/delta/77/06thread_notifications_not_null.sql.sqlite +102 -0
  900. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions.sql.postgres +27 -0
  901. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions_staging.sql.postgres +27 -0
  902. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_summary.sql.postgres +29 -0
  903. synapse/storage/schema/main/delta/77/14bg_indices_event_stream_ordering.sql +39 -0
  904. synapse/storage/schema/main/delta/78/01_validate_and_update_profiles.py +99 -0
  905. synapse/storage/schema/main/delta/78/02_validate_and_update_user_filters.py +100 -0
  906. synapse/storage/schema/main/delta/78/03_remove_unused_indexes_user_filters.py +72 -0
  907. synapse/storage/schema/main/delta/78/03event_extremities_constraints.py +65 -0
  908. synapse/storage/schema/main/delta/78/04_add_full_user_id_index_user_filters.py +32 -0
  909. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.postgres +102 -0
  910. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.sqlite +72 -0
  911. synapse/storage/schema/main/delta/79/04_mitigate_stream_ordering_update_race.py +70 -0
  912. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.postgres +69 -0
  913. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.sqlite +65 -0
  914. synapse/storage/schema/main/delta/80/01_users_alter_locked.sql +35 -0
  915. synapse/storage/schema/main/delta/80/02_read_write_locks_unlogged.sql.postgres +30 -0
  916. synapse/storage/schema/main/delta/80/02_scheduled_tasks.sql +47 -0
  917. synapse/storage/schema/main/delta/80/03_read_write_locks_triggers.sql.postgres +37 -0
  918. synapse/storage/schema/main/delta/80/04_read_write_locks_deadlock.sql.postgres +71 -0
  919. synapse/storage/schema/main/delta/82/02_scheduled_tasks_index.sql +35 -0
  920. synapse/storage/schema/main/delta/82/04_add_indices_for_purging_rooms.sql +39 -0
  921. synapse/storage/schema/main/delta/82/05gaps.sql +44 -0
  922. synapse/storage/schema/main/delta/83/01_drop_old_tables.sql +43 -0
  923. synapse/storage/schema/main/delta/83/03_instance_name_receipts.sql.sqlite +17 -0
  924. synapse/storage/schema/main/delta/83/05_cross_signing_key_update_grant.sql +34 -0
  925. synapse/storage/schema/main/delta/83/06_event_push_summary_room.sql +36 -0
  926. synapse/storage/schema/main/delta/84/01_auth_links_stats.sql.postgres +20 -0
  927. synapse/storage/schema/main/delta/84/02_auth_links_index.sql +16 -0
  928. synapse/storage/schema/main/delta/84/03_auth_links_analyze.sql.postgres +16 -0
  929. synapse/storage/schema/main/delta/84/04_access_token_index.sql +15 -0
  930. synapse/storage/schema/main/delta/85/01_add_suspended.sql +14 -0
  931. synapse/storage/schema/main/delta/85/02_add_instance_names.sql +27 -0
  932. synapse/storage/schema/main/delta/85/03_new_sequences.sql.postgres +54 -0
  933. synapse/storage/schema/main/delta/85/04_cleanup_device_federation_outbox.sql +15 -0
  934. synapse/storage/schema/main/delta/85/05_add_instance_names_converted_pos.sql +16 -0
  935. synapse/storage/schema/main/delta/85/06_add_room_reports.sql +20 -0
  936. synapse/storage/schema/main/delta/86/01_authenticate_media.sql +15 -0
  937. synapse/storage/schema/main/delta/86/02_receipts_event_id_index.sql +15 -0
  938. synapse/storage/schema/main/delta/87/01_sliding_sync_memberships.sql +169 -0
  939. synapse/storage/schema/main/delta/87/02_per_connection_state.sql +81 -0
  940. synapse/storage/schema/main/delta/87/03_current_state_index.sql +19 -0
  941. synapse/storage/schema/main/delta/88/01_add_delayed_events.sql +43 -0
  942. synapse/storage/schema/main/delta/88/01_custom_profile_fields.sql +15 -0
  943. synapse/storage/schema/main/delta/88/02_fix_sliding_sync_membership_snapshots_forgotten_column.sql +21 -0
  944. synapse/storage/schema/main/delta/88/03_add_otk_ts_added_index.sql +18 -0
  945. synapse/storage/schema/main/delta/88/04_current_state_delta_index.sql +18 -0
  946. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.postgres +19 -0
  947. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.sqlite +19 -0
  948. synapse/storage/schema/main/delta/88/05_sliding_sync_room_config_index.sql +20 -0
  949. synapse/storage/schema/main/delta/88/06_events_received_ts_index.sql +17 -0
  950. synapse/storage/schema/main/delta/89/01_sliding_sync_membership_snapshot_index.sql +15 -0
  951. synapse/storage/schema/main/delta/90/01_add_column_participant_room_memberships_table.sql +16 -0
  952. synapse/storage/schema/main/delta/91/01_media_hash.sql +28 -0
  953. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.postgres +16 -0
  954. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.sqlite +16 -0
  955. synapse/storage/schema/main/delta/92/02_remove_populate_participant_bg_update.sql +17 -0
  956. synapse/storage/schema/main/delta/92/04_ss_membership_snapshot_idx.sql +16 -0
  957. synapse/storage/schema/main/delta/92/04_thread_subscriptions.sql +59 -0
  958. synapse/storage/schema/main/delta/92/04_thread_subscriptions_seq.sql.postgres +19 -0
  959. synapse/storage/schema/main/delta/92/05_fixup_max_depth_cap.sql +17 -0
  960. synapse/storage/schema/main/delta/92/05_thread_subscriptions_comments.sql.postgres +18 -0
  961. synapse/storage/schema/main/delta/92/06_device_federation_inbox_index.sql +16 -0
  962. synapse/storage/schema/main/delta/92/06_threads_last_sent_stream_ordering_comments.sql.postgres +24 -0
  963. synapse/storage/schema/main/delta/92/07_add_user_reports.sql +22 -0
  964. synapse/storage/schema/main/delta/92/07_event_txn_id_device_id_txn_id2.sql +15 -0
  965. synapse/storage/schema/main/delta/92/08_room_ban_redactions.sql +21 -0
  966. synapse/storage/schema/main/delta/92/08_thread_subscriptions_seq_fixup.sql.postgres +19 -0
  967. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql +20 -0
  968. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql.postgres +18 -0
  969. synapse/storage/schema/main/full_schemas/72/full.sql.postgres +1344 -0
  970. synapse/storage/schema/main/full_schemas/72/full.sql.sqlite +646 -0
  971. synapse/storage/schema/state/delta/23/drop_state_index.sql +35 -0
  972. synapse/storage/schema/state/delta/32/remove_state_indices.sql +38 -0
  973. synapse/storage/schema/state/delta/35/add_state_index.sql +36 -0
  974. synapse/storage/schema/state/delta/35/state.sql +41 -0
  975. synapse/storage/schema/state/delta/35/state_dedupe.sql +36 -0
  976. synapse/storage/schema/state/delta/47/state_group_seq.py +38 -0
  977. synapse/storage/schema/state/delta/56/state_group_room_idx.sql +36 -0
  978. synapse/storage/schema/state/delta/61/02state_groups_state_n_distinct.sql.postgres +34 -0
  979. synapse/storage/schema/state/delta/70/08_state_group_edges_unique.sql +36 -0
  980. synapse/storage/schema/state/delta/89/01_state_groups_deletion.sql +39 -0
  981. synapse/storage/schema/state/delta/90/02_delete_unreferenced_state_groups.sql +16 -0
  982. synapse/storage/schema/state/delta/90/03_remove_old_deletion_bg_update.sql +15 -0
  983. synapse/storage/schema/state/full_schemas/72/full.sql.postgres +30 -0
  984. synapse/storage/schema/state/full_schemas/72/full.sql.sqlite +20 -0
  985. synapse/storage/types.py +185 -0
  986. synapse/storage/util/__init__.py +20 -0
  987. synapse/storage/util/id_generators.py +909 -0
  988. synapse/storage/util/partial_state_events_tracker.py +194 -0
  989. synapse/storage/util/sequence.py +315 -0
  990. synapse/streams/__init__.py +43 -0
  991. synapse/streams/config.py +92 -0
  992. synapse/streams/events.py +203 -0
  993. synapse/synapse_rust/__init__.pyi +3 -0
  994. synapse/synapse_rust/acl.pyi +20 -0
  995. synapse/synapse_rust/events.pyi +136 -0
  996. synapse/synapse_rust/http_client.pyi +32 -0
  997. synapse/synapse_rust/push.pyi +86 -0
  998. synapse/synapse_rust/rendezvous.pyi +30 -0
  999. synapse/synapse_rust/segmenter.pyi +1 -0
  1000. synapse/synapse_rust.abi3.so +0 -0
  1001. synapse/types/__init__.py +1600 -0
  1002. synapse/types/handlers/__init__.py +93 -0
  1003. synapse/types/handlers/policy_server.py +16 -0
  1004. synapse/types/handlers/sliding_sync.py +909 -0
  1005. synapse/types/rest/__init__.py +25 -0
  1006. synapse/types/rest/client/__init__.py +415 -0
  1007. synapse/types/state.py +635 -0
  1008. synapse/types/storage/__init__.py +66 -0
  1009. synapse/util/__init__.py +170 -0
  1010. synapse/util/async_helpers.py +1067 -0
  1011. synapse/util/batching_queue.py +202 -0
  1012. synapse/util/caches/__init__.py +300 -0
  1013. synapse/util/caches/cached_call.py +143 -0
  1014. synapse/util/caches/deferred_cache.py +530 -0
  1015. synapse/util/caches/descriptors.py +694 -0
  1016. synapse/util/caches/dictionary_cache.py +350 -0
  1017. synapse/util/caches/expiringcache.py +251 -0
  1018. synapse/util/caches/lrucache.py +977 -0
  1019. synapse/util/caches/response_cache.py +323 -0
  1020. synapse/util/caches/stream_change_cache.py +370 -0
  1021. synapse/util/caches/treecache.py +189 -0
  1022. synapse/util/caches/ttlcache.py +197 -0
  1023. synapse/util/cancellation.py +63 -0
  1024. synapse/util/check_dependencies.py +335 -0
  1025. synapse/util/clock.py +500 -0
  1026. synapse/util/constants.py +22 -0
  1027. synapse/util/daemonize.py +165 -0
  1028. synapse/util/distributor.py +159 -0
  1029. synapse/util/events.py +134 -0
  1030. synapse/util/file_consumer.py +164 -0
  1031. synapse/util/frozenutils.py +57 -0
  1032. synapse/util/gai_resolver.py +180 -0
  1033. synapse/util/hash.py +38 -0
  1034. synapse/util/httpresourcetree.py +108 -0
  1035. synapse/util/iterutils.py +189 -0
  1036. synapse/util/json.py +56 -0
  1037. synapse/util/linked_list.py +156 -0
  1038. synapse/util/logcontext.py +46 -0
  1039. synapse/util/logformatter.py +28 -0
  1040. synapse/util/macaroons.py +325 -0
  1041. synapse/util/manhole.py +191 -0
  1042. synapse/util/metrics.py +340 -0
  1043. synapse/util/module_loader.py +116 -0
  1044. synapse/util/msisdn.py +51 -0
  1045. synapse/util/patch_inline_callbacks.py +250 -0
  1046. synapse/util/pydantic_models.py +56 -0
  1047. synapse/util/ratelimitutils.py +420 -0
  1048. synapse/util/retryutils.py +339 -0
  1049. synapse/util/rlimit.py +42 -0
  1050. synapse/util/rust.py +134 -0
  1051. synapse/util/sentinel.py +21 -0
  1052. synapse/util/stringutils.py +293 -0
  1053. synapse/util/task_scheduler.py +493 -0
  1054. synapse/util/templates.py +126 -0
  1055. synapse/util/threepids.py +123 -0
  1056. synapse/util/wheel_timer.py +112 -0
  1057. synapse/visibility.py +836 -0
@@ -0,0 +1,1131 @@
1
+ #
2
+ # This file is licensed under the Affero General Public License (AGPL) version 3.
3
+ #
4
+ # Copyright 2015, 2016 OpenMarket Ltd
5
+ # Copyright (C) 2023 New Vector, Ltd
6
+ #
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Affero General Public License as
9
+ # published by the Free Software Foundation, either version 3 of the
10
+ # License, or (at your option) any later version.
11
+ #
12
+ # See the GNU Affero General Public License for more details:
13
+ # <https://www.gnu.org/licenses/agpl-3.0.html>.
14
+ #
15
+ # Originally licensed under the Apache License, Version 2.0:
16
+ # <http://www.apache.org/licenses/LICENSE-2.0>.
17
+ #
18
+ # [This file includes modifications made by New Vector Limited]
19
+ #
20
+ #
21
+ import itertools
22
+ import logging
23
+ from collections import defaultdict
24
+ from typing import TYPE_CHECKING, Any, Mapping, Optional, Union
25
+
26
+ import attr
27
+
28
+ from synapse.api.constants import AccountDataTypes, EduTypes, Membership, PresenceState
29
+ from synapse.api.errors import Codes, StoreError, SynapseError
30
+ from synapse.api.filtering import FilterCollection
31
+ from synapse.api.presence import UserPresenceState
32
+ from synapse.api.ratelimiting import Ratelimiter
33
+ from synapse.events.utils import (
34
+ SerializeEventConfig,
35
+ format_event_for_client_v2_without_room_id,
36
+ format_event_raw,
37
+ )
38
+ from synapse.handlers.presence import format_user_presence_state
39
+ from synapse.handlers.sliding_sync import SlidingSyncConfig, SlidingSyncResult
40
+ from synapse.handlers.sync import (
41
+ ArchivedSyncResult,
42
+ InvitedSyncResult,
43
+ JoinedSyncResult,
44
+ KnockedSyncResult,
45
+ SyncConfig,
46
+ SyncResult,
47
+ )
48
+ from synapse.http.server import HttpServer
49
+ from synapse.http.servlet import (
50
+ RestServlet,
51
+ parse_and_validate_json_object_from_request,
52
+ parse_boolean,
53
+ parse_integer,
54
+ parse_string,
55
+ )
56
+ from synapse.http.site import SynapseRequest
57
+ from synapse.logging.opentracing import log_kv, set_tag, trace_with_opname
58
+ from synapse.rest.admin.experimental_features import ExperimentalFeature
59
+ from synapse.types import JsonDict, Requester, SlidingSyncStreamToken, StreamToken
60
+ from synapse.types.rest.client import SlidingSyncBody
61
+ from synapse.util.caches.lrucache import LruCache
62
+ from synapse.util.json import json_decoder
63
+
64
+ from ._base import client_patterns, set_timeline_upper_limit
65
+
66
+ if TYPE_CHECKING:
67
+ from synapse.server import HomeServer
68
+
69
+ logger = logging.getLogger(__name__)
70
+
71
+
72
+ class SyncRestServlet(RestServlet):
73
+ """
74
+
75
+ GET parameters::
76
+ timeout(int): How long to wait for new events in milliseconds.
77
+ since(batch_token): Batch token when asking for incremental deltas.
78
+ set_presence(str): What state the device presence should be set to.
79
+ default is "online".
80
+ filter(filter_id): A filter to apply to the events returned.
81
+
82
+ Response JSON::
83
+ {
84
+ "next_batch": // batch token for the next /sync
85
+ "presence": // presence data for the user.
86
+ "rooms": {
87
+ "join": { // Joined rooms being updated.
88
+ "${room_id}": { // Id of the room being updated
89
+ "event_map": // Map of EventID -> event JSON.
90
+ "timeline": { // The recent events in the room if gap is "true"
91
+ "limited": // Was the per-room event limit exceeded?
92
+ // otherwise the next events in the room.
93
+ "events": [] // list of EventIDs in the "event_map".
94
+ "prev_batch": // back token for getting previous events.
95
+ }
96
+ "state": {"events": []} // list of EventIDs updating the
97
+ // current state to be what it should
98
+ // be at the end of the batch.
99
+ "ephemeral": {"events": []} // list of event objects
100
+ }
101
+ },
102
+ "invite": {}, // Invited rooms being updated.
103
+ "leave": {} // Archived rooms being updated.
104
+ }
105
+ }
106
+ """
107
+
108
+ PATTERNS = client_patterns("/sync$")
109
+ ALLOWED_PRESENCE = {"online", "offline", "unavailable"}
110
+ CATEGORY = "Sync requests"
111
+
112
+ def __init__(self, hs: "HomeServer"):
113
+ super().__init__()
114
+ self.hs = hs
115
+ self.server_name = hs.hostname
116
+ self.auth = hs.get_auth()
117
+ self.store = hs.get_datastores().main
118
+ self.sync_handler = hs.get_sync_handler()
119
+ self.clock = hs.get_clock()
120
+ self.filtering = hs.get_filtering()
121
+ self.presence_handler = hs.get_presence_handler()
122
+ self._server_notices_sender = hs.get_server_notices_sender()
123
+ self._event_serializer = hs.get_event_client_serializer()
124
+ self._msc2654_enabled = hs.config.experimental.msc2654_enabled
125
+ self._msc3773_enabled = hs.config.experimental.msc3773_enabled
126
+
127
+ self._json_filter_cache: LruCache[str, bool] = LruCache(
128
+ max_size=1000,
129
+ clock=self.clock,
130
+ cache_name="sync_valid_filter",
131
+ server_name=self.server_name,
132
+ )
133
+
134
+ # Ratelimiter for presence updates, keyed by requester.
135
+ self._presence_per_user_limiter = Ratelimiter(
136
+ store=self.store,
137
+ clock=self.clock,
138
+ cfg=hs.config.ratelimiting.rc_presence_per_user,
139
+ )
140
+
141
+ async def on_GET(self, request: SynapseRequest) -> tuple[int, JsonDict]:
142
+ # This will always be set by the time Twisted calls us.
143
+ assert request.args is not None
144
+
145
+ if b"from" in request.args:
146
+ # /events used to use 'from', but /sync uses 'since'.
147
+ # Lets be helpful and whine if we see a 'from'.
148
+ raise SynapseError(
149
+ 400, "'from' is not a valid query parameter. Did you mean 'since'?"
150
+ )
151
+
152
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
153
+ user = requester.user
154
+ device_id = requester.device_id
155
+
156
+ timeout = parse_integer(request, "timeout", default=0)
157
+ since = parse_string(request, "since")
158
+ set_presence = parse_string(
159
+ request,
160
+ "set_presence",
161
+ default="online",
162
+ allowed_values=self.ALLOWED_PRESENCE,
163
+ )
164
+ filter_id = parse_string(request, "filter")
165
+ full_state = parse_boolean(request, "full_state", default=False)
166
+
167
+ use_state_after = False
168
+ if await self.store.is_feature_enabled(
169
+ user.to_string(), ExperimentalFeature.MSC4222
170
+ ):
171
+ use_state_after = parse_boolean(
172
+ request, "org.matrix.msc4222.use_state_after", default=False
173
+ )
174
+
175
+ logger.debug(
176
+ "/sync: user=%r, timeout=%r, since=%r, "
177
+ "set_presence=%r, filter_id=%r, device_id=%r",
178
+ user,
179
+ timeout,
180
+ since,
181
+ set_presence,
182
+ filter_id,
183
+ device_id,
184
+ )
185
+
186
+ # Stream position of the last ignored users account data event for this user,
187
+ # if we're initial syncing.
188
+ # We include this in the request key to invalidate an initial sync
189
+ # in the response cache once the set of ignored users has changed.
190
+ # (We filter out ignored users from timeline events, so our sync response
191
+ # is invalid once the set of ignored users changes.)
192
+ last_ignore_accdata_streampos: Optional[int] = None
193
+ if not since:
194
+ # No `since`, so this is an initial sync.
195
+ last_ignore_accdata_streampos = await self.store.get_latest_stream_id_for_global_account_data_by_type_for_user(
196
+ user.to_string(), AccountDataTypes.IGNORED_USER_LIST
197
+ )
198
+
199
+ request_key = (
200
+ user,
201
+ timeout,
202
+ since,
203
+ filter_id,
204
+ full_state,
205
+ device_id,
206
+ last_ignore_accdata_streampos,
207
+ use_state_after,
208
+ )
209
+
210
+ if filter_id is None:
211
+ filter_collection = self.filtering.DEFAULT_FILTER_COLLECTION
212
+ elif filter_id.startswith("{"):
213
+ try:
214
+ filter_object = json_decoder.decode(filter_id)
215
+ except Exception:
216
+ raise SynapseError(400, "Invalid filter JSON", errcode=Codes.NOT_JSON)
217
+
218
+ # We cache the validation, as this can get quite expensive if people use
219
+ # a literal json blob as a query param.
220
+ if not self._json_filter_cache.get(filter_id):
221
+ self.filtering.check_valid_filter(filter_object)
222
+ self._json_filter_cache[filter_id] = True
223
+
224
+ set_timeline_upper_limit(
225
+ filter_object, self.hs.config.server.filter_timeline_limit
226
+ )
227
+ filter_collection = FilterCollection(self.hs, filter_object)
228
+ else:
229
+ try:
230
+ filter_collection = await self.filtering.get_user_filter(
231
+ user, filter_id
232
+ )
233
+ except StoreError as err:
234
+ if err.code != 404:
235
+ raise
236
+ # fix up the description and errcode to be more useful
237
+ raise SynapseError(400, "No such filter", errcode=Codes.INVALID_PARAM)
238
+
239
+ sync_config = SyncConfig(
240
+ user=user,
241
+ filter_collection=filter_collection,
242
+ is_guest=requester.is_guest,
243
+ device_id=device_id,
244
+ use_state_after=use_state_after,
245
+ )
246
+
247
+ since_token = None
248
+ if since is not None:
249
+ since_token = await StreamToken.from_string(self.store, since)
250
+
251
+ # send any outstanding server notices to the user.
252
+ await self._server_notices_sender.on_user_syncing(user.to_string())
253
+
254
+ # ignore the presence update if the ratelimit is exceeded but do not pause the request
255
+ allowed, _ = await self._presence_per_user_limiter.can_do_action(requester)
256
+ if not allowed:
257
+ affect_presence = False
258
+ logger.debug("User set_presence ratelimit exceeded; ignoring it.")
259
+ else:
260
+ affect_presence = set_presence != PresenceState.OFFLINE
261
+
262
+ context = await self.presence_handler.user_syncing(
263
+ user.to_string(),
264
+ requester.device_id,
265
+ affect_presence=affect_presence,
266
+ presence_state=set_presence,
267
+ )
268
+ with context:
269
+ sync_result = await self.sync_handler.wait_for_sync_for_user(
270
+ requester,
271
+ sync_config,
272
+ request_key,
273
+ since_token=since_token,
274
+ timeout=timeout,
275
+ full_state=full_state,
276
+ )
277
+
278
+ # the client may have disconnected by now; don't bother to serialize the
279
+ # response if so.
280
+ if request._disconnected:
281
+ logger.info("Client has disconnected; not serializing response.")
282
+ return 200, {}
283
+
284
+ time_now = self.clock.time_msec()
285
+ # We know that the the requester has an access token since appservices
286
+ # cannot use sync.
287
+ response_content = await self.encode_response(
288
+ time_now, sync_config, sync_result, requester, filter_collection
289
+ )
290
+
291
+ logger.debug("Event formatting complete")
292
+ return 200, response_content
293
+
294
+ @trace_with_opname("sync.encode_response")
295
+ async def encode_response(
296
+ self,
297
+ time_now: int,
298
+ sync_config: SyncConfig,
299
+ sync_result: SyncResult,
300
+ requester: Requester,
301
+ filter: FilterCollection,
302
+ ) -> JsonDict:
303
+ logger.debug("Formatting events in sync response")
304
+ if filter.event_format == "client":
305
+ event_formatter = format_event_for_client_v2_without_room_id
306
+ elif filter.event_format == "federation":
307
+ event_formatter = format_event_raw
308
+ else:
309
+ raise Exception("Unknown event format %s" % (filter.event_format,))
310
+
311
+ serialize_options = SerializeEventConfig(
312
+ event_format=event_formatter,
313
+ requester=requester,
314
+ only_event_fields=filter.event_fields,
315
+ )
316
+ stripped_serialize_options = SerializeEventConfig(
317
+ event_format=event_formatter,
318
+ requester=requester,
319
+ include_stripped_room_state=True,
320
+ )
321
+
322
+ joined = await self.encode_joined(
323
+ sync_config, sync_result.joined, time_now, serialize_options
324
+ )
325
+
326
+ invited = await self.encode_invited(
327
+ sync_result.invited, time_now, stripped_serialize_options
328
+ )
329
+
330
+ knocked = await self.encode_knocked(
331
+ sync_result.knocked, time_now, stripped_serialize_options
332
+ )
333
+
334
+ archived = await self.encode_archived(
335
+ sync_config, sync_result.archived, time_now, serialize_options
336
+ )
337
+
338
+ logger.debug("building sync response dict")
339
+
340
+ response: JsonDict = defaultdict(dict)
341
+ response["next_batch"] = await sync_result.next_batch.to_string(self.store)
342
+
343
+ if sync_result.account_data:
344
+ response["account_data"] = {"events": sync_result.account_data}
345
+ if sync_result.presence:
346
+ response["presence"] = SyncRestServlet.encode_presence(
347
+ sync_result.presence, time_now
348
+ )
349
+
350
+ if sync_result.to_device:
351
+ response["to_device"] = {"events": sync_result.to_device}
352
+
353
+ if sync_result.device_lists.changed:
354
+ response["device_lists"]["changed"] = list(sync_result.device_lists.changed)
355
+ if sync_result.device_lists.left:
356
+ response["device_lists"]["left"] = list(sync_result.device_lists.left)
357
+
358
+ # We always include this because https://github.com/vector-im/element-android/issues/3725
359
+ # The spec isn't terribly clear on when this can be omitted and how a client would tell
360
+ # the difference between "no keys present" and "nothing changed" in terms of whole field
361
+ # absent / individual key type entry absent
362
+ # Corresponding synapse issue: https://github.com/matrix-org/synapse/issues/10456
363
+ response["device_one_time_keys_count"] = sync_result.device_one_time_keys_count
364
+
365
+ # https://github.com/matrix-org/matrix-doc/blob/54255851f642f84a4f1aaf7bc063eebe3d76752b/proposals/2732-olm-fallback-keys.md
366
+ # states that this field should always be included, as long as the server supports the feature.
367
+ response["device_unused_fallback_key_types"] = (
368
+ sync_result.device_unused_fallback_key_types
369
+ )
370
+
371
+ if joined:
372
+ response["rooms"][Membership.JOIN] = joined
373
+ if invited:
374
+ response["rooms"][Membership.INVITE] = invited
375
+ if knocked:
376
+ response["rooms"][Membership.KNOCK] = knocked
377
+ if archived:
378
+ response["rooms"][Membership.LEAVE] = archived
379
+
380
+ return response
381
+
382
+ @staticmethod
383
+ def encode_presence(events: list[UserPresenceState], time_now: int) -> JsonDict:
384
+ return {
385
+ "events": [
386
+ {
387
+ "type": EduTypes.PRESENCE,
388
+ "sender": event.user_id,
389
+ "content": format_user_presence_state(
390
+ event, time_now, include_user_id=False
391
+ ),
392
+ }
393
+ for event in events
394
+ ]
395
+ }
396
+
397
+ @trace_with_opname("sync.encode_joined")
398
+ async def encode_joined(
399
+ self,
400
+ sync_config: SyncConfig,
401
+ rooms: list[JoinedSyncResult],
402
+ time_now: int,
403
+ serialize_options: SerializeEventConfig,
404
+ ) -> JsonDict:
405
+ """
406
+ Encode the joined rooms in a sync result
407
+
408
+ Args:
409
+ sync_config
410
+ rooms: list of sync results for rooms this user is joined to
411
+ time_now: current time - used as a baseline for age calculations
412
+ serialize_options: Event serializer options
413
+ Returns:
414
+ The joined rooms list, in our response format
415
+ """
416
+ joined = {}
417
+ for room in rooms:
418
+ joined[room.room_id] = await self.encode_room(
419
+ sync_config,
420
+ room,
421
+ time_now,
422
+ joined=True,
423
+ serialize_options=serialize_options,
424
+ )
425
+
426
+ return joined
427
+
428
+ @trace_with_opname("sync.encode_invited")
429
+ async def encode_invited(
430
+ self,
431
+ rooms: list[InvitedSyncResult],
432
+ time_now: int,
433
+ serialize_options: SerializeEventConfig,
434
+ ) -> JsonDict:
435
+ """
436
+ Encode the invited rooms in a sync result
437
+
438
+ Args:
439
+ rooms: list of sync results for rooms this user is invited to
440
+ time_now: current time - used as a baseline for age calculations
441
+ serialize_options: Event serializer options
442
+
443
+ Returns:
444
+ The invited rooms list, in our response format
445
+ """
446
+ invited = {}
447
+ for room in rooms:
448
+ invite = await self._event_serializer.serialize_event(
449
+ room.invite, time_now, config=serialize_options
450
+ )
451
+ unsigned = dict(invite.get("unsigned", {}))
452
+ invite["unsigned"] = unsigned
453
+
454
+ invited_state = unsigned.pop("invite_room_state", [])
455
+ if not isinstance(invited_state, list):
456
+ invited_state = []
457
+
458
+ invited_state = list(invited_state)
459
+ invited_state.append(invite)
460
+ invited[room.room_id] = {"invite_state": {"events": invited_state}}
461
+
462
+ return invited
463
+
464
+ @trace_with_opname("sync.encode_knocked")
465
+ async def encode_knocked(
466
+ self,
467
+ rooms: list[KnockedSyncResult],
468
+ time_now: int,
469
+ serialize_options: SerializeEventConfig,
470
+ ) -> dict[str, dict[str, Any]]:
471
+ """
472
+ Encode the rooms we've knocked on in a sync result.
473
+
474
+ Args:
475
+ rooms: list of sync results for rooms this user is knocking on
476
+ time_now: current time - used as a baseline for age calculations
477
+ serialize_options: Event serializer options
478
+
479
+ Returns:
480
+ The list of rooms the user has knocked on, in our response format.
481
+ """
482
+ knocked = {}
483
+ for room in rooms:
484
+ knock = await self._event_serializer.serialize_event(
485
+ room.knock, time_now, config=serialize_options
486
+ )
487
+
488
+ # Extract the `unsigned` key from the knock event.
489
+ # This is where we (cheekily) store the knock state events
490
+ unsigned = knock.setdefault("unsigned", {})
491
+
492
+ # Duplicate the dictionary in order to avoid modifying the original
493
+ unsigned = dict(unsigned)
494
+
495
+ # Extract the stripped room state from the unsigned dict
496
+ # This is for clients to get a little bit of information about
497
+ # the room they've knocked on, without revealing any sensitive information
498
+ knocked_state = unsigned.pop("knock_room_state", [])
499
+ if not isinstance(knocked_state, list):
500
+ knocked_state = []
501
+ knocked_state = list(knocked_state)
502
+
503
+ # Append the actual knock membership event itself as well. This provides
504
+ # the client with:
505
+ #
506
+ # * A knock state event that they can use for easier internal tracking
507
+ # * The rough timestamp of when the knock occurred contained within the event
508
+ knocked_state.append(knock)
509
+
510
+ # Build the `knock_state` dictionary, which will contain the state of the
511
+ # room that the client has knocked on
512
+ knocked[room.room_id] = {"knock_state": {"events": knocked_state}}
513
+
514
+ return knocked
515
+
516
+ @trace_with_opname("sync.encode_archived")
517
+ async def encode_archived(
518
+ self,
519
+ sync_config: SyncConfig,
520
+ rooms: list[ArchivedSyncResult],
521
+ time_now: int,
522
+ serialize_options: SerializeEventConfig,
523
+ ) -> JsonDict:
524
+ """
525
+ Encode the archived rooms in a sync result
526
+
527
+ Args:
528
+ sync_config
529
+ rooms: list of sync results for rooms this user is joined to
530
+ time_now: current time - used as a baseline for age calculations
531
+ serialize_options: Event serializer options
532
+ Returns:
533
+ The archived rooms list, in our response format
534
+ """
535
+ joined = {}
536
+ for room in rooms:
537
+ joined[room.room_id] = await self.encode_room(
538
+ sync_config,
539
+ room,
540
+ time_now,
541
+ joined=False,
542
+ serialize_options=serialize_options,
543
+ )
544
+
545
+ return joined
546
+
547
+ async def encode_room(
548
+ self,
549
+ sync_config: SyncConfig,
550
+ room: Union[JoinedSyncResult, ArchivedSyncResult],
551
+ time_now: int,
552
+ joined: bool,
553
+ serialize_options: SerializeEventConfig,
554
+ ) -> JsonDict:
555
+ """
556
+ Args:
557
+ sync_config
558
+ room: sync result for a single room
559
+ time_now: current time - used as a baseline for age calculations
560
+ token_id: ID of the user's auth token - used for namespacing
561
+ of transaction IDs
562
+ joined: True if the user is joined to this room - will mean
563
+ we handle ephemeral events
564
+ only_fields: Optional. The list of event fields to include.
565
+ event_formatter: function to convert from federation format
566
+ to client format
567
+ Returns:
568
+ The room, encoded in our response format
569
+ """
570
+ state_dict = room.state
571
+ timeline_events = room.timeline.events
572
+
573
+ state_events = state_dict.values()
574
+
575
+ for event in itertools.chain(state_events, timeline_events):
576
+ # We've had bug reports that events were coming down under the
577
+ # wrong room.
578
+ if event.room_id != room.room_id:
579
+ logger.warning(
580
+ "Event %r is under room %r instead of %r",
581
+ event.event_id,
582
+ room.room_id,
583
+ event.room_id,
584
+ )
585
+
586
+ serialized_state = await self._event_serializer.serialize_events(
587
+ state_events, time_now, config=serialize_options
588
+ )
589
+ serialized_timeline = await self._event_serializer.serialize_events(
590
+ timeline_events,
591
+ time_now,
592
+ config=serialize_options,
593
+ bundle_aggregations=room.timeline.bundled_aggregations,
594
+ )
595
+
596
+ account_data = room.account_data
597
+
598
+ # We either include a `state` or `state_after` field depending on
599
+ # whether the client has opted in to the newer `state_after` behavior.
600
+ if sync_config.use_state_after:
601
+ state_key_name = "org.matrix.msc4222.state_after"
602
+ else:
603
+ state_key_name = "state"
604
+
605
+ result: JsonDict = {
606
+ "timeline": {
607
+ "events": serialized_timeline,
608
+ "prev_batch": await room.timeline.prev_batch.to_string(self.store),
609
+ "limited": room.timeline.limited,
610
+ },
611
+ state_key_name: {"events": serialized_state},
612
+ "account_data": {"events": account_data},
613
+ }
614
+
615
+ if joined:
616
+ assert isinstance(room, JoinedSyncResult)
617
+ ephemeral_events = room.ephemeral
618
+ result["ephemeral"] = {"events": ephemeral_events}
619
+ result["unread_notifications"] = room.unread_notifications
620
+ if room.unread_thread_notifications:
621
+ result["unread_thread_notifications"] = room.unread_thread_notifications
622
+ if self._msc3773_enabled:
623
+ result["org.matrix.msc3773.unread_thread_notifications"] = (
624
+ room.unread_thread_notifications
625
+ )
626
+ result["summary"] = room.summary
627
+ if self._msc2654_enabled:
628
+ result["org.matrix.msc2654.unread_count"] = room.unread_count
629
+
630
+ return result
631
+
632
+
633
+ class SlidingSyncRestServlet(RestServlet):
634
+ """
635
+ API endpoint for MSC4186 Simplified Sliding Sync `/sync`, which was historically derived
636
+ from MSC3575 (Sliding Sync; now abandoned). Allows for clients to request a
637
+ subset (sliding window) of rooms, state, and timeline events (just what they need)
638
+ in order to bootstrap quickly and subscribe to only what the client cares about.
639
+ Because the client can specify what it cares about, we can respond quickly and skip
640
+ all of the work we would normally have to do with a sync v2 response.
641
+
642
+ Extensions of various features are defined in:
643
+ - to-device messaging (MSC3885)
644
+ - end-to-end encryption (MSC3884)
645
+ - typing notifications (MSC3961)
646
+ - receipts (MSC3960)
647
+ - account data (MSC3959)
648
+ - thread subscriptions (MSC4308)
649
+
650
+ Request query parameters:
651
+ timeout: How long to wait for new events in milliseconds.
652
+ pos: Stream position token when asking for incremental deltas.
653
+
654
+ Request body::
655
+ {
656
+ // Sliding Window API
657
+ "lists": {
658
+ "foo-list": {
659
+ "ranges": [ [0, 99] ],
660
+ "required_state": [
661
+ ["m.room.join_rules", ""],
662
+ ["m.room.history_visibility", ""],
663
+ ["m.space.child", "*"]
664
+ ],
665
+ "timeline_limit": 10,
666
+ "filters": {
667
+ "is_dm": true
668
+ },
669
+ }
670
+ },
671
+ // Room Subscriptions API
672
+ "room_subscriptions": {
673
+ "!sub1:bar": {
674
+ "required_state": [ ["*","*"] ],
675
+ "timeline_limit": 10,
676
+ }
677
+ },
678
+ // Extensions API
679
+ "extensions": {}
680
+ }
681
+
682
+ Response JSON::
683
+ {
684
+ "pos": "s58_224_0_13_10_1_1_16_0_1",
685
+ "lists": {
686
+ "foo-list": {
687
+ "count": 1337,
688
+ "ops": [{
689
+ "op": "SYNC",
690
+ "range": [0, 99],
691
+ "room_ids": [
692
+ "!foo:bar",
693
+ // ... 99 more room IDs
694
+ ]
695
+ }]
696
+ }
697
+ },
698
+ // Aggregated rooms from lists and room subscriptions
699
+ "rooms": {
700
+ // Room from room subscription
701
+ "!sub1:bar": {
702
+ "name": "Alice and Bob",
703
+ "avatar": "mxc://...",
704
+ "initial": true,
705
+ "required_state": [
706
+ {"sender":"@alice:example.com","type":"m.room.create", "state_key":"", "content":{"creator":"@alice:example.com"}},
707
+ {"sender":"@alice:example.com","type":"m.room.join_rules", "state_key":"", "content":{"join_rule":"invite"}},
708
+ {"sender":"@alice:example.com","type":"m.room.history_visibility", "state_key":"", "content":{"history_visibility":"joined"}},
709
+ {"sender":"@alice:example.com","type":"m.room.member", "state_key":"@alice:example.com", "content":{"membership":"join"}}
710
+ ],
711
+ "timeline": [
712
+ {"sender":"@alice:example.com","type":"m.room.create", "state_key":"", "content":{"creator":"@alice:example.com"}},
713
+ {"sender":"@alice:example.com","type":"m.room.join_rules", "state_key":"", "content":{"join_rule":"invite"}},
714
+ {"sender":"@alice:example.com","type":"m.room.history_visibility", "state_key":"", "content":{"history_visibility":"joined"}},
715
+ {"sender":"@alice:example.com","type":"m.room.member", "state_key":"@alice:example.com", "content":{"membership":"join"}},
716
+ {"sender":"@alice:example.com","type":"m.room.message", "content":{"body":"A"}},
717
+ {"sender":"@alice:example.com","type":"m.room.message", "content":{"body":"B"}},
718
+ ],
719
+ "prev_batch": "t111_222_333",
720
+ "joined_count": 41,
721
+ "invited_count": 1,
722
+ "notification_count": 1,
723
+ "highlight_count": 0,
724
+ "num_live": 2"
725
+ },
726
+ // rooms from list
727
+ "!foo:bar": {
728
+ "name": "The calculated room name",
729
+ "avatar": "mxc://...",
730
+ "initial": true,
731
+ "required_state": [
732
+ {"sender":"@alice:example.com","type":"m.room.join_rules", "state_key":"", "content":{"join_rule":"invite"}},
733
+ {"sender":"@alice:example.com","type":"m.room.history_visibility", "state_key":"", "content":{"history_visibility":"joined"}},
734
+ {"sender":"@alice:example.com","type":"m.space.child", "state_key":"!foo:example.com", "content":{"via":["example.com"]}},
735
+ {"sender":"@alice:example.com","type":"m.space.child", "state_key":"!bar:example.com", "content":{"via":["example.com"]}},
736
+ {"sender":"@alice:example.com","type":"m.space.child", "state_key":"!baz:example.com", "content":{"via":["example.com"]}}
737
+ ],
738
+ "timeline": [
739
+ {"sender":"@alice:example.com","type":"m.room.join_rules", "state_key":"", "content":{"join_rule":"invite"}},
740
+ {"sender":"@alice:example.com","type":"m.room.message", "content":{"body":"A"}},
741
+ {"sender":"@alice:example.com","type":"m.room.message", "content":{"body":"B"}},
742
+ {"sender":"@alice:example.com","type":"m.room.message", "content":{"body":"C"}},
743
+ {"sender":"@alice:example.com","type":"m.room.message", "content":{"body":"D"}},
744
+ ],
745
+ "prev_batch": "t111_222_333",
746
+ "joined_count": 4,
747
+ "invited_count": 0,
748
+ "notification_count": 54,
749
+ "highlight_count": 3,
750
+ "num_live": 1,
751
+ },
752
+ // ... 99 more items
753
+ },
754
+ "extensions": {}
755
+ }
756
+ """
757
+
758
+ PATTERNS = client_patterns(
759
+ "/org.matrix.simplified_msc3575/sync$", releases=[], v1=False, unstable=True
760
+ )
761
+
762
+ def __init__(self, hs: "HomeServer"):
763
+ super().__init__()
764
+ self.auth = hs.get_auth()
765
+ self.store = hs.get_datastores().main
766
+ self.clock = hs.get_clock()
767
+ self.filtering = hs.get_filtering()
768
+ self.sliding_sync_handler = hs.get_sliding_sync_handler()
769
+ self.event_serializer = hs.get_event_client_serializer()
770
+
771
+ async def on_POST(self, request: SynapseRequest) -> tuple[int, JsonDict]:
772
+ requester = await self.auth.get_user_by_req_experimental_feature(
773
+ request, allow_guest=True, feature=ExperimentalFeature.MSC3575
774
+ )
775
+
776
+ user = requester.user
777
+
778
+ timeout = parse_integer(request, "timeout", default=0)
779
+ # Position in the stream
780
+ from_token_string = parse_string(request, "pos")
781
+
782
+ from_token = None
783
+ if from_token_string is not None:
784
+ from_token = await SlidingSyncStreamToken.from_string(
785
+ self.store, from_token_string
786
+ )
787
+
788
+ # TODO: We currently don't know whether we're going to use sticky params or
789
+ # maybe some filters like sync v2 where they are built up once and referenced
790
+ # by filter ID. For now, we will just prototype with always passing everything
791
+ # in.
792
+ body = parse_and_validate_json_object_from_request(request, SlidingSyncBody)
793
+
794
+ # Tag and log useful data to differentiate requests.
795
+ set_tag(
796
+ "sliding_sync.sync_type", "initial" if from_token is None else "incremental"
797
+ )
798
+ set_tag("sliding_sync.conn_id", body.conn_id or "")
799
+ log_kv(
800
+ {
801
+ "sliding_sync.lists": {
802
+ list_name: {
803
+ "ranges": list_config.ranges,
804
+ "timeline_limit": list_config.timeline_limit,
805
+ }
806
+ for list_name, list_config in (body.lists or {}).items()
807
+ },
808
+ "sliding_sync.room_subscriptions": list(
809
+ (body.room_subscriptions or {}).keys()
810
+ ),
811
+ # We also include the number of room subscriptions because logs are
812
+ # limited to 1024 characters and the large room ID list above can be cut
813
+ # off.
814
+ "sliding_sync.num_room_subscriptions": len(
815
+ (body.room_subscriptions or {}).keys()
816
+ ),
817
+ }
818
+ )
819
+
820
+ sync_config = SlidingSyncConfig(
821
+ user=user,
822
+ requester=requester,
823
+ # FIXME: Currently, we're just manually copying the fields from the
824
+ # `SlidingSyncBody` into the config. How can we guarantee into the future
825
+ # that we don't forget any? I would like something more structured like
826
+ # `copy_attributes(from=body, to=config)`
827
+ conn_id=body.conn_id,
828
+ lists=body.lists,
829
+ room_subscriptions=body.room_subscriptions,
830
+ extensions=body.extensions,
831
+ )
832
+
833
+ (
834
+ sliding_sync_results,
835
+ did_wait,
836
+ ) = await self.sliding_sync_handler.wait_for_sync_for_user(
837
+ requester,
838
+ sync_config,
839
+ from_token,
840
+ timeout,
841
+ )
842
+ # Knowing whether we waited is useful in traces to filter out long-running
843
+ # requests where we were just waiting.
844
+ set_tag("sliding_sync.did_wait", str(did_wait))
845
+
846
+ # The client may have disconnected by now; don't bother to serialize the
847
+ # response if so.
848
+ if request._disconnected:
849
+ logger.info("Client has disconnected; not serializing response.")
850
+ return 200, {}
851
+
852
+ response_content = await self.encode_response(requester, sliding_sync_results)
853
+
854
+ return 200, response_content
855
+
856
+ @trace_with_opname("sliding_sync.encode_response")
857
+ async def encode_response(
858
+ self,
859
+ requester: Requester,
860
+ sliding_sync_result: SlidingSyncResult,
861
+ ) -> JsonDict:
862
+ response: JsonDict = defaultdict(dict)
863
+
864
+ response["pos"] = await sliding_sync_result.next_pos.to_string(self.store)
865
+ serialized_lists = self.encode_lists(sliding_sync_result.lists)
866
+ if serialized_lists:
867
+ response["lists"] = serialized_lists
868
+ response["rooms"] = await self.encode_rooms(
869
+ requester, sliding_sync_result.rooms
870
+ )
871
+ response["extensions"] = await self.encode_extensions(
872
+ requester, sliding_sync_result.extensions
873
+ )
874
+
875
+ return response
876
+
877
+ @trace_with_opname("sliding_sync.encode_lists")
878
+ def encode_lists(
879
+ self, lists: Mapping[str, SlidingSyncResult.SlidingWindowList]
880
+ ) -> JsonDict:
881
+ def encode_operation(
882
+ operation: SlidingSyncResult.SlidingWindowList.Operation,
883
+ ) -> JsonDict:
884
+ return {
885
+ "op": operation.op.value,
886
+ "range": operation.range,
887
+ "room_ids": operation.room_ids,
888
+ }
889
+
890
+ serialized_lists = {}
891
+ for list_key, list_result in lists.items():
892
+ serialized_lists[list_key] = {
893
+ "count": list_result.count,
894
+ "ops": [encode_operation(op) for op in list_result.ops],
895
+ }
896
+
897
+ return serialized_lists
898
+
899
+ @trace_with_opname("sliding_sync.encode_rooms")
900
+ async def encode_rooms(
901
+ self,
902
+ requester: Requester,
903
+ rooms: dict[str, SlidingSyncResult.RoomResult],
904
+ ) -> JsonDict:
905
+ time_now = self.clock.time_msec()
906
+
907
+ serialize_options = SerializeEventConfig(
908
+ event_format=format_event_for_client_v2_without_room_id,
909
+ requester=requester,
910
+ )
911
+
912
+ serialized_rooms: dict[str, JsonDict] = {}
913
+ for room_id, room_result in rooms.items():
914
+ serialized_rooms[room_id] = {
915
+ "notification_count": room_result.notification_count,
916
+ "highlight_count": room_result.highlight_count,
917
+ }
918
+
919
+ if room_result.bump_stamp is not None:
920
+ serialized_rooms[room_id]["bump_stamp"] = room_result.bump_stamp
921
+
922
+ if room_result.joined_count is not None:
923
+ serialized_rooms[room_id]["joined_count"] = room_result.joined_count
924
+
925
+ if room_result.invited_count is not None:
926
+ serialized_rooms[room_id]["invited_count"] = room_result.invited_count
927
+
928
+ if room_result.name:
929
+ serialized_rooms[room_id]["name"] = room_result.name
930
+
931
+ if room_result.avatar:
932
+ serialized_rooms[room_id]["avatar"] = room_result.avatar
933
+
934
+ if room_result.heroes is not None and len(room_result.heroes) > 0:
935
+ serialized_heroes = []
936
+ for hero in room_result.heroes:
937
+ serialized_hero = {
938
+ "user_id": hero.user_id,
939
+ }
940
+ if hero.display_name is not None:
941
+ # Not a typo, just how "displayname" is spelled in the spec
942
+ serialized_hero["displayname"] = hero.display_name
943
+
944
+ if hero.avatar_url is not None:
945
+ serialized_hero["avatar_url"] = hero.avatar_url
946
+
947
+ serialized_heroes.append(serialized_hero)
948
+ serialized_rooms[room_id]["heroes"] = serialized_heroes
949
+
950
+ # We should only include the `initial` key if it's `True` to save bandwidth.
951
+ # The absence of this flag means `False`.
952
+ if room_result.initial:
953
+ serialized_rooms[room_id]["initial"] = room_result.initial
954
+
955
+ if room_result.unstable_expanded_timeline:
956
+ serialized_rooms[room_id]["unstable_expanded_timeline"] = (
957
+ room_result.unstable_expanded_timeline
958
+ )
959
+
960
+ # This will be omitted for invite/knock rooms with `stripped_state`
961
+ if (
962
+ room_result.required_state is not None
963
+ and len(room_result.required_state) > 0
964
+ ):
965
+ serialized_required_state = (
966
+ await self.event_serializer.serialize_events(
967
+ room_result.required_state,
968
+ time_now,
969
+ config=serialize_options,
970
+ )
971
+ )
972
+ serialized_rooms[room_id]["required_state"] = serialized_required_state
973
+
974
+ # This will be omitted for invite/knock rooms with `stripped_state`
975
+ if (
976
+ room_result.timeline_events is not None
977
+ and len(room_result.timeline_events) > 0
978
+ ):
979
+ serialized_timeline = await self.event_serializer.serialize_events(
980
+ room_result.timeline_events,
981
+ time_now,
982
+ config=serialize_options,
983
+ bundle_aggregations=room_result.bundled_aggregations,
984
+ )
985
+ serialized_rooms[room_id]["timeline"] = serialized_timeline
986
+
987
+ # This will be omitted for invite/knock rooms with `stripped_state`
988
+ if room_result.limited is not None:
989
+ serialized_rooms[room_id]["limited"] = room_result.limited
990
+
991
+ # This will be omitted for invite/knock rooms with `stripped_state`
992
+ if room_result.prev_batch is not None:
993
+ serialized_rooms[room_id][
994
+ "prev_batch"
995
+ ] = await room_result.prev_batch.to_string(self.store)
996
+
997
+ # This will be omitted for invite/knock rooms with `stripped_state`
998
+ if room_result.num_live is not None:
999
+ serialized_rooms[room_id]["num_live"] = room_result.num_live
1000
+
1001
+ # Field should be absent on non-DM rooms
1002
+ if room_result.is_dm:
1003
+ serialized_rooms[room_id]["is_dm"] = room_result.is_dm
1004
+
1005
+ # Stripped state only applies to invite/knock rooms
1006
+ if (
1007
+ room_result.stripped_state is not None
1008
+ and len(room_result.stripped_state) > 0
1009
+ ):
1010
+ # TODO: `knocked_state` but that isn't specced yet.
1011
+ #
1012
+ # TODO: Instead of adding `knocked_state`, it would be good to rename
1013
+ # this to `stripped_state` so it can be shared between invite and knock
1014
+ # rooms, see
1015
+ # https://github.com/matrix-org/matrix-spec-proposals/pull/3575#discussion_r1117629919
1016
+ serialized_rooms[room_id]["invite_state"] = room_result.stripped_state
1017
+
1018
+ return serialized_rooms
1019
+
1020
+ @trace_with_opname("sliding_sync.encode_extensions")
1021
+ async def encode_extensions(
1022
+ self, requester: Requester, extensions: SlidingSyncResult.Extensions
1023
+ ) -> JsonDict:
1024
+ serialized_extensions: JsonDict = {}
1025
+
1026
+ if extensions.to_device is not None:
1027
+ serialized_extensions["to_device"] = {
1028
+ "next_batch": extensions.to_device.next_batch,
1029
+ "events": extensions.to_device.events,
1030
+ }
1031
+
1032
+ if extensions.e2ee is not None:
1033
+ serialized_extensions["e2ee"] = {
1034
+ # We always include this because
1035
+ # https://github.com/vector-im/element-android/issues/3725. The spec
1036
+ # isn't terribly clear on when this can be omitted and how a client
1037
+ # would tell the difference between "no keys present" and "nothing
1038
+ # changed" in terms of whole field absent / individual key type entry
1039
+ # absent Corresponding synapse issue:
1040
+ # https://github.com/matrix-org/synapse/issues/10456
1041
+ "device_one_time_keys_count": extensions.e2ee.device_one_time_keys_count,
1042
+ # https://github.com/matrix-org/matrix-doc/blob/54255851f642f84a4f1aaf7bc063eebe3d76752b/proposals/2732-olm-fallback-keys.md
1043
+ # states that this field should always be included, as long as the
1044
+ # server supports the feature.
1045
+ "device_unused_fallback_key_types": extensions.e2ee.device_unused_fallback_key_types,
1046
+ }
1047
+
1048
+ if extensions.e2ee.device_list_updates is not None:
1049
+ serialized_extensions["e2ee"]["device_lists"] = {}
1050
+
1051
+ serialized_extensions["e2ee"]["device_lists"]["changed"] = list(
1052
+ extensions.e2ee.device_list_updates.changed
1053
+ )
1054
+ serialized_extensions["e2ee"]["device_lists"]["left"] = list(
1055
+ extensions.e2ee.device_list_updates.left
1056
+ )
1057
+
1058
+ if extensions.account_data is not None:
1059
+ serialized_extensions["account_data"] = {
1060
+ # Same as the the top-level `account_data.events` field in Sync v2.
1061
+ "global": [
1062
+ {"type": account_data_type, "content": content}
1063
+ for account_data_type, content in extensions.account_data.global_account_data_map.items()
1064
+ ],
1065
+ # Same as the joined room's account_data field in Sync v2, e.g the path
1066
+ # `rooms.join["!foo:bar"].account_data.events`.
1067
+ "rooms": {
1068
+ room_id: [
1069
+ {"type": account_data_type, "content": content}
1070
+ for account_data_type, content in event_map.items()
1071
+ ]
1072
+ for room_id, event_map in extensions.account_data.account_data_by_room_map.items()
1073
+ },
1074
+ }
1075
+
1076
+ if extensions.receipts is not None:
1077
+ serialized_extensions["receipts"] = {
1078
+ "rooms": extensions.receipts.room_id_to_receipt_map,
1079
+ }
1080
+
1081
+ if extensions.typing is not None:
1082
+ serialized_extensions["typing"] = {
1083
+ "rooms": extensions.typing.room_id_to_typing_map,
1084
+ }
1085
+
1086
+ # excludes both None and falsy `thread_subscriptions`
1087
+ if extensions.thread_subscriptions:
1088
+ serialized_extensions["io.element.msc4308.thread_subscriptions"] = (
1089
+ _serialise_thread_subscriptions(extensions.thread_subscriptions)
1090
+ )
1091
+
1092
+ return serialized_extensions
1093
+
1094
+
1095
+ def _serialise_thread_subscriptions(
1096
+ thread_subscriptions: SlidingSyncResult.Extensions.ThreadSubscriptionsExtension,
1097
+ ) -> JsonDict:
1098
+ out: JsonDict = {}
1099
+
1100
+ if thread_subscriptions.subscribed:
1101
+ out["subscribed"] = {
1102
+ room_id: {
1103
+ thread_root_id: attr.asdict(
1104
+ change, filter=lambda _attr, v: v is not None
1105
+ )
1106
+ for thread_root_id, change in room_threads.items()
1107
+ }
1108
+ for room_id, room_threads in thread_subscriptions.subscribed.items()
1109
+ }
1110
+
1111
+ if thread_subscriptions.unsubscribed:
1112
+ out["unsubscribed"] = {
1113
+ room_id: {
1114
+ thread_root_id: attr.asdict(
1115
+ change, filter=lambda _attr, v: v is not None
1116
+ )
1117
+ for thread_root_id, change in room_threads.items()
1118
+ }
1119
+ for room_id, room_threads in thread_subscriptions.unsubscribed.items()
1120
+ }
1121
+
1122
+ if thread_subscriptions.prev_batch:
1123
+ out["prev_batch"] = thread_subscriptions.prev_batch.to_string()
1124
+
1125
+ return out
1126
+
1127
+
1128
+ def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
1129
+ SyncRestServlet(hs).register(http_server)
1130
+
1131
+ SlidingSyncRestServlet(hs).register(http_server)