Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • opentalk/controller
1 result
Show changes
Commits on Source (17)
Showing
with 1928 additions and 636 deletions
...@@ -5,6 +5,40 @@ All notable changes to this project will be documented in this file. ...@@ -5,6 +5,40 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.29.1] - 2025-03-27
[0.29.1]: https://git.opentalk.dev/opentalk/backend/services/controller/-/compare/v0.29.0...v0.29.1
### 🚀 New features
- (training_participation_report) Add configuration to api ([#972](https://git.opentalk.dev/opentalk/backend/services/controller/-/issues/972))
- (training_participation_report) Communicate parameters to frontend on join ([#972](https://git.opentalk.dev/opentalk/backend/services/controller/-/issues/972))
- (training_participation_report) Start training participation report procedure automatically ([#972](https://git.opentalk.dev/opentalk/backend/services/controller/-/issues/972))
### 🐛 Bug fixes
- Address cargo-deny remarks ([!1480](https://git.opentalk.dev/opentalk/backend/services/controller/-/merge_requests/1480))
- (timer) Cleanup on room destroy ([#975](https://git.opentalk.dev/opentalk/backend/services/controller/-/issues/975))
- Exclude moderators from microphone restrictions ([#978](https://git.opentalk.dev/opentalk/backend/services/controller/-/issues/978))
- (event) Handle missing participation report parameter set correctly ([#979](https://git.opentalk.dev/opentalk/backend/services/controller/-/issues/979))
- (meeting_report) Include users who already left the meeting ([#981](https://git.opentalk.dev/opentalk/backend/services/controller/-/issues/981))
- (training-participation-report) Don't fail when updating the database entry ([#982](https://git.opentalk.dev/opentalk/backend/services/controller/-/issues/982))
- (training-participation-report) Parameter set not stored for unscheduled events ([!1507](https://git.opentalk.dev/opentalk/backend/services/controller/-/merge_requests/1507), [#987](https://git.opentalk.dev/opentalk/backend/services/controller/-/issues/987))
### 📦 Dependencies
- (deps) Update ring to 0.17.13 ([!1478](https://git.opentalk.dev/opentalk/backend/services/controller/-/merge_requests/1478))
- (deps) Update rust crate rand to 0.9 ([!1418](https://git.opentalk.dev/opentalk/backend/services/controller/-/merge_requests/1418))
- (deps) Update rust crate zip to 2.4.2 ([!1490](https://git.opentalk.dev/opentalk/backend/services/controller/-/merge_requests/1490))
### ⚙ Miscellaneous
- (justfile) Add commit release script ([!1322](https://git.opentalk.dev/opentalk/backend/services/controller/-/merge_requests/1322))
### Test
- Use ChaCha12Rng instead of StdRng for reproducibility ([!1480](https://git.opentalk.dev/opentalk/backend/services/controller/-/merge_requests/1480))
## [0.29.0] - 2025-03-05 ## [0.29.0] - 2025-03-05
[0.29.0]: https://git.opentalk.dev/opentalk/backend/services/controller/-/compare/v0.28.4...v0.29.0 [0.29.0]: https://git.opentalk.dev/opentalk/backend/services/controller/-/compare/v0.28.4...v0.29.0
......
...@@ -11,7 +11,7 @@ dependencies = [ ...@@ -11,7 +11,7 @@ dependencies = [
"actix-macros", "actix-macros",
"actix-rt", "actix-rt",
"actix_derive", "actix_derive",
"bitflags 2.8.0", "bitflags 2.9.0",
"bytes", "bytes",
"crossbeam-channel", "crossbeam-channel",
"futures-core", "futures-core",
...@@ -33,7 +33,7 @@ version = "0.5.2" ...@@ -33,7 +33,7 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"bytes", "bytes",
"futures-core", "futures-core",
"futures-sink", "futures-sink",
...@@ -46,13 +46,13 @@ dependencies = [ ...@@ -46,13 +46,13 @@ dependencies = [
[[package]] [[package]]
name = "actix-cors" name = "actix-cors"
version = "0.7.0" version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9e772b3bcafe335042b5db010ab7c09013dad6eac4915c91d8d50902769f331" checksum = "daa239b93927be1ff123eebada5a3ff23e89f0124ccb8609234e5103d5a5ae6d"
dependencies = [ dependencies = [
"actix-utils", "actix-utils",
"actix-web", "actix-web",
"derive_more 0.99.19", "derive_more 2.0.1",
"futures-util", "futures-util",
"log", "log",
"once_cell", "once_cell",
...@@ -61,24 +61,24 @@ dependencies = [ ...@@ -61,24 +61,24 @@ dependencies = [
[[package]] [[package]]
name = "actix-http" name = "actix-http"
version = "3.9.0" version = "3.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" checksum = "0fa882656b67966045e4152c634051e70346939fced7117d5f0b52146a7c74c9"
dependencies = [ dependencies = [
"actix-codec", "actix-codec",
"actix-rt", "actix-rt",
"actix-service", "actix-service",
"actix-tls", "actix-tls",
"actix-utils", "actix-utils",
"ahash 0.8.11",
"base64 0.22.1", "base64 0.22.1",
"bitflags 2.8.0", "bitflags 2.9.0",
"brotli", "brotli",
"bytes", "bytes",
"bytestring", "bytestring",
"derive_more 0.99.19", "derive_more 2.0.1",
"encoding_rs", "encoding_rs",
"flate2", "flate2",
"foldhash",
"futures-core", "futures-core",
"h2 0.3.26", "h2 0.3.26",
"http 0.2.12", "http 0.2.12",
...@@ -90,7 +90,7 @@ dependencies = [ ...@@ -90,7 +90,7 @@ dependencies = [
"mime", "mime",
"percent-encoding", "percent-encoding",
"pin-project-lite", "pin-project-lite",
"rand 0.8.5", "rand 0.9.0",
"sha1", "sha1",
"smallvec", "smallvec",
"tokio", "tokio",
...@@ -137,9 +137,9 @@ dependencies = [ ...@@ -137,9 +137,9 @@ dependencies = [
[[package]] [[package]]
name = "actix-server" name = "actix-server"
version = "2.5.0" version = "2.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ca2549781d8dd6d75c40cf6b6051260a2cc2f3c62343d761a969a0640646894" checksum = "6398974fd4284f4768af07965701efbbb5fdc0616bff20cade1bb14b77675e24"
dependencies = [ dependencies = [
"actix-rt", "actix-rt",
"actix-service", "actix-service",
...@@ -154,12 +154,11 @@ dependencies = [ ...@@ -154,12 +154,11 @@ dependencies = [
[[package]] [[package]]
name = "actix-service" name = "actix-service"
version = "2.0.2" version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"paste",
"pin-project-lite", "pin-project-lite",
] ]
...@@ -177,7 +176,7 @@ dependencies = [ ...@@ -177,7 +176,7 @@ dependencies = [
"pin-project-lite", "pin-project-lite",
"rustls-pki-types", "rustls-pki-types",
"tokio", "tokio",
"tokio-rustls 0.26.1", "tokio-rustls 0.26.2",
"tokio-util", "tokio-util",
"tracing", "tracing",
] ]
...@@ -194,9 +193,9 @@ dependencies = [ ...@@ -194,9 +193,9 @@ dependencies = [
[[package]] [[package]]
name = "actix-web" name = "actix-web"
version = "4.9.0" version = "4.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38" checksum = "f2e3b15b3dc6c6ed996e4032389e9849d4ab002b1e92fbfe85b5f307d1479b4d"
dependencies = [ dependencies = [
"actix-codec", "actix-codec",
"actix-http", "actix-http",
...@@ -208,13 +207,13 @@ dependencies = [ ...@@ -208,13 +207,13 @@ dependencies = [
"actix-tls", "actix-tls",
"actix-utils", "actix-utils",
"actix-web-codegen", "actix-web-codegen",
"ahash 0.8.11",
"bytes", "bytes",
"bytestring", "bytestring",
"cfg-if", "cfg-if",
"cookie 0.16.2", "cookie 0.16.2",
"derive_more 0.99.19", "derive_more 2.0.1",
"encoding_rs", "encoding_rs",
"foldhash",
"futures-core", "futures-core",
"futures-util", "futures-util",
"impl-more", "impl-more",
...@@ -232,6 +231,7 @@ dependencies = [ ...@@ -232,6 +231,7 @@ dependencies = [
"smallvec", "smallvec",
"socket2 0.5.8", "socket2 0.5.8",
"time", "time",
"tracing",
"url", "url",
] ]
...@@ -485,9 +485,9 @@ dependencies = [ ...@@ -485,9 +485,9 @@ dependencies = [
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.95" version = "1.0.97"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f"
[[package]] [[package]]
name = "approx" name = "approx"
...@@ -558,9 +558,9 @@ dependencies = [ ...@@ -558,9 +558,9 @@ dependencies = [
[[package]] [[package]]
name = "async-global-executor" name = "async-global-executor"
version = "2.4.1" version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" checksum = "13f937e26114b93193065fd44f507aa2e9169ad0cdabbb996920b1fe1ddea7ba"
dependencies = [ dependencies = [
"async-channel", "async-channel",
"async-executor", "async-executor",
...@@ -568,14 +568,13 @@ dependencies = [ ...@@ -568,14 +568,13 @@ dependencies = [
"async-lock 3.4.0", "async-lock 3.4.0",
"blocking", "blocking",
"futures-lite 2.6.0", "futures-lite 2.6.0",
"once_cell",
] ]
[[package]] [[package]]
name = "async-global-executor-trait" name = "async-global-executor-trait"
version = "2.1.2" version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80f19936c1a84fb48ceb8899b642d2a72572587d1021cc561bfb24de9f33ee89" checksum = "9af57045d58eeb1f7060e7025a1631cbc6399e0a1d10ad6735b3d0ea7f8346ce"
dependencies = [ dependencies = [
"async-global-executor", "async-global-executor",
"async-trait", "async-trait",
...@@ -683,9 +682,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" ...@@ -683,9 +682,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
[[package]] [[package]]
name = "async-trait" name = "async-trait"
version = "0.1.86" version = "0.1.87"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
...@@ -718,9 +717,9 @@ dependencies = [ ...@@ -718,9 +717,9 @@ dependencies = [
[[package]] [[package]]
name = "aws-lc-rs" name = "aws-lc-rs"
version = "1.12.2" version = "1.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c2b7ddaa2c56a367ad27a094ad8ef4faacf8a617c2575acb2ba88949df999ca" checksum = "5e4e8200b9a4a5801a769d50eeabc05670fec7e959a8cb7a63a93e4e519942ae"
dependencies = [ dependencies = [
"aws-lc-sys", "aws-lc-sys",
"paste", "paste",
...@@ -729,9 +728,9 @@ dependencies = [ ...@@ -729,9 +728,9 @@ dependencies = [
[[package]] [[package]]
name = "aws-lc-sys" name = "aws-lc-sys"
version = "0.25.1" version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54ac4f13dad353b209b34cbec082338202cbc01c8f00336b55c750c13ac91f8f" checksum = "0f9dd2e03ee80ca2822dd6ea431163d2ef259f2066a4d6ccaca6d9dcb386aa43"
dependencies = [ dependencies = [
"bindgen", "bindgen",
"cc", "cc",
...@@ -751,7 +750,7 @@ dependencies = [ ...@@ -751,7 +750,7 @@ dependencies = [
"aws-sigv4", "aws-sigv4",
"aws-smithy-async", "aws-smithy-async",
"aws-smithy-eventstream", "aws-smithy-eventstream",
"aws-smithy-http", "aws-smithy-http 0.60.12",
"aws-smithy-runtime", "aws-smithy-runtime",
"aws-smithy-runtime-api", "aws-smithy-runtime-api",
"aws-smithy-types", "aws-smithy-types",
...@@ -769,9 +768,9 @@ dependencies = [ ...@@ -769,9 +768,9 @@ dependencies = [
[[package]] [[package]]
name = "aws-sdk-s3" name = "aws-sdk-s3"
version = "1.73.0" version = "1.78.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3978e0a211bdc5cddecfd91fb468665a662a27fbdaef39ddf36a2a18fef12cb4" checksum = "3038614b6cf7dd68d9a7b5b39563d04337eb3678d1d4173e356e927b0356158a"
dependencies = [ dependencies = [
"aws-credential-types", "aws-credential-types",
"aws-runtime", "aws-runtime",
...@@ -779,7 +778,7 @@ dependencies = [ ...@@ -779,7 +778,7 @@ dependencies = [
"aws-smithy-async", "aws-smithy-async",
"aws-smithy-checksums", "aws-smithy-checksums",
"aws-smithy-eventstream", "aws-smithy-eventstream",
"aws-smithy-http", "aws-smithy-http 0.61.1",
"aws-smithy-json", "aws-smithy-json",
"aws-smithy-runtime", "aws-smithy-runtime",
"aws-smithy-runtime-api", "aws-smithy-runtime-api",
...@@ -803,13 +802,13 @@ dependencies = [ ...@@ -803,13 +802,13 @@ dependencies = [
[[package]] [[package]]
name = "aws-sigv4" name = "aws-sigv4"
version = "1.2.8" version = "1.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bc5bbd1e4a2648fd8c5982af03935972c24a2f9846b396de661d351ee3ce837" checksum = "9bfe75fad52793ce6dec0dc3d4b1f388f038b5eb866c8d4d7f3a8e21b5ea5051"
dependencies = [ dependencies = [
"aws-credential-types", "aws-credential-types",
"aws-smithy-eventstream", "aws-smithy-eventstream",
"aws-smithy-http", "aws-smithy-http 0.60.12",
"aws-smithy-runtime-api", "aws-smithy-runtime-api",
"aws-smithy-types", "aws-smithy-types",
"bytes", "bytes",
...@@ -832,9 +831,9 @@ dependencies = [ ...@@ -832,9 +831,9 @@ dependencies = [
[[package]] [[package]]
name = "aws-smithy-async" name = "aws-smithy-async"
version = "1.2.4" version = "1.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa59d1327d8b5053c54bf2eaae63bf629ba9e904434d0835a28ed3c0ed0a614e" checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c"
dependencies = [ dependencies = [
"futures-util", "futures-util",
"pin-project-lite", "pin-project-lite",
...@@ -843,11 +842,11 @@ dependencies = [ ...@@ -843,11 +842,11 @@ dependencies = [
[[package]] [[package]]
name = "aws-smithy-checksums" name = "aws-smithy-checksums"
version = "0.62.0" version = "0.63.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2f45a1c384d7a393026bc5f5c177105aa9fa68e4749653b985707ac27d77295" checksum = "b65d21e1ba6f2cdec92044f904356a19f5ad86961acf015741106cdfafd747c0"
dependencies = [ dependencies = [
"aws-smithy-http", "aws-smithy-http 0.62.0",
"aws-smithy-types", "aws-smithy-types",
"bytes", "bytes",
"crc32c", "crc32c",
...@@ -865,9 +864,9 @@ dependencies = [ ...@@ -865,9 +864,9 @@ dependencies = [
[[package]] [[package]]
name = "aws-smithy-eventstream" name = "aws-smithy-eventstream"
version = "0.60.6" version = "0.60.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b18559a41e0c909b77625adf2b8c50de480a8041e5e4a3f5f7d177db70abc5a" checksum = "7c45d3dddac16c5c59d553ece225a88870cf81b7b813c9cc17b78cf4685eac7a"
dependencies = [ dependencies = [
"aws-smithy-types", "aws-smithy-types",
"bytes", "bytes",
...@@ -879,6 +878,26 @@ name = "aws-smithy-http" ...@@ -879,6 +878,26 @@ name = "aws-smithy-http"
version = "0.60.12" version = "0.60.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7809c27ad8da6a6a68c454e651d4962479e81472aa19ae99e59f9aba1f9713cc" checksum = "7809c27ad8da6a6a68c454e651d4962479e81472aa19ae99e59f9aba1f9713cc"
dependencies = [
"aws-smithy-runtime-api",
"aws-smithy-types",
"bytes",
"bytes-utils",
"futures-core",
"http 0.2.12",
"http-body 0.4.6",
"once_cell",
"percent-encoding",
"pin-project-lite",
"pin-utils",
"tracing",
]
[[package]]
name = "aws-smithy-http"
version = "0.61.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6f276f21c7921fe902826618d1423ae5bf74cf8c1b8472aee8434f3dfd31824"
dependencies = [ dependencies = [
"aws-smithy-eventstream", "aws-smithy-eventstream",
"aws-smithy-runtime-api", "aws-smithy-runtime-api",
...@@ -895,47 +914,85 @@ dependencies = [ ...@@ -895,47 +914,85 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "aws-smithy-http"
version = "0.62.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5949124d11e538ca21142d1fba61ab0a2a2c1bc3ed323cdb3e4b878bfb83166"
dependencies = [
"aws-smithy-runtime-api",
"aws-smithy-types",
"bytes",
"bytes-utils",
"futures-core",
"http 0.2.12",
"http 1.2.0",
"http-body 0.4.6",
"once_cell",
"percent-encoding",
"pin-project-lite",
"pin-utils",
"tracing",
]
[[package]]
name = "aws-smithy-http-client"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0497ef5d53065b7cd6a35e9c1654bd1fefeae5c52900d91d1b188b0af0f29324"
dependencies = [
"aws-smithy-async",
"aws-smithy-runtime-api",
"aws-smithy-types",
"h2 0.4.8",
"http 0.2.12",
"http-body 0.4.6",
"hyper 0.14.32",
"hyper-rustls 0.24.2",
"pin-project-lite",
"rustls 0.21.12",
"tokio",
"tracing",
]
[[package]] [[package]]
name = "aws-smithy-json" name = "aws-smithy-json"
version = "0.61.2" version = "0.61.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "623a51127f24c30776c8b374295f2df78d92517386f77ba30773f15a30ce1422" checksum = "92144e45819cae7dc62af23eac5a038a58aa544432d2102609654376a900bd07"
dependencies = [ dependencies = [
"aws-smithy-types", "aws-smithy-types",
] ]
[[package]] [[package]]
name = "aws-smithy-runtime" name = "aws-smithy-runtime"
version = "1.7.8" version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d526a12d9ed61fadefda24abe2e682892ba288c2018bcb38b1b4c111d13f6d92" checksum = "f6328865e36c6fd970094ead6b05efd047d3a80ec5fc3be5e743910da9f2ebf8"
dependencies = [ dependencies = [
"aws-smithy-async", "aws-smithy-async",
"aws-smithy-http", "aws-smithy-http 0.62.0",
"aws-smithy-http-client",
"aws-smithy-runtime-api", "aws-smithy-runtime-api",
"aws-smithy-types", "aws-smithy-types",
"bytes", "bytes",
"fastrand 2.3.0", "fastrand 2.3.0",
"h2 0.3.26",
"http 0.2.12", "http 0.2.12",
"http 1.2.0",
"http-body 0.4.6", "http-body 0.4.6",
"http-body 1.0.1", "http-body 1.0.1",
"httparse",
"hyper 0.14.32",
"hyper-rustls 0.24.2",
"once_cell", "once_cell",
"pin-project-lite", "pin-project-lite",
"pin-utils", "pin-utils",
"rustls 0.21.12",
"tokio", "tokio",
"tracing", "tracing",
] ]
[[package]] [[package]]
name = "aws-smithy-runtime-api" name = "aws-smithy-runtime-api"
version = "1.7.3" version = "1.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92165296a47a812b267b4f41032ff8069ab7ff783696d217f0994a0d7ab585cd" checksum = "3da37cf5d57011cb1753456518ec76e31691f1f474b73934a284eb2a1c76510f"
dependencies = [ dependencies = [
"aws-smithy-async", "aws-smithy-async",
"aws-smithy-types", "aws-smithy-types",
...@@ -950,9 +1007,9 @@ dependencies = [ ...@@ -950,9 +1007,9 @@ dependencies = [
[[package]] [[package]]
name = "aws-smithy-types" name = "aws-smithy-types"
version = "1.2.13" version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7b8a53819e42f10d0821f56da995e1470b199686a1809168db6ca485665f042" checksum = "836155caafba616c0ff9b07944324785de2ab016141c3550bd1c07882f8cee8f"
dependencies = [ dependencies = [
"base64-simd", "base64-simd",
"bytes", "bytes",
...@@ -1052,9 +1109,9 @@ checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" ...@@ -1052,9 +1109,9 @@ checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973"
[[package]] [[package]]
name = "backon" name = "backon"
version = "1.3.0" version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba5289ec98f68f28dd809fd601059e6aa908bb8f6108620930828283d4ee23d7" checksum = "49fef586913a57ff189f25c9b3d034356a5bf6b3fa9a7f067588fe1698ba1f5d"
dependencies = [ dependencies = [
"fastrand 2.3.0", "fastrand 2.3.0",
] ]
...@@ -1122,9 +1179,9 @@ dependencies = [ ...@@ -1122,9 +1179,9 @@ dependencies = [
[[package]] [[package]]
name = "base64ct" name = "base64ct"
version = "1.6.0" version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" checksum = "bb97d56060ee67d285efb8001fec9d2a4c710c32efd2e14b5cbb5ba71930fc2d"
[[package]] [[package]]
name = "biblatex" name = "biblatex"
...@@ -1167,7 +1224,7 @@ version = "0.69.5" ...@@ -1167,7 +1224,7 @@ version = "0.69.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"cexpr", "cexpr",
"clang-sys", "clang-sys",
"itertools 0.11.0", "itertools 0.11.0",
...@@ -1207,9 +1264,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" ...@@ -1207,9 +1264,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "2.8.0" version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
dependencies = [ dependencies = [
"serde", "serde",
] ]
...@@ -1238,9 +1295,9 @@ dependencies = [ ...@@ -1238,9 +1295,9 @@ dependencies = [
[[package]] [[package]]
name = "brotli" name = "brotli"
version = "6.0.0" version = "7.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd"
dependencies = [ dependencies = [
"alloc-no-stdlib", "alloc-no-stdlib",
"alloc-stdlib", "alloc-stdlib",
...@@ -1288,9 +1345,9 @@ checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" ...@@ -1288,9 +1345,9 @@ checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
[[package]] [[package]]
name = "bytemuck" name = "bytemuck"
version = "1.21.0" version = "1.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540"
[[package]] [[package]]
name = "byteorder" name = "byteorder"
...@@ -1306,9 +1363,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" ...@@ -1306,9 +1363,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
[[package]] [[package]]
name = "bytes" name = "bytes"
version = "1.10.0" version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
[[package]] [[package]]
name = "bytes-utils" name = "bytes-utils"
...@@ -1350,16 +1407,16 @@ dependencies = [ ...@@ -1350,16 +1407,16 @@ dependencies = [
[[package]] [[package]]
name = "cargo_metadata" name = "cargo_metadata"
version = "0.19.1" version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8769706aad5d996120af43197bf46ef6ad0fda35216b4505f926a365a232d924" checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba"
dependencies = [ dependencies = [
"camino", "camino",
"cargo-platform", "cargo-platform",
"semver", "semver",
"serde", "serde",
"serde_json", "serde_json",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -1368,10 +1425,10 @@ version = "2.0.9" ...@@ -1368,10 +1425,10 @@ version = "2.0.9"
source = "git+https://github.com/kbalt/casbin-rs.git?rev=fddb52d61385913727e24a5c7337eed489cb0d56#fddb52d61385913727e24a5c7337eed489cb0d56" source = "git+https://github.com/kbalt/casbin-rs.git?rev=fddb52d61385913727e24a5c7337eed489cb0d56#fddb52d61385913727e24a5c7337eed489cb0d56"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"fixedbitset", "fixedbitset 0.4.2",
"once_cell", "once_cell",
"parking_lot", "parking_lot",
"petgraph", "petgraph 0.6.5",
"regex", "regex",
"rhai", "rhai",
"ritelinked", "ritelinked",
...@@ -1380,30 +1437,11 @@ dependencies = [ ...@@ -1380,30 +1437,11 @@ dependencies = [
"tokio", "tokio",
] ]
[[package]]
name = "cbindgen"
version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb"
dependencies = [
"clap",
"heck 0.4.1",
"indexmap 2.7.1",
"log",
"proc-macro2",
"quote",
"serde",
"serde_json",
"syn",
"tempfile",
"toml",
]
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.12" version = "1.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c"
dependencies = [ dependencies = [
"jobserver", "jobserver",
"libc", "libc",
...@@ -1457,9 +1495,9 @@ checksum = "7588475145507237ded760e52bf2f1085495245502033756d28ea72ade0e498b" ...@@ -1457,9 +1495,9 @@ checksum = "7588475145507237ded760e52bf2f1085495245502033756d28ea72ade0e498b"
[[package]] [[package]]
name = "chrono" name = "chrono"
version = "0.4.39" version = "0.4.40"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c"
dependencies = [ dependencies = [
"android-tzdata", "android-tzdata",
"iana-time-zone", "iana-time-zone",
...@@ -1467,7 +1505,7 @@ dependencies = [ ...@@ -1467,7 +1505,7 @@ dependencies = [
"num-traits", "num-traits",
"serde", "serde",
"wasm-bindgen", "wasm-bindgen",
"windows-targets 0.52.6", "windows-link",
] ]
[[package]] [[package]]
...@@ -1573,9 +1611,9 @@ dependencies = [ ...@@ -1573,9 +1611,9 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.5.28" version = "4.5.32"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
"clap_derive", "clap_derive",
...@@ -1583,9 +1621,9 @@ dependencies = [ ...@@ -1583,9 +1621,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.5.27" version = "4.5.32"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
...@@ -1595,9 +1633,9 @@ dependencies = [ ...@@ -1595,9 +1633,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_derive" name = "clap_derive"
version = "4.5.28" version = "4.5.32"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7"
dependencies = [ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro2", "proc-macro2",
...@@ -1619,9 +1657,9 @@ checksum = "cbd0f76e066e64fdc5631e3bb46381254deab9ef1158292f27c8c57e3bf3fe59" ...@@ -1619,9 +1657,9 @@ checksum = "cbd0f76e066e64fdc5631e3bb46381254deab9ef1158292f27c8c57e3bf3fe59"
[[package]] [[package]]
name = "cmake" name = "cmake"
version = "0.1.53" version = "0.1.54"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e24a03c8b52922d68a1589ad61032f2c1aa5a8158d2aa0d93c6e9534944bbad6" checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0"
dependencies = [ dependencies = [
"cc", "cc",
] ]
...@@ -1698,21 +1736,21 @@ dependencies = [ ...@@ -1698,21 +1736,21 @@ dependencies = [
[[package]] [[package]]
name = "config" name = "config"
version = "0.15.7" version = "0.15.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e26695492a475c4a091cfda61446d5ba01aac2e1dfbcd27a12fdd11aa2e32596" checksum = "fb07d21d12f9f0bc5e7c3e97ccc78b2341b9b4a4604eac3ed7c1d0d6e2c3b23e"
dependencies = [ dependencies = [
"pathdiff", "pathdiff",
"serde", "serde",
"toml", "toml",
"winnow 0.7.1", "winnow 0.7.3",
] ]
[[package]] [[package]]
name = "console" name = "console"
version = "0.15.10" version = "0.15.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8"
dependencies = [ dependencies = [
"encode_unicode", "encode_unicode",
"libc", "libc",
...@@ -1877,11 +1915,10 @@ dependencies = [ ...@@ -1877,11 +1915,10 @@ dependencies = [
[[package]] [[package]]
name = "crc64fast-nvme" name = "crc64fast-nvme"
version = "1.1.1" version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5e2ee08013e3f228d6d2394116c4549a6df77708442c62d887d83f68ef2ee37" checksum = "4955638f00a809894c947f85a024020a20815b65a5eea633798ea7924edab2b3"
dependencies = [ dependencies = [
"cbindgen",
"crc", "crc",
] ]
...@@ -1982,9 +2019,9 @@ dependencies = [ ...@@ -1982,9 +2019,9 @@ dependencies = [
[[package]] [[package]]
name = "csv-core" name = "csv-core"
version = "0.1.11" version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
...@@ -2215,12 +2252,12 @@ dependencies = [ ...@@ -2215,12 +2252,12 @@ dependencies = [
[[package]] [[package]]
name = "diesel" name = "diesel"
version = "2.2.7" version = "2.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04001f23ba8843dc315804fa324000376084dfb1c30794ff68dd279e6e5696d5" checksum = "470eb10efc8646313634c99bb1593f402a6434cbd86e266770c6e39219adb86a"
dependencies = [ dependencies = [
"bigdecimal", "bigdecimal",
"bitflags 2.8.0", "bitflags 2.9.0",
"byteorder", "byteorder",
"chrono", "chrono",
"diesel_derives", "diesel_derives",
...@@ -2250,9 +2287,9 @@ dependencies = [ ...@@ -2250,9 +2287,9 @@ dependencies = [
[[package]] [[package]]
name = "diesel_derives" name = "diesel_derives"
version = "2.2.3" version = "2.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7f2c3de51e2ba6bf2a648285696137aaf0f5f487bcbea93972fe8a364e131a4" checksum = "a93958254b70bea63b4187ff73d10180599d9d8d177071b7f91e6da4e0c0ad55"
dependencies = [ dependencies = [
"diesel_table_macro_syntax", "diesel_table_macro_syntax",
"dsl_auto_type", "dsl_auto_type",
...@@ -2320,9 +2357,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" ...@@ -2320,9 +2357,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
[[package]] [[package]]
name = "document-features" name = "document-features"
version = "0.2.10" version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d"
dependencies = [ dependencies = [
"litrs", "litrs",
] ]
...@@ -2355,9 +2392,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" ...@@ -2355,9 +2392,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
[[package]] [[package]]
name = "dyn-clone" name = "dyn-clone"
version = "1.0.18" version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "feeef44e73baff3a26d371801df019877a9866a8c493d315ab00177843314f35" checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005"
[[package]] [[package]]
name = "ecdsa" name = "ecdsa"
...@@ -2420,9 +2457,9 @@ dependencies = [ ...@@ -2420,9 +2457,9 @@ dependencies = [
[[package]] [[package]]
name = "either" name = "either"
version = "1.13.0" version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]] [[package]]
name = "elliptic-curve" name = "elliptic-curve"
...@@ -2453,7 +2490,7 @@ dependencies = [ ...@@ -2453,7 +2490,7 @@ dependencies = [
"base16ct 0.2.0", "base16ct 0.2.0",
"crypto-bigint 0.5.5", "crypto-bigint 0.5.5",
"digest", "digest",
"ff 0.13.0", "ff 0.13.1",
"generic-array", "generic-array",
"group 0.13.0", "group 0.13.0",
"hkdf", "hkdf",
...@@ -2533,22 +2570,22 @@ dependencies = [ ...@@ -2533,22 +2570,22 @@ dependencies = [
[[package]] [[package]]
name = "env_logger" name = "env_logger"
version = "0.11.6" version = "0.11.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" checksum = "c3716d7a920fb4fac5d84e9d4bce8ceb321e9414b4409da61b07b75c1e3d0697"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
"env_filter", "env_filter",
"humantime", "jiff 0.2.4",
"log", "log",
] ]
[[package]] [[package]]
name = "equivalent" name = "equivalent"
version = "1.0.1" version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]] [[package]]
name = "errno" name = "errno"
...@@ -2567,7 +2604,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" ...@@ -2567,7 +2604,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc0452bcc559431b16f472b7ab86e2f9ccd5f3c2da3795afbd6b773665e047fe" checksum = "fc0452bcc559431b16f472b7ab86e2f9ccd5f3c2da3795afbd6b773665e047fe"
dependencies = [ dependencies = [
"http 1.2.0", "http 1.2.0",
"prost 0.13.4", "prost 0.13.5",
"tokio", "tokio",
"tokio-stream", "tokio-stream",
"tonic", "tonic",
...@@ -2697,9 +2734,9 @@ dependencies = [ ...@@ -2697,9 +2734,9 @@ dependencies = [
[[package]] [[package]]
name = "ff" name = "ff"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393"
dependencies = [ dependencies = [
"rand_core 0.6.4", "rand_core 0.6.4",
"subtle", "subtle",
...@@ -2729,11 +2766,17 @@ version = "0.4.2" ...@@ -2729,11 +2766,17 @@ version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
[[package]]
name = "fixedbitset"
version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.0.35" version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc"
dependencies = [ dependencies = [
"crc32fast", "crc32fast",
"miniz_oxide", "miniz_oxide",
...@@ -3028,7 +3071,7 @@ dependencies = [ ...@@ -3028,7 +3071,7 @@ dependencies = [
"parking_lot", "parking_lot",
"signal-hook", "signal-hook",
"smallvec", "smallvec",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3041,7 +3084,7 @@ dependencies = [ ...@@ -3041,7 +3084,7 @@ dependencies = [
"gix-date", "gix-date",
"gix-utils", "gix-utils",
"itoa", "itoa",
"thiserror 2.0.11", "thiserror 2.0.12",
"winnow 0.6.26", "winnow 0.6.26",
] ]
...@@ -3051,7 +3094,7 @@ version = "0.2.14" ...@@ -3051,7 +3094,7 @@ version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1db9765c69502650da68f0804e3dc2b5f8ccc6a2d104ca6c85bc40700d37540" checksum = "b1db9765c69502650da68f0804e3dc2b5f8ccc6a2d104ca6c85bc40700d37540"
dependencies = [ dependencies = [
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3060,7 +3103,7 @@ version = "0.4.11" ...@@ -3060,7 +3103,7 @@ version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b1f1d8764958699dc764e3f727cef280ff4d1bd92c107bbf8acd85b30c1bd6f" checksum = "0b1f1d8764958699dc764e3f727cef280ff4d1bd92c107bbf8acd85b30c1bd6f"
dependencies = [ dependencies = [
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3086,7 +3129,7 @@ dependencies = [ ...@@ -3086,7 +3129,7 @@ dependencies = [
"gix-features", "gix-features",
"gix-hash", "gix-hash",
"memmap2", "memmap2",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3105,7 +3148,7 @@ dependencies = [ ...@@ -3105,7 +3148,7 @@ dependencies = [
"memchr", "memchr",
"once_cell", "once_cell",
"smallvec", "smallvec",
"thiserror 2.0.11", "thiserror 2.0.12",
"unicode-bom", "unicode-bom",
"winnow 0.6.26", "winnow 0.6.26",
] ]
...@@ -3116,11 +3159,11 @@ version = "0.14.11" ...@@ -3116,11 +3159,11 @@ version = "0.14.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11365144ef93082f3403471dbaa94cfe4b5e72743bdb9560719a251d439f4cee" checksum = "11365144ef93082f3403471dbaa94cfe4b5e72743bdb9560719a251d439f4cee"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"bstr", "bstr",
"gix-path", "gix-path",
"libc", "libc",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3131,8 +3174,8 @@ checksum = "c57c477b645ee248b173bb1176b52dd528872f12c50375801a58aaf5ae91113f" ...@@ -3131,8 +3174,8 @@ checksum = "c57c477b645ee248b173bb1176b52dd528872f12c50375801a58aaf5ae91113f"
dependencies = [ dependencies = [
"bstr", "bstr",
"itoa", "itoa",
"jiff", "jiff 0.1.29",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3144,7 +3187,7 @@ dependencies = [ ...@@ -3144,7 +3187,7 @@ dependencies = [
"bstr", "bstr",
"gix-hash", "gix-hash",
"gix-object", "gix-object",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3160,7 +3203,7 @@ dependencies = [ ...@@ -3160,7 +3203,7 @@ dependencies = [
"gix-path", "gix-path",
"gix-ref", "gix-ref",
"gix-sec", "gix-sec",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3178,7 +3221,7 @@ dependencies = [ ...@@ -3178,7 +3221,7 @@ dependencies = [
"once_cell", "once_cell",
"prodash", "prodash",
"sha1_smol", "sha1_smol",
"thiserror 2.0.11", "thiserror 2.0.12",
"walkdir", "walkdir",
] ]
...@@ -3199,7 +3242,7 @@ version = "0.17.1" ...@@ -3199,7 +3242,7 @@ version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aaf69a6bec0a3581567484bf99a4003afcaf6c469fd4214352517ea355cf3435" checksum = "aaf69a6bec0a3581567484bf99a4003afcaf6c469fd4214352517ea355cf3435"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"bstr", "bstr",
"gix-features", "gix-features",
"gix-path", "gix-path",
...@@ -3212,7 +3255,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" ...@@ -3212,7 +3255,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b5eccc17194ed0e67d49285e4853307e4147e95407f91c1c3e4a13ba9f4e4ce" checksum = "0b5eccc17194ed0e67d49285e4853307e4147e95407f91c1c3e4a13ba9f4e4ce"
dependencies = [ dependencies = [
"faster-hex", "faster-hex",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3232,7 +3275,7 @@ version = "0.37.0" ...@@ -3232,7 +3275,7 @@ version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "270645fd20556b64c8ffa1540d921b281e6994413a0ca068596f97e9367a257a" checksum = "270645fd20556b64c8ffa1540d921b281e6994413a0ca068596f97e9367a257a"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"bstr", "bstr",
"filetime", "filetime",
"fnv", "fnv",
...@@ -3251,7 +3294,7 @@ dependencies = [ ...@@ -3251,7 +3294,7 @@ dependencies = [
"memmap2", "memmap2",
"rustix 0.38.44", "rustix 0.38.44",
"smallvec", "smallvec",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3262,7 +3305,7 @@ checksum = "1cd3ab68a452db63d9f3ebdacb10f30dba1fa0d31ac64f4203d395ed1102d940" ...@@ -3262,7 +3305,7 @@ checksum = "1cd3ab68a452db63d9f3ebdacb10f30dba1fa0d31ac64f4203d395ed1102d940"
dependencies = [ dependencies = [
"gix-tempfile", "gix-tempfile",
"gix-utils", "gix-utils",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3282,7 +3325,7 @@ dependencies = [ ...@@ -3282,7 +3325,7 @@ dependencies = [
"gix-validate", "gix-validate",
"itoa", "itoa",
"smallvec", "smallvec",
"thiserror 2.0.11", "thiserror 2.0.12",
"winnow 0.6.26", "winnow 0.6.26",
] ]
...@@ -3304,7 +3347,7 @@ dependencies = [ ...@@ -3304,7 +3347,7 @@ dependencies = [
"gix-quote", "gix-quote",
"parking_lot", "parking_lot",
"tempfile", "tempfile",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3322,7 +3365,7 @@ dependencies = [ ...@@ -3322,7 +3365,7 @@ dependencies = [
"gix-path", "gix-path",
"memmap2", "memmap2",
"smallvec", "smallvec",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3334,7 +3377,7 @@ dependencies = [ ...@@ -3334,7 +3377,7 @@ dependencies = [
"bstr", "bstr",
"faster-hex", "faster-hex",
"gix-trace", "gix-trace",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3347,7 +3390,7 @@ dependencies = [ ...@@ -3347,7 +3390,7 @@ dependencies = [
"gix-trace", "gix-trace",
"home", "home",
"once_cell", "once_cell",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3365,7 +3408,7 @@ dependencies = [ ...@@ -3365,7 +3408,7 @@ dependencies = [
"gix-transport", "gix-transport",
"gix-utils", "gix-utils",
"maybe-async", "maybe-async",
"thiserror 2.0.11", "thiserror 2.0.12",
"winnow 0.6.26", "winnow 0.6.26",
] ]
...@@ -3377,7 +3420,7 @@ checksum = "e49357fccdb0c85c0d3a3292a9f6db32d9b3535959b5471bb9624908f4a066c6" ...@@ -3377,7 +3420,7 @@ checksum = "e49357fccdb0c85c0d3a3292a9f6db32d9b3535959b5471bb9624908f4a066c6"
dependencies = [ dependencies = [
"bstr", "bstr",
"gix-utils", "gix-utils",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3397,7 +3440,7 @@ dependencies = [ ...@@ -3397,7 +3440,7 @@ dependencies = [
"gix-utils", "gix-utils",
"gix-validate", "gix-validate",
"memmap2", "memmap2",
"thiserror 2.0.11", "thiserror 2.0.12",
"winnow 0.6.26", "winnow 0.6.26",
] ]
...@@ -3412,7 +3455,7 @@ dependencies = [ ...@@ -3412,7 +3455,7 @@ dependencies = [
"gix-revision", "gix-revision",
"gix-validate", "gix-validate",
"smallvec", "smallvec",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3421,7 +3464,7 @@ version = "0.31.1" ...@@ -3421,7 +3464,7 @@ version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61e1ddc474405a68d2ce8485705dd72fe6ce959f2f5fe718601ead5da2c8f9e7" checksum = "61e1ddc474405a68d2ce8485705dd72fe6ce959f2f5fe718601ead5da2c8f9e7"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"bstr", "bstr",
"gix-commitgraph", "gix-commitgraph",
"gix-date", "gix-date",
...@@ -3430,7 +3473,7 @@ dependencies = [ ...@@ -3430,7 +3473,7 @@ dependencies = [
"gix-object", "gix-object",
"gix-revwalk", "gix-revwalk",
"gix-trace", "gix-trace",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3445,7 +3488,7 @@ dependencies = [ ...@@ -3445,7 +3488,7 @@ dependencies = [
"gix-hashtable", "gix-hashtable",
"gix-object", "gix-object",
"smallvec", "smallvec",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3454,7 +3497,7 @@ version = "0.10.11" ...@@ -3454,7 +3497,7 @@ version = "0.10.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d84dae13271f4313f8d60a166bf27e54c968c7c33e2ffd31c48cafe5da649875" checksum = "d84dae13271f4313f8d60a166bf27e54c968c7c33e2ffd31c48cafe5da649875"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"gix-path", "gix-path",
"libc", "libc",
"windows-sys 0.52.0", "windows-sys 0.52.0",
...@@ -3469,7 +3512,7 @@ dependencies = [ ...@@ -3469,7 +3512,7 @@ dependencies = [
"bstr", "bstr",
"gix-hash", "gix-hash",
"gix-lock", "gix-lock",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3506,7 +3549,7 @@ dependencies = [ ...@@ -3506,7 +3549,7 @@ dependencies = [
"gix-quote", "gix-quote",
"gix-sec", "gix-sec",
"gix-url", "gix-url",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3515,7 +3558,7 @@ version = "0.43.1" ...@@ -3515,7 +3558,7 @@ version = "0.43.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ed47d648619e23e93f971d2bba0d10c1100e54ef95d2981d609907a8cabac89" checksum = "6ed47d648619e23e93f971d2bba0d10c1100e54ef95d2981d609907a8cabac89"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"gix-commitgraph", "gix-commitgraph",
"gix-date", "gix-date",
"gix-hash", "gix-hash",
...@@ -3523,7 +3566,7 @@ dependencies = [ ...@@ -3523,7 +3566,7 @@ dependencies = [
"gix-object", "gix-object",
"gix-revwalk", "gix-revwalk",
"smallvec", "smallvec",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3536,7 +3579,7 @@ dependencies = [ ...@@ -3536,7 +3579,7 @@ dependencies = [
"gix-features", "gix-features",
"gix-path", "gix-path",
"percent-encoding", "percent-encoding",
"thiserror 2.0.11", "thiserror 2.0.12",
"url", "url",
] ]
...@@ -3557,7 +3600,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" ...@@ -3557,7 +3600,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9eaa01c3337d885617c0a42e92823922a2aea71f4caeace6fe87002bdcadbd90" checksum = "9eaa01c3337d885617c0a42e92823922a2aea71f4caeace6fe87002bdcadbd90"
dependencies = [ dependencies = [
"bstr", "bstr",
"thiserror 2.0.11", "thiserror 2.0.12",
] ]
[[package]] [[package]]
...@@ -3583,7 +3626,7 @@ version = "0.13.0" ...@@ -3583,7 +3626,7 @@ version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
dependencies = [ dependencies = [
"ff 0.13.0", "ff 0.13.1",
"rand_core 0.6.4", "rand_core 0.6.4",
"subtle", "subtle",
] ]
...@@ -3600,7 +3643,7 @@ dependencies = [ ...@@ -3600,7 +3643,7 @@ dependencies = [
"futures-sink", "futures-sink",
"futures-util", "futures-util",
"http 0.2.12", "http 0.2.12",
"indexmap 2.7.1", "indexmap 2.8.0",
"slab", "slab",
"tokio", "tokio",
"tokio-util", "tokio-util",
...@@ -3609,9 +3652,9 @@ dependencies = [ ...@@ -3609,9 +3652,9 @@ dependencies = [
[[package]] [[package]]
name = "h2" name = "h2"
version = "0.4.7" version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2"
dependencies = [ dependencies = [
"atomic-waker", "atomic-waker",
"bytes", "bytes",
...@@ -3619,7 +3662,7 @@ dependencies = [ ...@@ -3619,7 +3662,7 @@ dependencies = [
"futures-core", "futures-core",
"futures-sink", "futures-sink",
"http 1.2.0", "http 1.2.0",
"indexmap 2.7.1", "indexmap 2.8.0",
"slab", "slab",
"tokio", "tokio",
"tokio-util", "tokio-util",
...@@ -3690,7 +3733,7 @@ dependencies = [ ...@@ -3690,7 +3733,7 @@ dependencies = [
"biblatex", "biblatex",
"ciborium", "ciborium",
"citationberg", "citationberg",
"indexmap 2.7.1", "indexmap 2.8.0",
"numerals", "numerals",
"paste", "paste",
"serde", "serde",
...@@ -3847,9 +3890,9 @@ dependencies = [ ...@@ -3847,9 +3890,9 @@ dependencies = [
[[package]] [[package]]
name = "httparse" name = "httparse"
version = "1.10.0" version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
[[package]] [[package]]
name = "httpdate" name = "httpdate"
...@@ -3857,12 +3900,6 @@ version = "1.0.3" ...@@ -3857,12 +3900,6 @@ version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "humantime"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]] [[package]]
name = "hyper" name = "hyper"
version = "0.14.32" version = "0.14.32"
...@@ -3896,7 +3933,7 @@ dependencies = [ ...@@ -3896,7 +3933,7 @@ dependencies = [
"bytes", "bytes",
"futures-channel", "futures-channel",
"futures-util", "futures-util",
"h2 0.4.7", "h2 0.4.8",
"http 1.2.0", "http 1.2.0",
"http-body 1.0.1", "http-body 1.0.1",
"httparse", "httparse",
...@@ -3934,11 +3971,11 @@ dependencies = [ ...@@ -3934,11 +3971,11 @@ dependencies = [
"http 1.2.0", "http 1.2.0",
"hyper 1.6.0", "hyper 1.6.0",
"hyper-util", "hyper-util",
"rustls 0.23.22", "rustls 0.23.23",
"rustls-native-certs 0.8.1", "rustls-native-certs 0.8.1",
"rustls-pki-types", "rustls-pki-types",
"tokio", "tokio",
"tokio-rustls 0.26.1", "tokio-rustls 0.26.2",
"tower-service", "tower-service",
] ]
...@@ -4259,9 +4296,9 @@ dependencies = [ ...@@ -4259,9 +4296,9 @@ dependencies = [
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.7.1" version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown 0.15.2", "hashbrown 0.15.2",
...@@ -4270,9 +4307,9 @@ dependencies = [ ...@@ -4270,9 +4307,9 @@ dependencies = [
[[package]] [[package]]
name = "insta" name = "insta"
version = "1.42.1" version = "1.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71c1b125e30d93896b365e156c33dadfffab45ee8400afcbba4752f59de08a86" checksum = "50259abbaa67d11d2bcafc7ba1d094ed7a0c70e3ce893f0d0997f73558cb3084"
dependencies = [ dependencies = [
"console", "console",
"linked-hash-map", "linked-hash-map",
...@@ -4331,15 +4368,6 @@ dependencies = [ ...@@ -4331,15 +4368,6 @@ dependencies = [
"either", "either",
] ]
[[package]]
name = "itertools"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
dependencies = [
"either",
]
[[package]] [[package]]
name = "itertools" name = "itertools"
version = "0.14.0" version = "0.14.0"
...@@ -4351,9 +4379,9 @@ dependencies = [ ...@@ -4351,9 +4379,9 @@ dependencies = [
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.14" version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]] [[package]]
name = "jiff" name = "jiff"
...@@ -4369,11 +4397,35 @@ dependencies = [ ...@@ -4369,11 +4397,35 @@ dependencies = [
"windows-sys 0.59.0", "windows-sys 0.59.0",
] ]
[[package]]
name = "jiff"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d699bc6dfc879fb1bf9bdff0d4c56f0884fc6f0d0eb0fba397a6d00cd9a6b85e"
dependencies = [
"jiff-static",
"log",
"portable-atomic",
"portable-atomic-util",
"serde",
]
[[package]]
name = "jiff-static"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d16e75759ee0aa64c57a56acbf43916987b20c77373cb7e808979e02b93c9f9"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "jiff-tzdb" name = "jiff-tzdb"
version = "0.1.2" version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf2cec2f5d266af45a071ece48b1fb89f3b00b2421ac3a5fe10285a6caaa60d3" checksum = "962e1dfe9b2d75a84536cf5bf5eaaa4319aa7906c7160134a22883ac316d5f31"
[[package]] [[package]]
name = "jiff-tzdb-platform" name = "jiff-tzdb-platform"
...@@ -4405,11 +4457,11 @@ dependencies = [ ...@@ -4405,11 +4457,11 @@ dependencies = [
[[package]] [[package]]
name = "jsonwebtoken" name = "jsonwebtoken"
version = "9.3.0" version = "9.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde"
dependencies = [ dependencies = [
"base64 0.21.7", "base64 0.22.1",
"js-sys", "js-sys",
"pem", "pem",
"ring", "ring",
...@@ -4439,7 +4491,7 @@ dependencies = [ ...@@ -4439,7 +4491,7 @@ dependencies = [
[[package]] [[package]]
name = "kustos" name = "kustos"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"actix-web", "actix-web",
"async-trait", "async-trait",
...@@ -4490,9 +4542,9 @@ checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" ...@@ -4490,9 +4542,9 @@ checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388"
[[package]] [[package]]
name = "lapin" name = "lapin"
version = "2.5.0" version = "2.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "209b09a06f4bd4952a0fd0594f90d53cf4496b062f59acc838a2823e1bb7d95c" checksum = "3551b363b2fcf985fa39c47114333fa12fbb6518f863d4fd9556d0e19f48c1c9"
dependencies = [ dependencies = [
"amq-protocol", "amq-protocol",
"async-global-executor-trait", "async-global-executor-trait",
...@@ -4541,9 +4593,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" ...@@ -4541,9 +4593,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.169" version = "0.2.170"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828"
[[package]] [[package]]
name = "libloading" name = "libloading"
...@@ -4567,7 +4619,7 @@ version = "0.1.3" ...@@ -4567,7 +4619,7 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"libc", "libc",
"redox_syscall", "redox_syscall",
] ]
...@@ -4590,6 +4642,12 @@ version = "0.4.15" ...@@ -4590,6 +4642,12 @@ version = "0.4.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
[[package]]
name = "linux-raw-sys"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9"
[[package]] [[package]]
name = "lipsum" name = "lipsum"
version = "0.9.1" version = "0.9.1"
...@@ -4602,9 +4660,9 @@ dependencies = [ ...@@ -4602,9 +4660,9 @@ dependencies = [
[[package]] [[package]]
name = "litemap" name = "litemap"
version = "0.7.4" version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856"
dependencies = [ dependencies = [
"serde", "serde",
] ]
...@@ -4641,9 +4699,9 @@ dependencies = [ ...@@ -4641,9 +4699,9 @@ dependencies = [
[[package]] [[package]]
name = "livekit-protocol" name = "livekit-protocol"
version = "0.3.8" version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a792e08591e9e9b2438258194011678825e48bd9d129c7343bacc096fd9aa7f4" checksum = "0be4affc7654bf3f2c9571b02614ef27f436c5b68ee30db6151e8ab601f7e3fb"
dependencies = [ dependencies = [
"futures-util", "futures-util",
"livekit-runtime", "livekit-runtime",
...@@ -4702,9 +4760,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" ...@@ -4702,9 +4760,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e"
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.25" version = "0.4.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
dependencies = [ dependencies = [
"serde", "serde",
] ]
...@@ -4730,7 +4788,7 @@ checksum = "c5c8ecfc6c72051981c0459f75ccc585e7ff67c70829560cda8e647882a9abff" ...@@ -4730,7 +4788,7 @@ checksum = "c5c8ecfc6c72051981c0459f75ccc585e7ff67c70829560cda8e647882a9abff"
dependencies = [ dependencies = [
"encoding_rs", "encoding_rs",
"flate2", "flate2",
"indexmap 2.7.1", "indexmap 2.8.0",
"itoa", "itoa",
"log", "log",
"md-5", "md-5",
...@@ -4839,9 +4897,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" ...@@ -4839,9 +4897,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.8.3" version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5"
dependencies = [ dependencies = [
"adler2", "adler2",
"simd-adler32", "simd-adler32",
...@@ -4912,7 +4970,7 @@ version = "0.29.0" ...@@ -4912,7 +4970,7 @@ version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"cfg-if", "cfg-if",
"cfg_aliases", "cfg_aliases",
"libc", "libc",
...@@ -5086,9 +5144,9 @@ dependencies = [ ...@@ -5086,9 +5144,9 @@ dependencies = [
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.20.2" version = "1.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" checksum = "cde51589ab56b20a6f686b2c68f7a0bd6add753d697abf720d63f8db3ab7b1ad"
dependencies = [ dependencies = [
"portable-atomic", "portable-atomic",
] ]
...@@ -5139,7 +5197,7 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" ...@@ -5139,7 +5197,7 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
[[package]] [[package]]
name = "opentalk-api-client" name = "opentalk-api-client"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"http 1.2.0", "http 1.2.0",
...@@ -5155,7 +5213,7 @@ dependencies = [ ...@@ -5155,7 +5213,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-cache" name = "opentalk-cache"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"bincode", "bincode",
"moka", "moka",
...@@ -5184,7 +5242,7 @@ dependencies = [ ...@@ -5184,7 +5242,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-community-signaling-modules" name = "opentalk-community-signaling-modules"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"opentalk-signaling-core", "opentalk-signaling-core",
...@@ -5204,7 +5262,7 @@ dependencies = [ ...@@ -5204,7 +5262,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-controller" name = "opentalk-controller"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"actix-web", "actix-web",
"anstream", "anstream",
...@@ -5216,7 +5274,7 @@ dependencies = [ ...@@ -5216,7 +5274,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-controller-core" name = "opentalk-controller-core"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"actix", "actix",
"actix-cors", "actix-cors",
...@@ -5277,12 +5335,13 @@ dependencies = [ ...@@ -5277,12 +5335,13 @@ dependencies = [
"phonenumber", "phonenumber",
"pretty_assertions", "pretty_assertions",
"prometheus", "prometheus",
"rand 0.8.5", "rand 0.9.0",
"rand_chacha 0.9.0",
"redis", "redis",
"redis-args", "redis-args",
"ring", "ring",
"rrule", "rrule",
"rustls 0.23.22", "rustls 0.23.23",
"rustls-pemfile 2.2.0", "rustls-pemfile 2.2.0",
"rustls-pki-types", "rustls-pki-types",
"serde", "serde",
...@@ -5290,7 +5349,7 @@ dependencies = [ ...@@ -5290,7 +5349,7 @@ dependencies = [
"serial_test", "serial_test",
"service-probe", "service-probe",
"snafu", "snafu",
"strum 0.27.0", "strum 0.27.1",
"sysinfo", "sysinfo",
"tabled", "tabled",
"tokio", "tokio",
...@@ -5308,7 +5367,7 @@ dependencies = [ ...@@ -5308,7 +5367,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-controller-service" name = "opentalk-controller-service"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"base64 0.22.1", "base64 0.22.1",
...@@ -5346,7 +5405,7 @@ dependencies = [ ...@@ -5346,7 +5405,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-controller-service-facade" name = "opentalk-controller-service-facade"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"bytes", "bytes",
...@@ -5359,7 +5418,7 @@ dependencies = [ ...@@ -5359,7 +5418,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-controller-settings" name = "opentalk-controller-settings"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"anstream", "anstream",
"arc-swap", "arc-swap",
...@@ -5382,7 +5441,7 @@ dependencies = [ ...@@ -5382,7 +5441,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-controller-utils" name = "opentalk-controller-utils"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"actix-web", "actix-web",
"async-trait", "async-trait",
...@@ -5402,6 +5461,7 @@ dependencies = [ ...@@ -5402,6 +5461,7 @@ dependencies = [
"opentalk-types-api-v1", "opentalk-types-api-v1",
"opentalk-types-common", "opentalk-types-common",
"opentalk-types-signaling", "opentalk-types-signaling",
"rand 0.9.0",
"rrule", "rrule",
"serde_json", "serde_json",
"snafu", "snafu",
...@@ -5409,7 +5469,7 @@ dependencies = [ ...@@ -5409,7 +5469,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-database" name = "opentalk-database"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"deadpool-runtime", "deadpool-runtime",
...@@ -5427,7 +5487,7 @@ dependencies = [ ...@@ -5427,7 +5487,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-db-storage" name = "opentalk-db-storage"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"actix-rt", "actix-rt",
"barrel", "barrel",
...@@ -5453,7 +5513,7 @@ dependencies = [ ...@@ -5453,7 +5513,7 @@ dependencies = [
"serde_json", "serde_json",
"serial_test", "serial_test",
"snafu", "snafu",
"strum 0.27.0", "strum 0.27.1",
"tokio", "tokio",
"tracing", "tracing",
"url", "url",
...@@ -5501,7 +5561,7 @@ dependencies = [ ...@@ -5501,7 +5561,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-jobs" name = "opentalk-jobs"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"actix-rt", "actix-rt",
"async-trait", "async-trait",
...@@ -5571,7 +5631,7 @@ dependencies = [ ...@@ -5571,7 +5631,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-log" name = "opentalk-log"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"log", "log",
"serial_test", "serial_test",
...@@ -5609,10 +5669,10 @@ dependencies = [ ...@@ -5609,10 +5669,10 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-r3dlock" name = "opentalk-r3dlock"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"pretty_assertions", "pretty_assertions",
"rand 0.8.5", "rand 0.9.0",
"redis", "redis",
"snafu", "snafu",
"tokio", "tokio",
...@@ -5620,7 +5680,7 @@ dependencies = [ ...@@ -5620,7 +5680,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-report-generation" name = "opentalk-report-generation"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"chrono", "chrono",
"chrono-tz 0.10.1", "chrono-tz 0.10.1",
...@@ -5637,7 +5697,7 @@ dependencies = [ ...@@ -5637,7 +5697,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-core" name = "opentalk-signaling-core"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"actix-http", "actix-http",
"actix-rt", "actix-rt",
...@@ -5687,7 +5747,7 @@ dependencies = [ ...@@ -5687,7 +5747,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-module-chat" name = "opentalk-signaling-module-chat"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"actix-rt", "actix-rt",
"async-trait", "async-trait",
...@@ -5717,7 +5777,7 @@ dependencies = [ ...@@ -5717,7 +5777,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-module-core" name = "opentalk-signaling-module-core"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"opentalk-signaling-core", "opentalk-signaling-core",
...@@ -5726,7 +5786,7 @@ dependencies = [ ...@@ -5726,7 +5786,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-module-integration" name = "opentalk-signaling-module-integration"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"opentalk-signaling-core", "opentalk-signaling-core",
...@@ -5735,7 +5795,7 @@ dependencies = [ ...@@ -5735,7 +5795,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-module-livekit" name = "opentalk-signaling-module-livekit"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"either", "either",
...@@ -5762,7 +5822,7 @@ dependencies = [ ...@@ -5762,7 +5822,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-module-meeting-notes" name = "opentalk-signaling-module-meeting-notes"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"chrono", "chrono",
...@@ -5787,7 +5847,7 @@ dependencies = [ ...@@ -5787,7 +5847,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-module-meeting-report" name = "opentalk-signaling-module-meeting-report"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-stream", "async-stream",
"async-trait", "async-trait",
...@@ -5814,7 +5874,7 @@ dependencies = [ ...@@ -5814,7 +5874,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-module-polls" name = "opentalk-signaling-module-polls"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"actix-rt", "actix-rt",
"async-trait", "async-trait",
...@@ -5839,7 +5899,7 @@ dependencies = [ ...@@ -5839,7 +5899,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-module-shared-folder" name = "opentalk-signaling-module-shared-folder"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"actix-rt", "actix-rt",
"async-trait", "async-trait",
...@@ -5865,7 +5925,7 @@ dependencies = [ ...@@ -5865,7 +5925,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-module-subroom-audio" name = "opentalk-signaling-module-subroom-audio"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"either", "either",
...@@ -5890,7 +5950,7 @@ dependencies = [ ...@@ -5890,7 +5950,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-module-timer" name = "opentalk-signaling-module-timer"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"actix-rt", "actix-rt",
"async-trait", "async-trait",
...@@ -5917,7 +5977,7 @@ dependencies = [ ...@@ -5917,7 +5977,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-module-training-participation-report" name = "opentalk-signaling-module-training-participation-report"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-stream", "async-stream",
"async-trait", "async-trait",
...@@ -5939,7 +5999,7 @@ dependencies = [ ...@@ -5939,7 +5999,7 @@ dependencies = [
"parking_lot", "parking_lot",
"pdf-extract", "pdf-extract",
"pretty_assertions", "pretty_assertions",
"rand 0.8.5", "rand 0.9.0",
"redis", "redis",
"redis-args", "redis-args",
"serde", "serde",
...@@ -5951,7 +6011,7 @@ dependencies = [ ...@@ -5951,7 +6011,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-signaling-module-whiteboard" name = "opentalk-signaling-module-whiteboard"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"bytes", "bytes",
...@@ -5979,7 +6039,7 @@ dependencies = [ ...@@ -5979,7 +6039,7 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-test-util" name = "opentalk-test-util"
version = "0.29.0" version = "0.29.1"
dependencies = [ dependencies = [
"diesel", "diesel",
"diesel-async", "diesel-async",
...@@ -6002,9 +6062,9 @@ dependencies = [ ...@@ -6002,9 +6062,9 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-types-api-v1" name = "opentalk-types-api-v1"
version = "0.33.0" version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8565d68e6994ab6d0d6b5bdbc37d94c4edff34900215309c88d0fe3e248a5924" checksum = "a7ffb9ca739d7b748de0e188c7a44f5fed08ecdd2d7063ac383e2c92eb2ba527"
dependencies = [ dependencies = [
"actix-web", "actix-web",
"base64 0.22.1", "base64 0.22.1",
...@@ -6025,9 +6085,9 @@ dependencies = [ ...@@ -6025,9 +6085,9 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-types-common" name = "opentalk-types-common"
version = "0.32.0" version = "0.32.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc7b6f5082ce4410a8a4b483a33ac523863a974344be8ffeeb339e37624a9fd" checksum = "13523221c1cf75be9cf89b5149542013472d58eafdadb085f6bdd93def143921"
dependencies = [ dependencies = [
"actix-http", "actix-http",
"actix-web-httpauth", "actix-web-httpauth",
...@@ -6051,7 +6111,7 @@ dependencies = [ ...@@ -6051,7 +6111,7 @@ dependencies = [
"serde_json", "serde_json",
"serde_with", "serde_with",
"snafu", "snafu",
"strum 0.27.0", "strum 0.27.1",
"url", "url",
"utoipa", "utoipa",
"uuid", "uuid",
...@@ -6097,7 +6157,7 @@ dependencies = [ ...@@ -6097,7 +6157,7 @@ dependencies = [
"redis-args", "redis-args",
"serde", "serde",
"serde_json", "serde_json",
"strum 0.27.0", "strum 0.27.1",
"uuid", "uuid",
] ]
...@@ -6247,7 +6307,7 @@ dependencies = [ ...@@ -6247,7 +6307,7 @@ dependencies = [
"opentalk-types-signaling", "opentalk-types-signaling",
"redis-args", "redis-args",
"serde", "serde",
"strum 0.27.0", "strum 0.27.1",
"uuid", "uuid",
] ]
...@@ -6267,9 +6327,9 @@ dependencies = [ ...@@ -6267,9 +6327,9 @@ dependencies = [
[[package]] [[package]]
name = "opentalk-types-signaling-training-participation-report" name = "opentalk-types-signaling-training-participation-report"
version = "0.2.0" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8658e3a6b4303b0d3f637d152029f3ee206ff1bdfdd411bd680094c15f9b004" checksum = "94dc459b07a8f2f60c2bd7c8c5713b38b053a9527e3995dee7c7ccd904040c4e"
dependencies = [ dependencies = [
"opentalk-types-common", "opentalk-types-common",
"opentalk-types-signaling", "opentalk-types-signaling",
...@@ -6325,7 +6385,7 @@ dependencies = [ ...@@ -6325,7 +6385,7 @@ dependencies = [
"opentelemetry", "opentelemetry",
"opentelemetry-proto", "opentelemetry-proto",
"opentelemetry_sdk", "opentelemetry_sdk",
"prost 0.13.4", "prost 0.13.5",
"thiserror 1.0.69", "thiserror 1.0.69",
"tokio", "tokio",
"tonic", "tonic",
...@@ -6354,7 +6414,7 @@ checksum = "a6e05acbfada5ec79023c85368af14abd0b307c015e9064d249b2a950ef459a6" ...@@ -6354,7 +6414,7 @@ checksum = "a6e05acbfada5ec79023c85368af14abd0b307c015e9064d249b2a950ef459a6"
dependencies = [ dependencies = [
"opentelemetry", "opentelemetry",
"opentelemetry_sdk", "opentelemetry_sdk",
"prost 0.13.4", "prost 0.13.5",
"tonic", "tonic",
] ]
...@@ -6402,9 +6462,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" ...@@ -6402,9 +6462,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
[[package]] [[package]]
name = "owo-colors" name = "owo-colors"
version = "4.1.0" version = "4.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb37767f6569cd834a413442455e0f066d0d522de8630436e2a1761d9726ba56" checksum = "1036865bb9422d3300cf723f657c2851d0e9ab12567854b1f4eba3d77decf564"
[[package]] [[package]]
name = "p256" name = "p256"
...@@ -6431,9 +6491,9 @@ dependencies = [ ...@@ -6431,9 +6491,9 @@ dependencies = [
[[package]] [[package]]
name = "p384" name = "p384"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6"
dependencies = [ dependencies = [
"ecdsa 0.16.9", "ecdsa 0.16.9",
"elliptic-curve 0.13.8", "elliptic-curve 0.13.8",
...@@ -6585,7 +6645,7 @@ version = "0.12.1" ...@@ -6585,7 +6645,7 @@ version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5df03c7d216de06f93f398ef06f1385a60f2c597bb96f8195c8d98e08a26b1d5" checksum = "5df03c7d216de06f93f398ef06f1385a60f2c597bb96f8195c8d98e08a26b1d5"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"itoa", "itoa",
"memchr", "memchr",
"ryu", "ryu",
...@@ -6593,9 +6653,9 @@ dependencies = [ ...@@ -6593,9 +6653,9 @@ dependencies = [
[[package]] [[package]]
name = "pem" name = "pem"
version = "3.0.4" version = "3.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"serde", "serde",
...@@ -6622,8 +6682,18 @@ version = "0.6.5" ...@@ -6622,8 +6682,18 @@ version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
dependencies = [ dependencies = [
"fixedbitset", "fixedbitset 0.4.2",
"indexmap 2.7.1", "indexmap 2.8.0",
]
[[package]]
name = "petgraph"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772"
dependencies = [
"fixedbitset 0.5.7",
"indexmap 2.8.0",
] ]
[[package]] [[package]]
...@@ -6706,18 +6776,18 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" ...@@ -6706,18 +6776,18 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315"
[[package]] [[package]]
name = "pin-project" name = "pin-project"
version = "1.1.9" version = "1.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a"
dependencies = [ dependencies = [
"pin-project-internal", "pin-project-internal",
] ]
[[package]] [[package]]
name = "pin-project-internal" name = "pin-project-internal"
version = "1.1.9" version = "1.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
...@@ -6792,9 +6862,9 @@ dependencies = [ ...@@ -6792,9 +6862,9 @@ dependencies = [
[[package]] [[package]]
name = "pkg-config" name = "pkg-config"
version = "0.3.31" version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]] [[package]]
name = "plist" name = "plist"
...@@ -6803,7 +6873,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" ...@@ -6803,7 +6873,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"indexmap 2.7.1", "indexmap 2.8.0",
"quick-xml 0.32.0", "quick-xml 0.32.0",
"serde", "serde",
"time", "time",
...@@ -6861,9 +6931,9 @@ checksum = "60f6ce597ecdcc9a098e7fddacb1065093a3d66446fa16c675e7e71d1b5c28e6" ...@@ -6861,9 +6931,9 @@ checksum = "60f6ce597ecdcc9a098e7fddacb1065093a3d66446fa16c675e7e71d1b5c28e6"
[[package]] [[package]]
name = "portable-atomic" name = "portable-atomic"
version = "1.10.0" version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e"
[[package]] [[package]]
name = "portable-atomic-util" name = "portable-atomic-util"
...@@ -6929,11 +6999,11 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" ...@@ -6929,11 +6999,11 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]] [[package]]
name = "ppv-lite86" name = "ppv-lite86"
version = "0.2.20" version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
dependencies = [ dependencies = [
"zerocopy 0.7.35", "zerocopy 0.8.23",
] ]
[[package]] [[package]]
...@@ -6958,9 +7028,9 @@ dependencies = [ ...@@ -6958,9 +7028,9 @@ dependencies = [
[[package]] [[package]]
name = "prettyplease" name = "prettyplease"
version = "0.2.29" version = "0.2.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" checksum = "f1ccf34da56fc294e7d4ccf69a85992b7dfb826b7cf57bac6a70bba3494cc08a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"syn", "syn",
...@@ -6977,9 +7047,9 @@ dependencies = [ ...@@ -6977,9 +7047,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro-crate" name = "proc-macro-crate"
version = "3.2.0" version = "3.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35"
dependencies = [ dependencies = [
"toml_edit", "toml_edit",
] ]
...@@ -7008,9 +7078,9 @@ dependencies = [ ...@@ -7008,9 +7078,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.93" version = "1.0.94"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
...@@ -7052,12 +7122,12 @@ dependencies = [ ...@@ -7052,12 +7122,12 @@ dependencies = [
[[package]] [[package]]
name = "prost" name = "prost"
version = "0.13.4" version = "0.13.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5"
dependencies = [ dependencies = [
"bytes", "bytes",
"prost-derive 0.13.4", "prost-derive 0.13.5",
] ]
[[package]] [[package]]
...@@ -7072,7 +7142,7 @@ dependencies = [ ...@@ -7072,7 +7142,7 @@ dependencies = [
"log", "log",
"multimap", "multimap",
"once_cell", "once_cell",
"petgraph", "petgraph 0.6.5",
"prettyplease", "prettyplease",
"prost 0.12.6", "prost 0.12.6",
"prost-types 0.12.6", "prost-types 0.12.6",
...@@ -7083,19 +7153,19 @@ dependencies = [ ...@@ -7083,19 +7153,19 @@ dependencies = [
[[package]] [[package]]
name = "prost-build" name = "prost-build"
version = "0.13.4" version = "0.13.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf"
dependencies = [ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"itertools 0.13.0", "itertools 0.14.0",
"log", "log",
"multimap", "multimap",
"once_cell", "once_cell",
"petgraph", "petgraph 0.7.1",
"prettyplease", "prettyplease",
"prost 0.13.4", "prost 0.13.5",
"prost-types 0.13.4", "prost-types 0.13.5",
"regex", "regex",
"syn", "syn",
"tempfile", "tempfile",
...@@ -7116,12 +7186,12 @@ dependencies = [ ...@@ -7116,12 +7186,12 @@ dependencies = [
[[package]] [[package]]
name = "prost-derive" name = "prost-derive"
version = "0.13.4" version = "0.13.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"itertools 0.13.0", "itertools 0.14.0",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn",
...@@ -7138,11 +7208,11 @@ dependencies = [ ...@@ -7138,11 +7208,11 @@ dependencies = [
[[package]] [[package]]
name = "prost-types" name = "prost-types"
version = "0.13.4" version = "0.13.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc2f1e56baa61e93533aebc21af4d2134b70f66275e0fcdf3cbe43d77ff7e8fc" checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16"
dependencies = [ dependencies = [
"prost 0.13.4", "prost 0.13.5",
] ]
[[package]] [[package]]
...@@ -7159,9 +7229,9 @@ checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" ...@@ -7159,9 +7229,9 @@ checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac"
[[package]] [[package]]
name = "psm" name = "psm"
version = "0.1.24" version = "0.1.25"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" checksum = "f58e5423e24c18cc840e1c98370b3993c6649cd1678b4d24318bcf0a083cbe88"
dependencies = [ dependencies = [
"cc", "cc",
] ]
...@@ -7242,9 +7312,9 @@ dependencies = [ ...@@ -7242,9 +7312,9 @@ dependencies = [
"quinn-proto", "quinn-proto",
"quinn-udp", "quinn-udp",
"rustc-hash 2.1.1", "rustc-hash 2.1.1",
"rustls 0.23.22", "rustls 0.23.23",
"socket2 0.5.8", "socket2 0.5.8",
"thiserror 2.0.11", "thiserror 2.0.12",
"tokio", "tokio",
"tracing", "tracing",
] ]
...@@ -7260,10 +7330,10 @@ dependencies = [ ...@@ -7260,10 +7330,10 @@ dependencies = [
"rand 0.8.5", "rand 0.8.5",
"ring", "ring",
"rustc-hash 2.1.1", "rustc-hash 2.1.1",
"rustls 0.23.22", "rustls 0.23.23",
"rustls-pki-types", "rustls-pki-types",
"slab", "slab",
"thiserror 2.0.11", "thiserror 2.0.12",
"tinyvec", "tinyvec",
"tracing", "tracing",
"web-time", "web-time",
...@@ -7271,9 +7341,9 @@ dependencies = [ ...@@ -7271,9 +7341,9 @@ dependencies = [
[[package]] [[package]]
name = "quinn-udp" name = "quinn-udp"
version = "0.5.9" version = "0.5.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944"
dependencies = [ dependencies = [
"cfg_aliases", "cfg_aliases",
"libc", "libc",
...@@ -7285,9 +7355,9 @@ dependencies = [ ...@@ -7285,9 +7355,9 @@ dependencies = [
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.38" version = "1.0.39"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
...@@ -7310,8 +7380,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" ...@@ -7310,8 +7380,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94"
dependencies = [ dependencies = [
"rand_chacha 0.9.0", "rand_chacha 0.9.0",
"rand_core 0.9.0", "rand_core 0.9.3",
"zerocopy 0.8.16", "zerocopy 0.8.23",
] ]
[[package]] [[package]]
...@@ -7331,7 +7401,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" ...@@ -7331,7 +7401,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [ dependencies = [
"ppv-lite86", "ppv-lite86",
"rand_core 0.9.0", "rand_core 0.9.3",
] ]
[[package]] [[package]]
...@@ -7345,12 +7415,11 @@ dependencies = [ ...@@ -7345,12 +7415,11 @@ dependencies = [
[[package]] [[package]]
name = "rand_core" name = "rand_core"
version = "0.9.0" version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
dependencies = [ dependencies = [
"getrandom 0.3.1", "getrandom 0.3.1",
"zerocopy 0.8.16",
] ]
[[package]] [[package]]
...@@ -7361,11 +7430,11 @@ checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" ...@@ -7361,11 +7430,11 @@ checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684"
[[package]] [[package]]
name = "raw-cpuid" name = "raw-cpuid"
version = "11.3.0" version = "11.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c6928fa44c097620b706542d428957635951bade7143269085389d42c8a4927e" checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
] ]
[[package]] [[package]]
...@@ -7401,9 +7470,9 @@ dependencies = [ ...@@ -7401,9 +7470,9 @@ dependencies = [
[[package]] [[package]]
name = "redis" name = "redis"
version = "0.29.0" version = "0.29.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9568894e8bdefd16512bca9e286a9d2abc27773609aa4eb7f428497d64df4373" checksum = "8034fb926579ff49d3fe58d288d5dcb580bf11e9bccd33224b45adebf0fd0c23"
dependencies = [ dependencies = [
"arc-swap", "arc-swap",
"backon", "backon",
...@@ -7448,18 +7517,18 @@ dependencies = [ ...@@ -7448,18 +7517,18 @@ dependencies = [
[[package]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.5.8" version = "0.5.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
] ]
[[package]] [[package]]
name = "refinery" name = "refinery"
version = "0.8.14" version = "0.8.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0904191f0566c3d3e0091d5cc8dec22e663d77def2d247b16e7a438b188bf75d" checksum = "7ba5d693abf62492c37268512ff35b77655d2e957ca53dab85bf993fe9172d15"
dependencies = [ dependencies = [
"refinery-core", "refinery-core",
"refinery-macros", "refinery-macros",
...@@ -7467,9 +7536,9 @@ dependencies = [ ...@@ -7467,9 +7536,9 @@ dependencies = [
[[package]] [[package]]
name = "refinery-core" name = "refinery-core"
version = "0.8.14" version = "0.8.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9bf253999e1899ae476c910b994959e341d84c4389ba9533d3dacbe06df04825" checksum = "8a83581f18c1a4c3a6ebd7a174bdc665f17f618d79f7edccb6a0ac67e660b319"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"cfg-if", "cfg-if",
...@@ -7488,11 +7557,11 @@ dependencies = [ ...@@ -7488,11 +7557,11 @@ dependencies = [
[[package]] [[package]]
name = "refinery-macros" name = "refinery-macros"
version = "0.8.14" version = "0.8.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd81f69687fe8a1fa10995108b3ffc7cdbd63e682a4f8fbfd1020130780d7e17" checksum = "72c225407d8e52ef8cf094393781ecda9a99d6544ec28d90a6915751de259264"
dependencies = [ dependencies = [
"heck 0.4.1", "heck 0.5.0",
"proc-macro2", "proc-macro2",
"quote", "quote",
"refinery-core", "refinery-core",
...@@ -7630,7 +7699,7 @@ dependencies = [ ...@@ -7630,7 +7699,7 @@ dependencies = [
"percent-encoding", "percent-encoding",
"pin-project-lite", "pin-project-lite",
"quinn", "quinn",
"rustls 0.23.22", "rustls 0.23.23",
"rustls-native-certs 0.8.1", "rustls-native-certs 0.8.1",
"rustls-pemfile 2.2.0", "rustls-pemfile 2.2.0",
"rustls-pki-types", "rustls-pki-types",
...@@ -7639,7 +7708,7 @@ dependencies = [ ...@@ -7639,7 +7708,7 @@ dependencies = [
"serde_urlencoded", "serde_urlencoded",
"sync_wrapper 1.0.2", "sync_wrapper 1.0.2",
"tokio", "tokio",
"tokio-rustls 0.26.1", "tokio-rustls 0.26.2",
"tokio-util", "tokio-util",
"tower 0.5.2", "tower 0.5.2",
"tower-service", "tower-service",
...@@ -7725,7 +7794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" ...@@ -7725,7 +7794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce4d759a4729a655ddfdbb3ff6e77fb9eadd902dae12319455557796e435d2a6" checksum = "ce4d759a4729a655ddfdbb3ff6e77fb9eadd902dae12319455557796e435d2a6"
dependencies = [ dependencies = [
"ahash 0.8.11", "ahash 0.8.11",
"bitflags 2.8.0", "bitflags 2.9.0",
"instant", "instant",
"no-std-compat", "no-std-compat",
"num-traits", "num-traits",
...@@ -7750,15 +7819,14 @@ dependencies = [ ...@@ -7750,15 +7819,14 @@ dependencies = [
[[package]] [[package]]
name = "ring" name = "ring"
version = "0.17.8" version = "0.17.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee"
dependencies = [ dependencies = [
"cc", "cc",
"cfg-if", "cfg-if",
"getrandom 0.2.15", "getrandom 0.2.15",
"libc", "libc",
"spin 0.9.8",
"untrusted", "untrusted",
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
...@@ -7815,9 +7883,9 @@ dependencies = [ ...@@ -7815,9 +7883,9 @@ dependencies = [
[[package]] [[package]]
name = "rust-embed" name = "rust-embed"
version = "8.5.0" version = "8.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" checksum = "0b3aba5104622db5c9fc61098de54708feb732e7763d7faa2fa625899f00bf6f"
dependencies = [ dependencies = [
"rust-embed-impl", "rust-embed-impl",
"rust-embed-utils", "rust-embed-utils",
...@@ -7826,9 +7894,9 @@ dependencies = [ ...@@ -7826,9 +7894,9 @@ dependencies = [
[[package]] [[package]]
name = "rust-embed-impl" name = "rust-embed-impl"
version = "8.5.0" version = "8.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" checksum = "1f198c73be048d2c5aa8e12f7960ad08443e56fd39cc26336719fdb4ea0ebaae"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
...@@ -7839,9 +7907,9 @@ dependencies = [ ...@@ -7839,9 +7907,9 @@ dependencies = [
[[package]] [[package]]
name = "rust-embed-utils" name = "rust-embed-utils"
version = "8.5.0" version = "8.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" checksum = "5a2fcdc9f40c8dc2922842ca9add611ad19f332227fc651d015881ad1552bd9a"
dependencies = [ dependencies = [
"sha2", "sha2",
"walkdir", "walkdir",
...@@ -7904,13 +7972,26 @@ version = "0.38.44" ...@@ -7904,13 +7972,26 @@ version = "0.38.44"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"errno", "errno",
"libc", "libc",
"linux-raw-sys 0.4.15", "linux-raw-sys 0.4.15",
"windows-sys 0.59.0", "windows-sys 0.59.0",
] ]
[[package]]
name = "rustix"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825"
dependencies = [
"bitflags 2.9.0",
"errno",
"libc",
"linux-raw-sys 0.9.2",
"windows-sys 0.59.0",
]
[[package]] [[package]]
name = "rustls" name = "rustls"
version = "0.21.12" version = "0.21.12"
...@@ -7925,9 +8006,9 @@ dependencies = [ ...@@ -7925,9 +8006,9 @@ dependencies = [
[[package]] [[package]]
name = "rustls" name = "rustls"
version = "0.23.22" version = "0.23.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395"
dependencies = [ dependencies = [
"aws-lc-rs", "aws-lc-rs",
"log", "log",
...@@ -8014,9 +8095,9 @@ dependencies = [ ...@@ -8014,9 +8095,9 @@ dependencies = [
[[package]] [[package]]
name = "rustversion" name = "rustversion"
version = "1.0.19" version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
[[package]] [[package]]
name = "rustybuzz" name = "rustybuzz"
...@@ -8024,7 +8105,7 @@ version = "0.18.0" ...@@ -8024,7 +8105,7 @@ version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c85d1ccd519e61834798eb52c4e886e8c2d7d698dd3d6ce0b1b47eb8557f1181" checksum = "c85d1ccd519e61834798eb52c4e886e8c2d7d698dd3d6ce0b1b47eb8557f1181"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"bytemuck", "bytemuck",
"core_maths", "core_maths",
"log", "log",
...@@ -8038,9 +8119,9 @@ dependencies = [ ...@@ -8038,9 +8119,9 @@ dependencies = [
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.19" version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]] [[package]]
name = "same-file" name = "same-file"
...@@ -8102,9 +8183,9 @@ dependencies = [ ...@@ -8102,9 +8183,9 @@ dependencies = [
[[package]] [[package]]
name = "sdd" name = "sdd"
version = "3.0.7" version = "3.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b07779b9b918cc05650cb30f404d4d7835d26df37c235eded8a6832e2fb82cca" checksum = "584e070911c7017da6cb2eb0788d09f43d789029b5877d3e5ecc8acf86ceee21"
[[package]] [[package]]
name = "sec1" name = "sec1"
...@@ -8140,7 +8221,7 @@ version = "2.11.1" ...@@ -8140,7 +8221,7 @@ version = "2.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"core-foundation 0.9.4", "core-foundation 0.9.4",
"core-foundation-sys", "core-foundation-sys",
"libc", "libc",
...@@ -8153,7 +8234,7 @@ version = "3.2.0" ...@@ -8153,7 +8234,7 @@ version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"core-foundation 0.10.0", "core-foundation 0.10.0",
"core-foundation-sys", "core-foundation-sys",
"libc", "libc",
...@@ -8172,18 +8253,18 @@ dependencies = [ ...@@ -8172,18 +8253,18 @@ dependencies = [
[[package]] [[package]]
name = "semver" name = "semver"
version = "1.0.25" version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
dependencies = [ dependencies = [
"serde", "serde",
] ]
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.217" version = "1.0.219"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
...@@ -8212,9 +8293,9 @@ dependencies = [ ...@@ -8212,9 +8293,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.217" version = "1.0.219"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
...@@ -8223,9 +8304,9 @@ dependencies = [ ...@@ -8223,9 +8304,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.138" version = "1.0.140"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
dependencies = [ dependencies = [
"itoa", "itoa",
"memchr", "memchr",
...@@ -8235,9 +8316,9 @@ dependencies = [ ...@@ -8235,9 +8316,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_path_to_error" name = "serde_path_to_error"
version = "0.1.16" version = "0.1.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a"
dependencies = [ dependencies = [
"itoa", "itoa",
"serde", "serde",
...@@ -8254,9 +8335,9 @@ dependencies = [ ...@@ -8254,9 +8335,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_repr" name = "serde_repr"
version = "0.1.19" version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
...@@ -8304,7 +8385,7 @@ dependencies = [ ...@@ -8304,7 +8385,7 @@ dependencies = [
"chrono", "chrono",
"hex", "hex",
"indexmap 1.9.3", "indexmap 1.9.3",
"indexmap 2.7.1", "indexmap 2.8.0",
"serde", "serde",
"serde_derive", "serde_derive",
"serde_json", "serde_json",
...@@ -8330,7 +8411,7 @@ version = "0.9.34+deprecated" ...@@ -8330,7 +8411,7 @@ version = "0.9.34+deprecated"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
dependencies = [ dependencies = [
"indexmap 2.7.1", "indexmap 2.8.0",
"itoa", "itoa",
"ryu", "ryu",
"serde", "serde",
...@@ -8484,7 +8565,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" ...@@ -8484,7 +8565,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb"
dependencies = [ dependencies = [
"num-bigint", "num-bigint",
"num-traits", "num-traits",
"thiserror 2.0.11", "thiserror 2.0.12",
"time", "time",
] ]
...@@ -8523,9 +8604,9 @@ dependencies = [ ...@@ -8523,9 +8604,9 @@ dependencies = [
[[package]] [[package]]
name = "smallvec" name = "smallvec"
version = "1.13.2" version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
dependencies = [ dependencies = [
"serde", "serde",
] ]
...@@ -8626,9 +8707,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" ...@@ -8626,9 +8707,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
[[package]] [[package]]
name = "stacker" name = "stacker"
version = "0.1.17" version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" checksum = "d9156ebd5870ef293bfb43f91c7a74528d363ec0d424afe24160ed5a4343d08a"
dependencies = [ dependencies = [
"cc", "cc",
"cfg-if", "cfg-if",
...@@ -8690,11 +8771,11 @@ dependencies = [ ...@@ -8690,11 +8771,11 @@ dependencies = [
[[package]] [[package]]
name = "strum" name = "strum"
version = "0.27.0" version = "0.27.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce1475c515a4f03a8a7129bb5228b81a781a86cb0b3fbbc19e1c556d491a401f" checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32"
dependencies = [ dependencies = [
"strum_macros 0.27.0", "strum_macros 0.27.1",
] ]
[[package]] [[package]]
...@@ -8712,9 +8793,9 @@ dependencies = [ ...@@ -8712,9 +8793,9 @@ dependencies = [
[[package]] [[package]]
name = "strum_macros" name = "strum_macros"
version = "0.27.0" version = "0.27.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9688894b43459159c82bfa5a5fa0435c19cbe3c9b427fa1dd7b1ce0c279b18a7" checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8"
dependencies = [ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro2", "proc-macro2",
...@@ -8767,9 +8848,9 @@ dependencies = [ ...@@ -8767,9 +8848,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.98" version = "2.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
...@@ -8898,15 +8979,15 @@ dependencies = [ ...@@ -8898,15 +8979,15 @@ dependencies = [
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.16.0" version = "3.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" checksum = "2c317e0a526ee6120d8dabad239c8dadca62b24b6f168914bbbc8e2fb1f0e567"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"fastrand 2.3.0", "fastrand 2.3.0",
"getrandom 0.3.1", "getrandom 0.3.1",
"once_cell", "once_cell",
"rustix 0.38.44", "rustix 1.0.2",
"windows-sys 0.59.0", "windows-sys 0.59.0",
] ]
...@@ -8930,11 +9011,11 @@ dependencies = [ ...@@ -8930,11 +9011,11 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "2.0.11" version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
dependencies = [ dependencies = [
"thiserror-impl 2.0.11", "thiserror-impl 2.0.12",
] ]
[[package]] [[package]]
...@@ -8950,9 +9031,9 @@ dependencies = [ ...@@ -8950,9 +9031,9 @@ dependencies = [
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "2.0.11" version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
...@@ -8971,9 +9052,9 @@ dependencies = [ ...@@ -8971,9 +9052,9 @@ dependencies = [
[[package]] [[package]]
name = "time" name = "time"
version = "0.3.37" version = "0.3.39"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8"
dependencies = [ dependencies = [
"deranged", "deranged",
"itoa", "itoa",
...@@ -8988,15 +9069,15 @@ dependencies = [ ...@@ -8988,15 +9069,15 @@ dependencies = [
[[package]] [[package]]
name = "time-core" name = "time-core"
version = "0.1.2" version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef"
[[package]] [[package]]
name = "time-macros" name = "time-macros"
version = "0.2.19" version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c"
dependencies = [ dependencies = [
"num-conv", "num-conv",
"time-core", "time-core",
...@@ -9050,9 +9131,9 @@ dependencies = [ ...@@ -9050,9 +9131,9 @@ dependencies = [
[[package]] [[package]]
name = "tinyvec" name = "tinyvec"
version = "1.8.1" version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71"
dependencies = [ dependencies = [
"tinyvec_macros", "tinyvec_macros",
] ]
...@@ -9065,9 +9146,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" ...@@ -9065,9 +9146,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.43.0" version = "1.44.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a"
dependencies = [ dependencies = [
"backtrace", "backtrace",
"bytes", "bytes",
...@@ -9170,11 +9251,11 @@ dependencies = [ ...@@ -9170,11 +9251,11 @@ dependencies = [
[[package]] [[package]]
name = "tokio-rustls" name = "tokio-rustls"
version = "0.26.1" version = "0.26.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b"
dependencies = [ dependencies = [
"rustls 0.23.22", "rustls 0.23.23",
"tokio", "tokio",
] ]
...@@ -9226,15 +9307,15 @@ dependencies = [ ...@@ -9226,15 +9307,15 @@ dependencies = [
[[package]] [[package]]
name = "toml_edit" name = "toml_edit"
version = "0.22.23" version = "0.22.24"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474"
dependencies = [ dependencies = [
"indexmap 2.7.1", "indexmap 2.8.0",
"serde", "serde",
"serde_spanned", "serde_spanned",
"toml_datetime", "toml_datetime",
"winnow 0.7.1", "winnow 0.7.3",
] ]
[[package]] [[package]]
...@@ -9248,7 +9329,7 @@ dependencies = [ ...@@ -9248,7 +9329,7 @@ dependencies = [
"axum", "axum",
"base64 0.22.1", "base64 0.22.1",
"bytes", "bytes",
"h2 0.4.7", "h2 0.4.8",
"http 1.2.0", "http 1.2.0",
"http-body 1.0.1", "http-body 1.0.1",
"http-body-util", "http-body-util",
...@@ -9257,7 +9338,7 @@ dependencies = [ ...@@ -9257,7 +9338,7 @@ dependencies = [
"hyper-util", "hyper-util",
"percent-encoding", "percent-encoding",
"pin-project", "pin-project",
"prost 0.13.4", "prost 0.13.5",
"socket2 0.5.8", "socket2 0.5.8",
"tokio", "tokio",
"tokio-stream", "tokio-stream",
...@@ -9275,8 +9356,8 @@ checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" ...@@ -9275,8 +9356,8 @@ checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11"
dependencies = [ dependencies = [
"prettyplease", "prettyplease",
"proc-macro2", "proc-macro2",
"prost-build 0.13.4", "prost-build 0.13.5",
"prost-types 0.13.4", "prost-types 0.13.5",
"quote", "quote",
"syn", "syn",
] ]
...@@ -9342,9 +9423,9 @@ dependencies = [ ...@@ -9342,9 +9423,9 @@ dependencies = [
[[package]] [[package]]
name = "tracing-actix-web" name = "tracing-actix-web"
version = "0.7.15" version = "0.7.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54a9f5c1aca50ebebf074ee665b9f99f2e84906dcf6b993a0d0090edb835166d" checksum = "332bbdf3bd208d1fe6446f8ffb4e8c2ae66e25da0fb38e0b69545e640ecee6a6"
dependencies = [ dependencies = [
"actix-web", "actix-web",
"mutually_exclusive_features", "mutually_exclusive_features",
...@@ -9457,15 +9538,15 @@ checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" ...@@ -9457,15 +9538,15 @@ checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
[[package]] [[package]]
name = "typenum" name = "typenum"
version = "1.17.0" version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
[[package]] [[package]]
name = "typst" name = "typst"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f7791c2c9984cb363bdc68009d4f8114bc2a7111a8214f96e26f75df9778063" checksum = "140458bc8c72b014266f8ea5fad57165c8159845105eea8949c8954b2a8f49f4"
dependencies = [ dependencies = [
"comemo", "comemo",
"ecow", "ecow",
...@@ -9482,20 +9563,20 @@ dependencies = [ ...@@ -9482,20 +9563,20 @@ dependencies = [
[[package]] [[package]]
name = "typst-assets" name = "typst-assets"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1051c56bbbf74d31ea6c6b1661e62fa0ebb8104403ee53f6dcd321600426e0b6" checksum = "b5bf0cc3c2265502b51fcb73147cc7c951ceb694507195b93c2ab0b901abb902"
[[package]] [[package]]
name = "typst-eval" name = "typst-eval"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da7790ff20466fc803ea636f78868e00325aeb6ee426e6078f609c401b7ec96b" checksum = "850733c95becdb1b0153fd50e979b06d1a3d42f2411f2a0206b3a793501205ac"
dependencies = [ dependencies = [
"comemo", "comemo",
"ecow", "ecow",
"if_chain", "if_chain",
"indexmap 2.7.1", "indexmap 2.8.0",
"stacker", "stacker",
"toml", "toml",
"typst-library", "typst-library",
...@@ -9508,9 +9589,9 @@ dependencies = [ ...@@ -9508,9 +9589,9 @@ dependencies = [
[[package]] [[package]]
name = "typst-html" name = "typst-html"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b0fdf956ae7105baae607edcbef9e339017c9939478104863a1bd6c39a9f499" checksum = "654de5a88b9104f9b19723166eb16b8aec6df72a060d91736b81dc72e905e7cc"
dependencies = [ dependencies = [
"comemo", "comemo",
"ecow", "ecow",
...@@ -9524,9 +9605,9 @@ dependencies = [ ...@@ -9524,9 +9605,9 @@ dependencies = [
[[package]] [[package]]
name = "typst-kit" name = "typst-kit"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b59747c7f5bb5890ab1b8b6f4b9b9ae8645183bbfd0f6a967920ed1ceae15e16" checksum = "818fa9d54e1663fe20d15f6359945616cc4026d68c4de6c4eb0add7556fe2a90"
dependencies = [ dependencies = [
"ecow", "ecow",
"fontdb", "fontdb",
...@@ -9542,9 +9623,9 @@ dependencies = [ ...@@ -9542,9 +9623,9 @@ dependencies = [
[[package]] [[package]]
name = "typst-layout" name = "typst-layout"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd5df06b1452461c0905444c15608b30374a07dfcb64163f07f9047101e777fc" checksum = "dc7f7129c44423e54e9943c8a87403a82e8a5a1bdfd3ef08c0aae1b66deec696"
dependencies = [ dependencies = [
"az", "az",
"bumpalo", "bumpalo",
...@@ -9574,12 +9655,12 @@ dependencies = [ ...@@ -9574,12 +9655,12 @@ dependencies = [
[[package]] [[package]]
name = "typst-library" name = "typst-library"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "166ce1da78382fe0cba6535da219e157ec6c446903d9a044ccd364a46189f0b8" checksum = "722b0d6dfd05aa5bb7da7f282586f624f452e3f285cd3a10ac0d7e99f3bc3048"
dependencies = [ dependencies = [
"az", "az",
"bitflags 2.8.0", "bitflags 2.9.0",
"bumpalo", "bumpalo",
"chinese-number", "chinese-number",
"ciborium", "ciborium",
...@@ -9594,7 +9675,7 @@ dependencies = [ ...@@ -9594,7 +9675,7 @@ dependencies = [
"icu_provider", "icu_provider",
"icu_provider_blob", "icu_provider_blob",
"image", "image",
"indexmap 2.7.1", "indexmap 2.8.0",
"kamadak-exif", "kamadak-exif",
"kurbo", "kurbo",
"lipsum", "lipsum",
...@@ -9635,9 +9716,9 @@ dependencies = [ ...@@ -9635,9 +9716,9 @@ dependencies = [
[[package]] [[package]]
name = "typst-macros" name = "typst-macros"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c748b2655e1cc5e68701b8b5e899b76aa8c046cb5f516ffcc0af3e2a25ed8d65" checksum = "c5a7667bf2ff3111e25744e72abfdbbed5fed9a37476043448e935697e55a6fb"
dependencies = [ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro2", "proc-macro2",
...@@ -9647,9 +9728,9 @@ dependencies = [ ...@@ -9647,9 +9728,9 @@ dependencies = [
[[package]] [[package]]
name = "typst-pdf" name = "typst-pdf"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7169da918986494565377ea687b1dd6ff6222d3102c137b2387e6ad57c188aff" checksum = "a78718a94c28b5ed5e9ee9826fa995004a81abbcc1c9d0e88a7e87656cbec5a4"
dependencies = [ dependencies = [
"arrayvec", "arrayvec",
"base64 0.22.1", "base64 0.22.1",
...@@ -9657,7 +9738,7 @@ dependencies = [ ...@@ -9657,7 +9738,7 @@ dependencies = [
"comemo", "comemo",
"ecow", "ecow",
"image", "image",
"indexmap 2.7.1", "indexmap 2.8.0",
"miniz_oxide", "miniz_oxide",
"pdf-writer", "pdf-writer",
"serde", "serde",
...@@ -9675,9 +9756,9 @@ dependencies = [ ...@@ -9675,9 +9756,9 @@ dependencies = [
[[package]] [[package]]
name = "typst-realize" name = "typst-realize"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1488fb1780212ef38bfa813945f356e5788485bbb5e25cd75b093e886d4b31af" checksum = "7bc724c3303b9864c01f25292d82c3aa8f0492512bd890836f1fb7242fa5b8af"
dependencies = [ dependencies = [
"arrayvec", "arrayvec",
"bumpalo", "bumpalo",
...@@ -9693,9 +9774,9 @@ dependencies = [ ...@@ -9693,9 +9774,9 @@ dependencies = [
[[package]] [[package]]
name = "typst-svg" name = "typst-svg"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b805876107eec612b6f45c78097c137d428064f8c11714beb6ab373f907b99d6" checksum = "674c8e5cb94015c9f870c48bace6b64eb706075766643f3b1f67606c6b03feae"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"comemo", "comemo",
...@@ -9713,9 +9794,9 @@ dependencies = [ ...@@ -9713,9 +9794,9 @@ dependencies = [
[[package]] [[package]]
name = "typst-syntax" name = "typst-syntax"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abe870e191c392cad35acff28095e99896033e3f2ddcd36b01bebc485e192711" checksum = "5ba949ac75a374ea6b2f61d32e6c63acb818e6179d16f78b2cba988fbb5e23a8"
dependencies = [ dependencies = [
"ecow", "ecow",
"serde", "serde",
...@@ -9731,9 +9812,9 @@ dependencies = [ ...@@ -9731,9 +9812,9 @@ dependencies = [
[[package]] [[package]]
name = "typst-timing" name = "typst-timing"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "153d288af73d7d5f476a906a1984680b0f2c6020f15cd900243a5a8223cae4f2" checksum = "8ba4541664e98be2023db2267d92af206190eb903063a0229c668e1ab9dca976"
dependencies = [ dependencies = [
"parking_lot", "parking_lot",
"serde", "serde",
...@@ -9742,9 +9823,9 @@ dependencies = [ ...@@ -9742,9 +9823,9 @@ dependencies = [
[[package]] [[package]]
name = "typst-utils" name = "typst-utils"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be823333fb1860b9f725f9e2bc848f2b85e4ef62fe94a793cd9500ad9ef554a9" checksum = "0eb71d59967e0fb32341f8a94f41ced8da520c63705cca2686ae653c9408fd96"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"portable-atomic", "portable-atomic",
...@@ -9805,9 +9886,9 @@ checksum = "260bc6647b3893a9a90668360803a15f96b85a5257b1c3a0c3daf6ae2496de42" ...@@ -9805,9 +9886,9 @@ checksum = "260bc6647b3893a9a90668360803a15f96b85a5257b1c3a0c3daf6ae2496de42"
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
version = "1.0.16" version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
[[package]] [[package]]
name = "unicode-math-class" name = "unicode-math-class"
...@@ -9950,7 +10031,7 @@ version = "5.3.1" ...@@ -9950,7 +10031,7 @@ version = "5.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "435c6f69ef38c9017b4b4eea965dfb91e71e53d869e896db40d1cf2441dd75c0" checksum = "435c6f69ef38c9017b4b4eea965dfb91e71e53d869e896db40d1cf2441dd75c0"
dependencies = [ dependencies = [
"indexmap 2.7.1", "indexmap 2.8.0",
"serde", "serde",
"serde_json", "serde_json",
"utoipa-gen", "utoipa-gen",
...@@ -9990,9 +10071,9 @@ dependencies = [ ...@@ -9990,9 +10071,9 @@ dependencies = [
[[package]] [[package]]
name = "uuid" name = "uuid"
version = "1.13.1" version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587"
dependencies = [ dependencies = [
"getrandom 0.3.1", "getrandom 0.3.1",
"serde", "serde",
...@@ -10244,8 +10325,8 @@ version = "0.221.3" ...@@ -10244,8 +10325,8 @@ version = "0.221.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d06bfa36ab3ac2be0dee563380147a5b81ba10dd8885d7fbbc9eb574be67d185" checksum = "d06bfa36ab3ac2be0dee563380147a5b81ba10dd8885d7fbbc9eb574be67d185"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
"indexmap 2.7.1", "indexmap 2.8.0",
] ]
[[package]] [[package]]
...@@ -10432,6 +10513,12 @@ dependencies = [ ...@@ -10432,6 +10513,12 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "windows-link"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3"
[[package]] [[package]]
name = "windows-registry" name = "windows-registry"
version = "0.2.0" version = "0.2.0"
...@@ -10630,9 +10717,9 @@ dependencies = [ ...@@ -10630,9 +10717,9 @@ dependencies = [
[[package]] [[package]]
name = "winnow" name = "winnow"
version = "0.7.1" version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
...@@ -10653,7 +10740,7 @@ version = "0.33.0" ...@@ -10653,7 +10740,7 @@ version = "0.33.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.9.0",
] ]
[[package]] [[package]]
...@@ -10705,7 +10792,7 @@ dependencies = [ ...@@ -10705,7 +10792,7 @@ dependencies = [
"log", "log",
"opentalk-database", "opentalk-database",
"opentalk-db-storage", "opentalk-db-storage",
"rand 0.8.5", "rand 0.9.0",
"snafu", "snafu",
"tokio", "tokio",
"unified-diff", "unified-diff",
...@@ -10768,17 +10855,16 @@ version = "0.7.35" ...@@ -10768,17 +10855,16 @@ version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [ dependencies = [
"byteorder",
"zerocopy-derive 0.7.35", "zerocopy-derive 0.7.35",
] ]
[[package]] [[package]]
name = "zerocopy" name = "zerocopy"
version = "0.8.16" version = "0.8.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b8c07a70861ce02bad1607b5753ecb2501f67847b9f9ada7c160fff0ec6300c" checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6"
dependencies = [ dependencies = [
"zerocopy-derive 0.8.16", "zerocopy-derive 0.8.23",
] ]
[[package]] [[package]]
...@@ -10794,9 +10880,9 @@ dependencies = [ ...@@ -10794,9 +10880,9 @@ dependencies = [
[[package]] [[package]]
name = "zerocopy-derive" name = "zerocopy-derive"
version = "0.8.16" version = "0.8.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5226bc9a9a9836e7428936cde76bb6b22feea1a8bfdbc0d241136e4d13417e25" checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
...@@ -10805,18 +10891,18 @@ dependencies = [ ...@@ -10805,18 +10891,18 @@ dependencies = [
[[package]] [[package]]
name = "zerofrom" name = "zerofrom"
version = "0.1.5" version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
dependencies = [ dependencies = [
"zerofrom-derive", "zerofrom-derive",
] ]
[[package]] [[package]]
name = "zerofrom-derive" name = "zerofrom-derive"
version = "0.1.5" version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
...@@ -10867,18 +10953,18 @@ dependencies = [ ...@@ -10867,18 +10953,18 @@ dependencies = [
[[package]] [[package]]
name = "zip" name = "zip"
version = "2.2.2" version = "2.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae9c1ea7b3a5e1f4b922ff856a129881167511563dc219869afe3787fc0c1a45" checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50"
dependencies = [ dependencies = [
"arbitrary", "arbitrary",
"crc32fast", "crc32fast",
"crossbeam-utils", "crossbeam-utils",
"displaydoc", "displaydoc",
"flate2", "flate2",
"indexmap 2.7.1", "indexmap 2.8.0",
"memchr", "memchr",
"thiserror 2.0.11", "thiserror 2.0.12",
"zopfli", "zopfli",
] ]
...@@ -10898,27 +10984,27 @@ dependencies = [ ...@@ -10898,27 +10984,27 @@ dependencies = [
[[package]] [[package]]
name = "zstd" name = "zstd"
version = "0.13.2" version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a"
dependencies = [ dependencies = [
"zstd-safe", "zstd-safe",
] ]
[[package]] [[package]]
name = "zstd-safe" name = "zstd-safe"
version = "7.2.1" version = "7.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722"
dependencies = [ dependencies = [
"zstd-sys", "zstd-sys",
] ]
[[package]] [[package]]
name = "zstd-sys" name = "zstd-sys"
version = "2.0.13+zstd.1.5.6" version = "2.0.14+zstd.1.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5"
dependencies = [ dependencies = [
"cc", "cc",
"pkg-config", "pkg-config",
......
...@@ -10,37 +10,37 @@ resolver = "2" ...@@ -10,37 +10,37 @@ resolver = "2"
authors = ["OpenTalk Team <mail@opentalk.eu>"] authors = ["OpenTalk Team <mail@opentalk.eu>"]
homepage = "https://opentalk.eu/" homepage = "https://opentalk.eu/"
repository = "https://gitlab.opencode.de/opentalk/controller" repository = "https://gitlab.opencode.de/opentalk/controller"
version = "0.29.0" version = "0.29.1"
[workspace.dependencies] [workspace.dependencies]
kustos = { path = "crates/kustos", version = "0.29.0" } kustos = { path = "crates/kustos", version = "0.29.1" }
opentalk-cache = { path = "crates/opentalk-cache", version = "0.29.0" } opentalk-cache = { path = "crates/opentalk-cache", version = "0.29.1" }
opentalk-community-signaling-modules = { path = "crates/opentalk-community-signaling-modules", version = "0.29.0" } opentalk-community-signaling-modules = { path = "crates/opentalk-community-signaling-modules", version = "0.29.1" }
opentalk-controller-core = { path = "crates/opentalk-controller-core", version = "0.29.0" } opentalk-controller-core = { path = "crates/opentalk-controller-core", version = "0.29.1" }
opentalk-controller-service = { path = "crates/opentalk-controller-service", version = "0.29.0" } opentalk-controller-service = { path = "crates/opentalk-controller-service", version = "0.29.1" }
opentalk-controller-service-facade = { path = "crates/opentalk-controller-service-facade", version = "0.29.0" } opentalk-controller-service-facade = { path = "crates/opentalk-controller-service-facade", version = "0.29.1" }
opentalk-controller-settings = { path = "crates/opentalk-controller-settings", version = "0.29.0" } opentalk-controller-settings = { path = "crates/opentalk-controller-settings", version = "0.29.1" }
opentalk-controller-utils = { path = "crates/opentalk-controller-utils", version = "0.29.0" } opentalk-controller-utils = { path = "crates/opentalk-controller-utils", version = "0.29.1" }
opentalk-database = { path = "crates/opentalk-database", version = "0.29.0" } opentalk-database = { path = "crates/opentalk-database", version = "0.29.1" }
opentalk-db-storage = { path = "crates/opentalk-db-storage", version = "0.29.0" } opentalk-db-storage = { path = "crates/opentalk-db-storage", version = "0.29.1" }
opentalk-jobs = { path = "crates/opentalk-jobs", version = "0.29.0" } opentalk-jobs = { path = "crates/opentalk-jobs", version = "0.29.1" }
opentalk-log = { path = "crates/opentalk-log", version = "0.29.0" } opentalk-log = { path = "crates/opentalk-log", version = "0.29.1" }
opentalk-r3dlock = { path = "crates/opentalk-r3dlock", version = "0.29.0" } opentalk-r3dlock = { path = "crates/opentalk-r3dlock", version = "0.29.1" }
opentalk-report-generation = { path = "crates/opentalk-report-generation", version = "0.29.0" } opentalk-report-generation = { path = "crates/opentalk-report-generation", version = "0.29.1" }
opentalk-signaling-core = { path = "crates/opentalk-signaling-core", version = "0.29.0" } opentalk-signaling-core = { path = "crates/opentalk-signaling-core", version = "0.29.1" }
opentalk-signaling-module-chat = { path = "crates/opentalk-signaling-module-chat", version = "0.29.0" } opentalk-signaling-module-chat = { path = "crates/opentalk-signaling-module-chat", version = "0.29.1" }
opentalk-signaling-module-core = { path = "crates/opentalk-signaling-module-core", version = "0.29.0" } opentalk-signaling-module-core = { path = "crates/opentalk-signaling-module-core", version = "0.29.1" }
opentalk-signaling-module-integration = { path = "crates/opentalk-signaling-module-integration", version = "0.29.0" } opentalk-signaling-module-integration = { path = "crates/opentalk-signaling-module-integration", version = "0.29.1" }
opentalk-signaling-module-livekit = { path = "crates/opentalk-signaling-module-livekit", version = "0.29.0" } opentalk-signaling-module-livekit = { path = "crates/opentalk-signaling-module-livekit", version = "0.29.1" }
opentalk-signaling-module-meeting-notes = { path = "crates/opentalk-signaling-module-meeting-notes", version = "0.29.0" } opentalk-signaling-module-meeting-notes = { path = "crates/opentalk-signaling-module-meeting-notes", version = "0.29.1" }
opentalk-signaling-module-meeting-report = { path = "crates/opentalk-signaling-module-meeting-report", version = "0.29.0" } opentalk-signaling-module-meeting-report = { path = "crates/opentalk-signaling-module-meeting-report", version = "0.29.1" }
opentalk-signaling-module-polls = { path = "crates/opentalk-signaling-module-polls", version = "0.29.0" } opentalk-signaling-module-polls = { path = "crates/opentalk-signaling-module-polls", version = "0.29.1" }
opentalk-signaling-module-shared-folder = { path = "crates/opentalk-signaling-module-shared-folder", version = "0.29.0" } opentalk-signaling-module-shared-folder = { path = "crates/opentalk-signaling-module-shared-folder", version = "0.29.1" }
opentalk-signaling-module-subroom-audio = { path = "crates/opentalk-signaling-module-subroom-audio", version = "0.29.0" } opentalk-signaling-module-subroom-audio = { path = "crates/opentalk-signaling-module-subroom-audio", version = "0.29.1" }
opentalk-signaling-module-timer = { path = "crates/opentalk-signaling-module-timer", version = "0.29.0" } opentalk-signaling-module-timer = { path = "crates/opentalk-signaling-module-timer", version = "0.29.1" }
opentalk-signaling-module-training-participation-report = { path = "crates/opentalk-signaling-module-training-participation-report", version = "0.29.0" } opentalk-signaling-module-training-participation-report = { path = "crates/opentalk-signaling-module-training-participation-report", version = "0.29.1" }
opentalk-signaling-module-whiteboard = { path = "crates/opentalk-signaling-module-whiteboard", version = "0.29.0" } opentalk-signaling-module-whiteboard = { path = "crates/opentalk-signaling-module-whiteboard", version = "0.29.1" }
opentalk-test-util = { path = "crates/opentalk-test-util", version = "0.29.0" } opentalk-test-util = { path = "crates/opentalk-test-util", version = "0.29.1" }
actix-http = "3" actix-http = "3"
actix-rt = "2" actix-rt = "2"
...@@ -92,8 +92,8 @@ opentalk-mail-worker-protocol = "0.32" ...@@ -92,8 +92,8 @@ opentalk-mail-worker-protocol = "0.32"
opentalk-nextcloud-client = { version = "0.2.0", default-features = false, features = [ opentalk-nextcloud-client = { version = "0.2.0", default-features = false, features = [
"rustls-tls-native-roots", "rustls-tls-native-roots",
] } ] }
opentalk-types-api-v1 = "0.33" opentalk-types-api-v1 = "0.34"
opentalk-types-common = "0.32" opentalk-types-common = "0.32.1"
opentalk-types-signaling = "0.32" opentalk-types-signaling = "0.32"
opentalk-types-signaling-breakout = "0.32" opentalk-types-signaling-breakout = "0.32"
opentalk-types-signaling-chat = "0.32" opentalk-types-signaling-chat = "0.32"
...@@ -108,7 +108,7 @@ opentalk-types-signaling-recording-service = "0.32" ...@@ -108,7 +108,7 @@ opentalk-types-signaling-recording-service = "0.32"
opentalk-types-signaling-shared-folder = "0.32" opentalk-types-signaling-shared-folder = "0.32"
opentalk-types-signaling-subroom-audio = "0.32" opentalk-types-signaling-subroom-audio = "0.32"
opentalk-types-signaling-timer = "0.32" opentalk-types-signaling-timer = "0.32"
opentalk-types-signaling-training-participation-report = "0.2" opentalk-types-signaling-training-participation-report = "0.3"
opentalk-types-signaling-whiteboard = "0.32" opentalk-types-signaling-whiteboard = "0.32"
opentalk-version = "0.1.1" opentalk-version = "0.1.1"
opentelemetry = { version = "0.27", default-features = false, features = [ opentelemetry = { version = "0.27", default-features = false, features = [
...@@ -120,7 +120,8 @@ parking_lot = "0.12" ...@@ -120,7 +120,8 @@ parking_lot = "0.12"
pdf-extract = "0.8" pdf-extract = "0.8"
phonenumber = "0.3" phonenumber = "0.3"
pretty_assertions = "1" pretty_assertions = "1"
rand = "0.8" rand = "0.9"
rand_chacha = "0.9"
redis = "0.29" redis = "0.29"
redis-args = "0.19" redis-args = "0.19"
reqwest = { version = "0.12", default-features = false } reqwest = { version = "0.12", default-features = false }
......
...@@ -9,7 +9,7 @@ info: ...@@ -9,7 +9,7 @@ info:
license: license:
name: EUPL-1.2 name: EUPL-1.2
identifier: EUPL-1.2 identifier: EUPL-1.2
version: 0.29.0 version: 0.29.1
servers: servers:
- url: /v1 - url: /v1
paths: paths:
...@@ -3095,6 +3095,13 @@ components: ...@@ -3095,6 +3095,13 @@ components:
title: title:
$ref: "#/components/schemas/EventTitle" $ref: "#/components/schemas/EventTitle"
description: Title of the event description: Title of the event
training_participation_report:
$ref: "#/components/schemas/TrainingParticipationReportParameterSet"
description: |-
The training participation report parameter set for the event.
When present, the training participation report will be started
automatically in the meeting.
type: type:
$ref: "#/components/schemas/EventType" $ref: "#/components/schemas/EventType"
description: "Must always be `instance`" description: "Must always be `instance`"
...@@ -3158,6 +3165,13 @@ components: ...@@ -3158,6 +3165,13 @@ components:
timezone: Europe/Berlin timezone: Europe/Berlin
status: ok status: ok
title: Team Event title: Team Event
training_participation_report:
checkpoint_interval:
after: 300
within: 400
initial_checkpoint_delay:
after: 100
within: 200
type: recurring type: recurring
updated_at: "2024-07-20T14:16:19Z" updated_at: "2024-07-20T14:16:19Z"
updated_by: updated_by:
...@@ -3315,6 +3329,13 @@ components: ...@@ -3315,6 +3329,13 @@ components:
streaming_endpoint: "https://ingress.streaming.example.com/" streaming_endpoint: "https://ingress.streaming.example.com/"
streaming_key: aabbccddeeff streaming_key: aabbccddeeff
title: Team Event title: Team Event
training_participation_report:
checkpoint_interval:
after: 300
within: 400
initial_checkpoint_delay:
after: 100
within: 200
type: single type: single
updated_at: "2024-07-20T14:16:19Z" updated_at: "2024-07-20T14:16:19Z"
updated_by: updated_by:
...@@ -3453,6 +3474,13 @@ components: ...@@ -3453,6 +3474,13 @@ components:
Title of the event Title of the event
For display purposes For display purposes
training_participation_report:
$ref: "#/components/schemas/TrainingParticipationReportParameterSet"
description: |-
The training participation report parameter set for the event.
When present, the training participation report will be started
automatically in the meeting.
type: type:
$ref: "#/components/schemas/EventType" $ref: "#/components/schemas/EventType"
description: |- description: |-
...@@ -3520,6 +3548,13 @@ components: ...@@ -3520,6 +3548,13 @@ components:
streaming_endpoint: "https://ingress.streaming.example.com/" streaming_endpoint: "https://ingress.streaming.example.com/"
streaming_key: aabbccddeeff streaming_key: aabbccddeeff
title: Team Event title: Team Event
training_participation_report:
checkpoint_interval:
after: 300
within: 400
initial_checkpoint_delay:
after: 100
within: 200
type: single type: single
updated_at: "2024-07-20T14:16:19Z" updated_at: "2024-07-20T14:16:19Z"
updated_by: updated_by:
...@@ -3666,6 +3701,13 @@ components: ...@@ -3666,6 +3701,13 @@ components:
timezone: Europe/Berlin timezone: Europe/Berlin
status: ok status: ok
title: Team Event title: Team Event
training_participation_report:
checkpoint_interval:
after: 300
within: 400
initial_checkpoint_delay:
after: 100
within: 200
type: recurring type: recurring
updated_at: "2024-07-20T14:16:19Z" updated_at: "2024-07-20T14:16:19Z"
updated_by: updated_by:
...@@ -4037,6 +4079,13 @@ components: ...@@ -4037,6 +4079,13 @@ components:
title: title:
$ref: "#/components/schemas/EventTitle" $ref: "#/components/schemas/EventTitle"
description: Patch the title of th event description: Patch the title of th event
training_participation_report:
$ref: "#/components/schemas/TrainingParticipationReportParameterSet"
description: |-
The training participation report parameter set for the event.
When present, the training participation report will be started
automatically in the meeting.
waiting_room: waiting_room:
type: boolean type: boolean
description: Patch the presence of a waiting room description: Patch the presence of a waiting room
...@@ -4243,6 +4292,13 @@ components: ...@@ -4243,6 +4292,13 @@ components:
title: title:
$ref: "#/components/schemas/EventTitle" $ref: "#/components/schemas/EventTitle"
description: Title of the event description: Title of the event
training_participation_report:
$ref: "#/components/schemas/TrainingParticipationReportParameterSet"
description: |-
The training participation report parameter set for the event.
When present, the training participation report will be started
automatically in the meeting.
waiting_room: waiting_room:
type: boolean type: boolean
description: Should the created event have a waiting room? description: Should the created event have a waiting room?
...@@ -4269,6 +4325,13 @@ components: ...@@ -4269,6 +4325,13 @@ components:
streaming_endpoint: "https://ingress.streaming.example.com/" streaming_endpoint: "https://ingress.streaming.example.com/"
streaming_key: aabbccddeeff streaming_key: aabbccddeeff
title: Teammeeting title: Teammeeting
training_participation_report:
checkpoint_interval:
after: 300
within: 400
initial_checkpoint_delay:
after: 100
within: 200
waiting_room: false waiting_room: false
PostInviteRequestBody: PostInviteRequestBody:
type: object type: object
...@@ -4983,6 +5046,26 @@ components: ...@@ -4983,6 +5046,26 @@ components:
TicketToken: TicketToken:
type: string type: string
description: A ticket token description: A ticket token
TimeRange:
type: object
description: A time range within which checkpoints can be randomly created
required:
- after
- within
properties:
after:
type: integer
format: int64
description: The earliest number of seconds after which the checkpoint can be created.
minimum: 0
within:
type: integer
format: int64
description: "The number of seconds within which the checkpoint can be created after the `after` value."
minimum: 0
example:
after: 1200
within: 600
TimeZone: TimeZone:
type: string type: string
description: A time zone description: A time zone
...@@ -4995,6 +5078,26 @@ components: ...@@ -4995,6 +5078,26 @@ components:
A UTC DateTime wrapper that implements ToRedisArgs and FromRedisValue. A UTC DateTime wrapper that implements ToRedisArgs and FromRedisValue.
The values are stores as unix timestamps in redis. The values are stores as unix timestamps in redis.
TrainingParticipationReportParameterSet:
type: object
description: The parameters for a training participant report checkpoint procedure.
required:
- initial_checkpoint_delay
- checkpoint_interval
properties:
checkpoint_interval:
$ref: "#/components/schemas/TimeRange"
description: The time range definition for the subsequent checkpoints.
initial_checkpoint_delay:
$ref: "#/components/schemas/TimeRange"
description: The time range definition for the initial checkpoint delay.
example:
checkpoint_interval:
after: 300
within: 400
initial_checkpoint_delay:
after: 100
within: 200
TurnServer: TurnServer:
type: object type: object
description: TURN access credentials for users. description: TURN access credentials for users.
......
...@@ -121,6 +121,7 @@ yaml-rust2.workspace = true ...@@ -121,6 +121,7 @@ yaml-rust2.workspace = true
[dev-dependencies] [dev-dependencies]
opentalk-test-util = { workspace = true, features = ["database"] } opentalk-test-util = { workspace = true, features = ["database"] }
pretty_assertions.workspace = true pretty_assertions.workspace = true
rand_chacha.workspace = true
serial_test.workspace = true serial_test.workspace = true
[build-dependencies] [build-dependencies]
......
...@@ -36,6 +36,7 @@ use opentalk_types_api_v1::{ ...@@ -36,6 +36,7 @@ use opentalk_types_api_v1::{
use opentalk_types_common::{ use opentalk_types_common::{
events::{invites::EventInviteStatus, EventId}, events::{invites::EventInviteStatus, EventId},
shared_folders::SharedFolder, shared_folders::SharedFolder,
training_participation_report::TrainingParticipationReportParameterSet,
}; };
use rrule::RRuleSet; use rrule::RRuleSet;
...@@ -151,8 +152,16 @@ async fn get_event_instances_inner( ...@@ -151,8 +152,16 @@ async fn get_event_instances_inner(
let mut conn = db.get_conn().await?; let mut conn = db.get_conn().await?;
let (event, invite, room, sip_config, is_favorite, shared_folder, tariff) = let (
Event::get_with_related_items(&mut conn, current_user.id, event_id).await?; event,
invite,
room,
sip_config,
is_favorite,
shared_folder,
tariff,
training_participation_report_parameter_set,
) = Event::get_with_related_items(&mut conn, current_user.id, event_id).await?;
let (invitees, invitees_truncated) = let (invitees, invitees_truncated) =
super::get_invitees_for_event(settings, &mut conn, event.id, invitees_max).await?; super::get_invitees_for_event(settings, &mut conn, event.id, invitees_max).await?;
...@@ -198,6 +207,9 @@ async fn get_event_instances_inner( ...@@ -198,6 +207,9 @@ async fn get_event_instances_inner(
.fetch(settings, &mut conn) .fetch(settings, &mut conn)
.await?; .await?;
let training_participation_report = training_participation_report_parameter_set
.map(TrainingParticipationReportParameterSet::from);
drop(conn); drop(conn);
let room = EventRoomInfo::from_room(settings, room, sip_config, &tariff); let room = EventRoomInfo::from_room(settings, room, sip_config, &tariff);
...@@ -225,6 +237,7 @@ async fn get_event_instances_inner( ...@@ -225,6 +237,7 @@ async fn get_event_instances_inner(
invitees_truncated, invitees_truncated,
can_edit, can_edit,
shared_folder.clone(), shared_folder.clone(),
training_participation_report.clone(),
)?; )?;
instances.push(instance); instances.push(instance);
...@@ -341,8 +354,16 @@ async fn get_event_instance_inner( ...@@ -341,8 +354,16 @@ async fn get_event_instance_inner(
) -> DefaultApiResult<GetEventInstanceResponseBody, CaptureApiError> { ) -> DefaultApiResult<GetEventInstanceResponseBody, CaptureApiError> {
let mut conn = db.get_conn().await?; let mut conn = db.get_conn().await?;
let (event, invite, room, sip_config, is_favorite, shared_folder, tariff) = let (
Event::get_with_related_items(&mut conn, current_user.id, event_id).await?; event,
invite,
room,
sip_config,
is_favorite,
shared_folder,
tariff,
training_participation_report_parameter_set,
) = Event::get_with_related_items(&mut conn, current_user.id, event_id).await?;
verify_recurrence_date(&event, instance_id.into())?; verify_recurrence_date(&event, instance_id.into())?;
let (invitees, invitees_truncated) = let (invitees, invitees_truncated) =
...@@ -376,6 +397,7 @@ async fn get_event_instance_inner( ...@@ -376,6 +397,7 @@ async fn get_event_instance_inner(
invitees_truncated, invitees_truncated,
can_edit, can_edit,
shared_folder, shared_folder,
training_participation_report_parameter_set.map(Into::into),
)?; )?;
let event_instance = EventInstance { let event_instance = EventInstance {
...@@ -490,8 +512,16 @@ async fn patch_event_instance_inner( ...@@ -490,8 +512,16 @@ async fn patch_event_instance_inner(
let mut conn = db.get_conn().await?; let mut conn = db.get_conn().await?;
let (event, invite, room, sip_config, is_favorite, shared_folder, tariff) = let (
Event::get_with_related_items(&mut conn, current_user.id, event_id).await?; event,
invite,
room,
sip_config,
is_favorite,
shared_folder,
tariff,
training_participation_report_parameter_set,
) = Event::get_with_related_items(&mut conn, current_user.id, event_id).await?;
if !event.is_recurring.unwrap_or_default() { if !event.is_recurring.unwrap_or_default() {
return Err(ApiError::not_found().into()); return Err(ApiError::not_found().into());
...@@ -648,6 +678,7 @@ async fn patch_event_instance_inner( ...@@ -648,6 +678,7 @@ async fn patch_event_instance_inner(
invitees_truncated, invitees_truncated,
can_edit, can_edit,
shared_folder, shared_folder,
training_participation_report_parameter_set.map(Into::into),
)?; )?;
let event_instance = EventInstance { let event_instance = EventInstance {
...@@ -677,6 +708,7 @@ fn create_event_instance( ...@@ -677,6 +708,7 @@ fn create_event_instance(
invitees_truncated: bool, invitees_truncated: bool,
can_edit: bool, can_edit: bool,
shared_folder: Option<SharedFolder>, shared_folder: Option<SharedFolder>,
training_participation_report: Option<TrainingParticipationReportParameterSet>,
) -> opentalk_database::Result<EventInstance> { ) -> opentalk_database::Result<EventInstance> {
let mut status = EventStatus::Ok; let mut status = EventStatus::Ok;
...@@ -741,6 +773,7 @@ fn create_event_instance( ...@@ -741,6 +773,7 @@ fn create_event_instance(
is_favorite, is_favorite,
can_edit, can_edit,
shared_folder, shared_folder,
training_participation_report,
}) })
} }
...@@ -849,6 +882,7 @@ mod tests { ...@@ -849,6 +882,7 @@ mod tests {
is_favorite: false, is_favorite: false,
can_edit: false, can_edit: false,
shared_folder: None, shared_folder: None,
training_participation_report: None,
}; };
assert_eq_json!( assert_eq_json!(
......
...@@ -912,8 +912,16 @@ async fn delete_invite_to_event_inner( ...@@ -912,8 +912,16 @@ async fn delete_invite_to_event_inner(
let mut conn = db.get_conn().await?; let mut conn = db.get_conn().await?;
// TODO(w.rabl) Further DB access optimization (replacing call to get_with_invite_and_room)? // TODO(w.rabl) Further DB access optimization (replacing call to get_with_invite_and_room)?
let (event, _invite, room, sip_config, _is_favorite, shared_folder, _tariff) = let (
Event::get_with_related_items(&mut conn, current_user.id, event_id).await?; event,
_invite,
room,
sip_config,
_is_favorite,
shared_folder,
_tariff,
_training_participation_report_parameter_set,
) = Event::get_with_related_items(&mut conn, current_user.id, event_id).await?;
let streaming_targets = get_room_streaming_targets(&mut conn, room.id).await?; let streaming_targets = get_room_streaming_targets(&mut conn, room.id).await?;
let created_by = if event.created_by == current_user.id { let created_by = if event.created_by == current_user.id {
...@@ -1069,8 +1077,16 @@ async fn delete_email_invite_to_event_inner( ...@@ -1069,8 +1077,16 @@ async fn delete_email_invite_to_event_inner(
let mut conn = db.get_conn().await?; let mut conn = db.get_conn().await?;
let (event, _invite, room, sip_config, _is_favorite, shared_folder, _tariff) = let (
Event::get_with_related_items(&mut conn, current_user.id, event_id).await?; event,
_invite,
room,
sip_config,
_is_favorite,
shared_folder,
_tariff,
_training_participation_report_parameter_set,
) = Event::get_with_related_items(&mut conn, current_user.id, event_id).await?;
let streaming_targets = get_room_streaming_targets(&mut conn, room.id).await?; let streaming_targets = get_room_streaming_targets(&mut conn, room.id).await?;
let created_by = if event.created_by == current_user.id { let created_by = if event.created_by == current_user.id {
......
...@@ -30,7 +30,8 @@ use opentalk_database::{Db, DbConnection}; ...@@ -30,7 +30,8 @@ use opentalk_database::{Db, DbConnection};
use opentalk_db_storage::{ use opentalk_db_storage::{
events::{ events::{
email_invites::EventEmailInvite, shared_folders::EventSharedFolder, Event, EventException, email_invites::EventEmailInvite, shared_folders::EventSharedFolder, Event, EventException,
EventExceptionKind, EventInvite, NewEvent, UpdateEvent, EventExceptionKind, EventInvite, EventTrainingParticipationReportParameterSet, NewEvent,
UpdateEvent, UpdateEventTrainingParticipationReportParameterSet,
}, },
invites::Invite, invites::Invite,
rooms::{NewRoom, Room, UpdateRoom}, rooms::{NewRoom, Room, UpdateRoom},
...@@ -63,6 +64,7 @@ use opentalk_types_common::{ ...@@ -63,6 +64,7 @@ use opentalk_types_common::{
shared_folders::{SharedFolder, SharedFolderAccess}, shared_folders::{SharedFolder, SharedFolderAccess},
streaming::{RoomStreamingTarget, StreamingTarget}, streaming::{RoomStreamingTarget, StreamingTarget},
time::{DateTimeTz, RecurrencePattern, TimeZone, Timestamp}, time::{DateTimeTz, RecurrencePattern, TimeZone, Timestamp},
training_participation_report::TrainingParticipationReportParameterSet,
users::UserId, users::UserId,
}; };
use rrule::{Frequency, RRuleSet}; use rrule::{Frequency, RRuleSet};
...@@ -334,6 +336,7 @@ async fn new_event_inner( ...@@ -334,6 +336,7 @@ async fn new_event_inner(
streaming_targets, streaming_targets,
has_shared_folder: _, has_shared_folder: _,
show_meeting_details, show_meeting_details,
training_participation_report
} if recurrence_pattern.is_empty() => { } if recurrence_pattern.is_empty() => {
create_time_independent_event( create_time_independent_event(
settings, settings,
...@@ -348,6 +351,7 @@ async fn new_event_inner( ...@@ -348,6 +351,7 @@ async fn new_event_inner(
streaming_targets, streaming_targets,
show_meeting_details, show_meeting_details,
query, query,
training_participation_report
) )
.await? .await?
} }
...@@ -366,6 +370,7 @@ async fn new_event_inner( ...@@ -366,6 +370,7 @@ async fn new_event_inner(
streaming_targets, streaming_targets,
has_shared_folder: _, has_shared_folder: _,
show_meeting_details, show_meeting_details,
training_participation_report
} => { } => {
create_time_dependent_event( create_time_dependent_event(
settings, settings,
...@@ -384,6 +389,7 @@ async fn new_event_inner( ...@@ -384,6 +389,7 @@ async fn new_event_inner(
streaming_targets, streaming_targets,
show_meeting_details, show_meeting_details,
query, query,
training_participation_report
) )
.await? .await?
} }
...@@ -458,6 +464,34 @@ async fn store_event_streaming_targets( ...@@ -458,6 +464,34 @@ async fn store_event_streaming_targets(
Ok(room_streaming_targets) Ok(room_streaming_targets)
} }
async fn store_training_participation_report(
conn: &mut DbConnection,
event_id: EventId,
TrainingParticipationReportParameterSet {
initial_checkpoint_delay,
checkpoint_interval,
}: TrainingParticipationReportParameterSet,
) -> Result<Option<TrainingParticipationReportParameterSet>, CaptureApiError> {
let initial_checkpoint_delay_after =
i64::try_from(initial_checkpoint_delay.after).unwrap_or(i64::MAX);
let initial_checkpoint_delay_within =
i64::try_from(initial_checkpoint_delay.within).unwrap_or(i64::MAX);
let checkpoint_interval_after = i64::try_from(checkpoint_interval.after).unwrap_or(i64::MAX);
let checkpoint_interval_within = i64::try_from(checkpoint_interval.within).unwrap_or(i64::MAX);
let inserted = EventTrainingParticipationReportParameterSet {
event_id,
initial_checkpoint_delay_after,
initial_checkpoint_delay_within,
checkpoint_interval_after,
checkpoint_interval_within,
}
.try_insert(conn)
.await?;
Ok(inserted.map(Into::into))
}
struct MailResource { struct MailResource {
pub current_user: User, pub current_user: User,
pub event: Event, pub event: Event,
...@@ -480,6 +514,7 @@ async fn create_time_independent_event( ...@@ -480,6 +514,7 @@ async fn create_time_independent_event(
streaming_targets: Vec<StreamingTarget>, streaming_targets: Vec<StreamingTarget>,
show_meeting_details: bool, show_meeting_details: bool,
query: EventOptionsQuery, query: EventOptionsQuery,
training_participation_report: Option<TrainingParticipationReportParameterSet>,
) -> Result<(EventResource, Option<MailResource>), CaptureApiError> { ) -> Result<(EventResource, Option<MailResource>), CaptureApiError> {
let room = NewRoom { let room = NewRoom {
created_by: current_user.id, created_by: current_user.id,
...@@ -518,6 +553,12 @@ async fn create_time_independent_event( ...@@ -518,6 +553,12 @@ async fn create_time_independent_event(
let streaming_targets = let streaming_targets =
store_event_streaming_targets(conn, event.id, streaming_targets).await?; store_event_streaming_targets(conn, event.id, streaming_targets).await?;
let training_participation_report = if let Some(parameters) = training_participation_report {
store_training_participation_report(conn, event.id, parameters).await?
} else {
None
};
let tariff = Tariff::get_by_user_id(conn, &current_user.id).await?; let tariff = Tariff::get_by_user_id(conn, &current_user.id).await?;
let suppress_email_notification = is_adhoc || query.suppress_email_notification; let suppress_email_notification = is_adhoc || query.suppress_email_notification;
...@@ -554,6 +595,7 @@ async fn create_time_independent_event( ...@@ -554,6 +595,7 @@ async fn create_time_independent_event(
shared_folder: None, shared_folder: None,
streaming_targets, streaming_targets,
show_meeting_details, show_meeting_details,
training_participation_report,
}, },
mail_resource, mail_resource,
)) ))
...@@ -578,6 +620,7 @@ async fn create_time_dependent_event( ...@@ -578,6 +620,7 @@ async fn create_time_dependent_event(
streaming_targets: Vec<StreamingTarget>, streaming_targets: Vec<StreamingTarget>,
show_meeting_details: bool, show_meeting_details: bool,
query: EventOptionsQuery, query: EventOptionsQuery,
training_participation_report: Option<TrainingParticipationReportParameterSet>,
) -> Result<(EventResource, Option<MailResource>), CaptureApiError> { ) -> Result<(EventResource, Option<MailResource>), CaptureApiError> {
let recurrence_pattern = recurrence_pattern.to_multiline_string(); let recurrence_pattern = recurrence_pattern.to_multiline_string();
...@@ -625,6 +668,12 @@ async fn create_time_dependent_event( ...@@ -625,6 +668,12 @@ async fn create_time_dependent_event(
let suppress_email_notification = is_adhoc || query.suppress_email_notification; let suppress_email_notification = is_adhoc || query.suppress_email_notification;
let training_participation_report = if let Some(parameters) = training_participation_report {
store_training_participation_report(conn, event.id, parameters).await?
} else {
None
};
let mail_resource = (!suppress_email_notification).then(|| MailResource { let mail_resource = (!suppress_email_notification).then(|| MailResource {
current_user: current_user.clone(), current_user: current_user.clone(),
event: event.clone(), event: event.clone(),
...@@ -664,6 +713,7 @@ async fn create_time_dependent_event( ...@@ -664,6 +713,7 @@ async fn create_time_dependent_event(
shared_folder: None, shared_folder: None,
streaming_targets, streaming_targets,
show_meeting_details, show_meeting_details,
training_participation_report,
}, },
mail_resource, mail_resource,
)) ))
...@@ -771,7 +821,7 @@ async fn get_events_inner( ...@@ -771,7 +821,7 @@ async fn get_events_inner(
) )
.await?; .await?;
for (event, _, _, _, exceptions, _, _, _) in &events { for (event, _, _, _, exceptions, _, _, _, _) in &events {
users.add(event); users.add(event);
users.add(exceptions); users.add(exceptions);
} }
...@@ -809,7 +859,17 @@ async fn get_events_inner( ...@@ -809,7 +859,17 @@ async fn get_events_inner(
let mut ret_cursor_data = None; let mut ret_cursor_data = None;
for ( for (
(event, invite, room, sip_config, exceptions, is_favorite, shared_folder, tariff), (
event,
invite,
room,
sip_config,
exceptions,
is_favorite,
shared_folder,
tariff,
training_participation_report,
),
(mut invites_with_user, mut email_invites), (mut invites_with_user, mut email_invites),
) in events.into_iter().zip(invites_grouped_by_event) ) in events.into_iter().zip(invites_grouped_by_event)
{ {
...@@ -884,6 +944,7 @@ async fn get_events_inner( ...@@ -884,6 +944,7 @@ async fn get_events_inner(
shared_folder, shared_folder,
streaming_targets: Vec::new(), streaming_targets: Vec::new(),
show_meeting_details: event.show_meeting_details, show_meeting_details: event.show_meeting_details,
training_participation_report,
})); }));
for exception in exceptions { for exception in exceptions {
...@@ -994,8 +1055,16 @@ async fn get_event_inner( ...@@ -994,8 +1055,16 @@ async fn get_event_inner(
) -> DefaultApiResult<EventResource, CaptureApiError> { ) -> DefaultApiResult<EventResource, CaptureApiError> {
let mut conn = db.get_conn().await?; let mut conn = db.get_conn().await?;
let (event, invite, room, sip_config, is_favorite, shared_folder, tariff) = let (
Event::get_with_related_items(&mut conn, current_user.id, event_id).await?; event,
invite,
room,
sip_config,
is_favorite,
shared_folder,
tariff,
training_participation_report,
) = Event::get_with_related_items(&mut conn, current_user.id, event_id).await?;
let room_streaming_targets = get_room_streaming_targets(&mut conn, room.id).await?; let room_streaming_targets = get_room_streaming_targets(&mut conn, room.id).await?;
let (invitees, invitees_truncated) = let (invitees, invitees_truncated) =
get_invitees_for_event(settings, &mut conn, event_id, query.invitees_max).await?; get_invitees_for_event(settings, &mut conn, event_id, query.invitees_max).await?;
...@@ -1047,6 +1116,7 @@ async fn get_event_inner( ...@@ -1047,6 +1116,7 @@ async fn get_event_inner(
shared_folder, shared_folder,
streaming_targets: room_streaming_targets, streaming_targets: room_streaming_targets,
show_meeting_details: event.show_meeting_details, show_meeting_details: event.show_meeting_details,
training_participation_report: training_participation_report.map(Into::into),
}; };
let event_resource = EventResource { let event_resource = EventResource {
...@@ -1165,8 +1235,16 @@ async fn patch_event_inner( ...@@ -1165,8 +1235,16 @@ async fn patch_event_inner(
let mut conn = db.get_conn().await?; let mut conn = db.get_conn().await?;
let (event, invite, room, sip_config, is_favorite, shared_folder, tariff) = let (
Event::get_with_related_items(&mut conn, current_user.id, event_id).await?; event,
invite,
room,
sip_config,
is_favorite,
shared_folder,
tariff,
training_participation_report,
) = Event::get_with_related_items(&mut conn, current_user.id, event_id).await?;
let room = if patch.password.is_some() || patch.waiting_room.is_some() { let room = if patch.password.is_some() || patch.waiting_room.is_some() {
// Update the event's room if at least one of the fields is set // Update the event's room if at least one of the fields is set
...@@ -1205,6 +1283,19 @@ async fn patch_event_inner( ...@@ -1205,6 +1283,19 @@ async fn patch_event_inner(
None => {} None => {}
} }
let training_participation_report = match &patch.training_participation_report {
Some(Some(parameter_set)) => Some(
UpdateEventTrainingParticipationReportParameterSet::from(parameter_set.clone())
.apply(&mut conn, event.id)
.await?,
),
Some(None) => {
EventTrainingParticipationReportParameterSet::delete_by_id(&mut conn, event.id).await?;
None
}
None => training_participation_report,
};
// Special case: if the patch only modifies the password do not update the event // Special case: if the patch only modifies the password do not update the event
let event = if patch.only_modifies_room() { let event = if patch.only_modifies_room() {
event event
...@@ -1304,6 +1395,7 @@ async fn patch_event_inner( ...@@ -1304,6 +1395,7 @@ async fn patch_event_inner(
shared_folder: shared_folder.clone(), shared_folder: shared_folder.clone(),
streaming_targets: streaming_targets.clone(), streaming_targets: streaming_targets.clone(),
show_meeting_details: event.show_meeting_details, show_meeting_details: event.show_meeting_details,
training_participation_report: training_participation_report.map(Into::into),
}; };
if send_email_notification { if send_email_notification {
...@@ -1344,8 +1436,16 @@ pub async fn notify_event_invitees_by_room_about_update( ...@@ -1344,8 +1436,16 @@ pub async fn notify_event_invitees_by_room_about_update(
let event = Event::get_for_room(conn, room_id).await?; let event = Event::get_for_room(conn, room_id).await?;
if let Some(event) = event { if let Some(event) = event {
let (event, _invite, room, sip_config, _is_favorite, shared_folder, _tariff) = let (
Event::get_with_related_items(conn, current_user.id, event.id).await?; event,
_invite,
room,
sip_config,
_is_favorite,
shared_folder,
_tariff,
_training_participation_report_parameter_set,
) = Event::get_with_related_items(conn, current_user.id, event.id).await?;
let shared_folder_for_user = let shared_folder_for_user =
shared_folder_for_user(shared_folder, event.created_by, current_user.id); shared_folder_for_user(shared_folder, event.created_by, current_user.id);
...@@ -1734,8 +1834,16 @@ async fn delete_event_inner( ...@@ -1734,8 +1834,16 @@ async fn delete_event_inner(
let mut conn = db.get_conn().await?; let mut conn = db.get_conn().await?;
// TODO(w.rabl) Further DB access optimization (replacing call to get_with_invite_and_room)? // TODO(w.rabl) Further DB access optimization (replacing call to get_with_invite_and_room)?
let (event, _invite, room, sip_config, _is_favorite, shared_folder, _tariff) = let (
Event::get_with_related_items(&mut conn, current_user.id, event_id).await?; event,
_invite,
room,
sip_config,
_is_favorite,
shared_folder,
_tariff,
_training_participation_report,
) = Event::get_with_related_items(&mut conn, current_user.id, event_id).await?;
let streaming_targets = get_room_streaming_targets(&mut conn, room.id).await?; let streaming_targets = get_room_streaming_targets(&mut conn, room.id).await?;
...@@ -2253,7 +2361,10 @@ mod tests { ...@@ -2253,7 +2361,10 @@ mod tests {
use std::time::SystemTime; use std::time::SystemTime;
use opentalk_test_util::assert_eq_json; use opentalk_test_util::assert_eq_json;
use opentalk_types_common::events::invites::InviteRole; use opentalk_types_common::{
events::invites::InviteRole, rooms::RoomId, training_participation_report::TimeRange,
users::UserId,
};
use super::*; use super::*;
...@@ -2330,6 +2441,16 @@ mod tests { ...@@ -2330,6 +2441,16 @@ mod tests {
shared_folder: None, shared_folder: None,
streaming_targets: Vec::new(), streaming_targets: Vec::new(),
show_meeting_details: true, show_meeting_details: true,
training_participation_report: Some(TrainingParticipationReportParameterSet {
initial_checkpoint_delay: TimeRange {
after: 100,
within: 200,
},
checkpoint_interval: TimeRange {
after: 300,
within: 400,
},
}),
}; };
assert_eq_json!( assert_eq_json!(
...@@ -2396,6 +2517,16 @@ mod tests { ...@@ -2396,6 +2517,16 @@ mod tests {
"can_edit": true, "can_edit": true,
"is_adhoc": false, "is_adhoc": false,
"show_meeting_details": true, "show_meeting_details": true,
"training_participation_report": {
"initial_checkpoint_delay": {
"after": 100,
"within": 200,
},
"checkpoint_interval": {
"after": 300,
"within": 400,
},
},
} }
); );
} }
...@@ -2457,6 +2588,16 @@ mod tests { ...@@ -2457,6 +2588,16 @@ mod tests {
shared_folder: None, shared_folder: None,
streaming_targets: Vec::new(), streaming_targets: Vec::new(),
show_meeting_details: false, show_meeting_details: false,
training_participation_report: Some(TrainingParticipationReportParameterSet {
initial_checkpoint_delay: TimeRange {
after: 100,
within: 200,
},
checkpoint_interval: TimeRange {
after: 300,
within: 400,
},
}),
}; };
assert_eq_json!( assert_eq_json!(
...@@ -2519,6 +2660,16 @@ mod tests { ...@@ -2519,6 +2660,16 @@ mod tests {
"can_edit": false, "can_edit": false,
"is_adhoc": false, "is_adhoc": false,
"show_meeting_details": false, "show_meeting_details": false,
"training_participation_report": {
"initial_checkpoint_delay": {
"after": 100,
"within": 200,
},
"checkpoint_interval": {
"after": 300,
"within": 400,
},
},
} }
); );
} }
......
...@@ -200,8 +200,16 @@ async fn put_shared_folder_for_event_inner( ...@@ -200,8 +200,16 @@ async fn put_shared_folder_for_event_inner(
let (shared_folder, created) = put_shared_folder(settings, event_id, &mut conn).await?; let (shared_folder, created) = put_shared_folder(settings, event_id, &mut conn).await?;
let (event, _invite, room, sip_config, _is_favorite, _shared_folder, _tariff) = let (
Event::get_with_related_items(&mut conn, current_user.id, event_id).await?; event,
_invite,
room,
sip_config,
_is_favorite,
_shared_folder,
_tariff,
_training_participation_report_parameter_set,
) = Event::get_with_related_items(&mut conn, current_user.id, event_id).await?;
if send_email_notification { if send_email_notification {
let shared_folder_for_user = shared_folder_for_user( let shared_folder_for_user = shared_folder_for_user(
...@@ -552,8 +560,16 @@ async fn delete_shared_folder_for_event_inner( ...@@ -552,8 +560,16 @@ async fn delete_shared_folder_for_event_inner(
let mut conn = db.get_conn().await?; let mut conn = db.get_conn().await?;
let (event, _invite, room, sip_config, _is_favorite, shared_folder, _tariff) = let (
Event::get_with_related_items(&mut conn, current_user.id, event_id).await?; event,
_invite,
room,
sip_config,
_is_favorite,
shared_folder,
_tariff,
_training_participation_report_parameter_set,
) = Event::get_with_related_items(&mut conn, current_user.id, event_id).await?;
if let Some(shared_folder) = shared_folder { if let Some(shared_folder) = shared_folder {
let shared_folders = std::slice::from_ref(&shared_folder); let shared_folders = std::slice::from_ref(&shared_folder);
......
...@@ -29,8 +29,8 @@ use opentalk_types_api_v1::{ ...@@ -29,8 +29,8 @@ use opentalk_types_api_v1::{
}; };
use opentalk_types_common::rooms::invite_codes::InviteCode; use opentalk_types_common::rooms::invite_codes::InviteCode;
use rand::{ use rand::{
distributions::{Distribution, Uniform}, distr::{Distribution, Uniform},
prelude::SliceRandom, seq::IndexedRandom,
CryptoRng, Rng, CryptoRng, Rng,
}; };
use ring::hmac; use ring::hmac;
...@@ -114,7 +114,7 @@ pub async fn get( ...@@ -114,7 +114,7 @@ pub async fn get(
.map_err(|_| ApiError::internal())?) .map_err(|_| ApiError::internal())?)
.timestamp(); .timestamp();
let mut rand_rng = ::rand::thread_rng(); let mut rand_rng = ::rand::thread_rng();
rr_servers(&mut rand_rng, &turn_config.servers, expires) rr_servers(&mut rand_rng, &turn_config.servers, expires)?
} }
None => vec![], None => vec![],
}; };
...@@ -160,16 +160,16 @@ fn rr_servers<T: Rng + CryptoRng>( ...@@ -160,16 +160,16 @@ fn rr_servers<T: Rng + CryptoRng>(
rng: &mut T, rng: &mut T,
servers: &[TurnServer], servers: &[TurnServer],
expires: i64, expires: i64,
) -> Vec<IceServer> { ) -> Result<Vec<IceServer>, CaptureApiError> {
// Create a list of TURN responses for each configured TURN server. // Create a list of TURN responses for each configured TURN server.
match servers.len() { match servers.len() {
0 => vec![], 0 => Ok(vec![]),
// When we only have one configured TURN server, return the credentials for this single one. // When we only have one configured TURN server, return the credentials for this single one.
1 => vec![create_credentials(rng, &servers[0].pre_shared_key, expires, &servers[0].uris)] 1 => Ok(vec![create_credentials(rng, &servers[0].pre_shared_key, expires, &servers[0].uris)])
, ,
// When we have two configured TURN servers, draw a random one and return the credentials for this drawn one. // When we have two configured TURN servers, draw a random one and return the credentials for this drawn one.
2 => { 2 => {
let between: Uniform<u32> = Uniform::from(0..1); let between: Uniform<u32> = Uniform::try_from(0..1)?;
let selected_server = between.sample(rng) as usize; let selected_server = between.sample(rng) as usize;
let turn = create_credentials( let turn = create_credentials(
rng, rng,
...@@ -178,15 +178,18 @@ fn rr_servers<T: Rng + CryptoRng>( ...@@ -178,15 +178,18 @@ fn rr_servers<T: Rng + CryptoRng>(
&servers[selected_server].uris, &servers[selected_server].uris,
); );
vec![turn] Ok(vec![turn])
} }
// When we have more than two configured TURN servers, draw two and return the credentials for the drawn ones. // When we have more than two configured TURN servers, draw two and return the credentials for the drawn ones.
_ => servers _ => {
let ice_servers = servers
.choose_multiple(rng, 2) .choose_multiple(rng, 2)
.map(|server| { .map(|server| {
create_credentials(rng, &server.pre_shared_key, expires, &server.uris) create_credentials(rng, &server.pre_shared_key, expires, &server.uris)
}) })
.collect::<Vec<_>>(), .collect::<Vec<_>>();
Ok(ice_servers)
},
} }
} }
...@@ -249,13 +252,16 @@ async fn check_access_token_or_invite( ...@@ -249,13 +252,16 @@ async fn check_access_token_or_invite(
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use pretty_assertions::assert_eq; use pretty_assertions::assert_eq;
use rand::SeedableRng;
use rand_chacha::ChaCha12Rng;
use super::*; use super::*;
#[test] #[test]
fn test_create_credentials() { fn test_create_credentials() {
use rand::{prelude::*, SeedableRng}; // Using ChaCha12Rng instead of StdRng because of the reproducibility for randomness
let mut rng = StdRng::seed_from_u64(1234567890); // generation as recommeded by the documentation of the rand crate.
let mut rng = ChaCha12Rng::seed_from_u64(1234567890);
let credentials = let credentials =
create_credentials(&mut rng, "PSK", 3400, &["turn:turn.turn.turn".to_owned()]); create_credentials(&mut rng, "PSK", 3400, &["turn:turn.turn.turn".to_owned()]);
assert_eq!( assert_eq!(
...@@ -271,30 +277,28 @@ mod tests { ...@@ -271,30 +277,28 @@ mod tests {
#[test] #[test]
fn test_round_robin() { fn test_round_robin() {
use rand::{prelude::*, SeedableRng};
// No configured servers // No configured servers
let mut rng = StdRng::seed_from_u64(1234567890); let mut rng = ChaCha12Rng::from_seed(Default::default());
assert_eq!(rr_servers(&mut rng, &[], 1200), vec![]); assert_eq!(rr_servers(&mut rng, &[], 1200).unwrap(), vec![]);
// One configured server // One configured server
let mut rng = StdRng::seed_from_u64(1234567890); let mut rng = ChaCha12Rng::from_seed(Default::default());
let one_server = vec![TurnServer { let one_server = vec![TurnServer {
uris: vec!["turn:turn1.turn.turn".to_owned()], uris: vec!["turn:turn1.turn.turn".to_owned()],
pre_shared_key: "PSK1".to_owned(), pre_shared_key: "PSK1".to_owned(),
}]; }];
assert_eq!( assert_eq!(
rr_servers(&mut rng, &one_server, 1200), rr_servers(&mut rng, &one_server, 1200).unwrap(),
vec![IceServer::Turn(opentalk_types_api_v1::turn::TurnServer { vec![IceServer::Turn(opentalk_types_api_v1::turn::TurnServer {
username: "1200:turn_random_for_privacy_8VbonSpZc9GXSw9gMxaV0A==".to_owned(), username: "1200:turn_random_for_privacy_mweBXwRJfi4F0iysOqBhQQ==".to_owned(),
password: "G7hjqVZX/dVAOgzzb+GeS8vEpcU=".to_owned(), password: "iSudkrDCRQdeTWGDRva9p1L7H/w=".to_owned(),
ttl: 1200.to_string(), ttl: 1200.to_string(),
uris: vec!["turn:turn1.turn.turn".to_owned()] uris: vec!["turn:turn1.turn.turn".to_owned()]
})] })]
); );
// Two configured servers // Two configured servers
let mut rng = StdRng::seed_from_u64(1234567890); let mut rng = ChaCha12Rng::from_seed(Default::default());
let two_servers = vec![ let two_servers = vec![
TurnServer { TurnServer {
uris: vec!["turn:turn1.turn.turn".to_owned()], uris: vec!["turn:turn1.turn.turn".to_owned()],
...@@ -306,17 +310,17 @@ mod tests { ...@@ -306,17 +310,17 @@ mod tests {
}, },
]; ];
assert_eq!( assert_eq!(
rr_servers(&mut rng, &two_servers, 1200), rr_servers(&mut rng, &two_servers, 1200).unwrap(),
vec![IceServer::Turn(opentalk_types_api_v1::turn::TurnServer { vec![IceServer::Turn(opentalk_types_api_v1::turn::TurnServer {
username: "1200:turn_random_for_privacy_VuidKllz0ZdLD2AzFpXQYA==".to_owned(), username: "1200:turn_random_for_privacy_B4FfBEl+LgXSLKw6oGFBCw==".to_owned(),
password: "Aybo95/GPrJhWN2qqbz6yP2qEvg=".to_owned(), password: "GqPGDzE/kk+2IR/tBpdWiAHR90E=".to_owned(),
ttl: 1200.to_string(), ttl: 1200.to_string(),
uris: vec!["turn:turn1.turn.turn".to_owned()] uris: vec!["turn:turn1.turn.turn".to_owned()]
})] })]
); );
// Three configured servers // Three configured servers
let mut rng = StdRng::seed_from_u64(1234567890); let mut rng = ChaCha12Rng::from_seed(Default::default());
let three_servers = vec![ let three_servers = vec![
TurnServer { TurnServer {
uris: vec!["turn:turn1.turn.turn".to_owned()], uris: vec!["turn:turn1.turn.turn".to_owned()],
...@@ -332,19 +336,19 @@ mod tests { ...@@ -332,19 +336,19 @@ mod tests {
}, },
]; ];
assert_eq!( assert_eq!(
rr_servers(&mut rng, &three_servers, 1200), rr_servers(&mut rng, &three_servers, 1200).unwrap(),
vec![ vec![
IceServer::Turn(opentalk_types_api_v1::turn::TurnServer { IceServer::Turn(opentalk_types_api_v1::turn::TurnServer {
username: "1200:turn_random_for_privacy_nSpZc9GXSw9gMxaV0GDahQ==".to_owned(), username: "1200:turn_random_for_privacy_gV8ESX4uBdIsrDqgYUELIA==".to_owned(),
password: "6zfptEfCPlF3oWFtPKtlAPwjAWs=".to_owned(), password: "pg151PsT+0F78fxQhIcm7IMQgcU=".to_owned(),
ttl: 1200.to_string(), ttl: 1200.to_string(),
uris: vec!["turn:turn1.turn.turn".to_owned()] uris: vec!["turn:turn3.turn.turn".to_owned()]
}), }),
IceServer::Turn(opentalk_types_api_v1::turn::TurnServer { IceServer::Turn(opentalk_types_api_v1::turn::TurnServer {
username: "1200:turn_random_for_privacy_AYzBIYeOCHhhiwR7CQ3X1A==".to_owned(), username: "1200:turn_random_for_privacy_hozGGRVMQqHGG+mQJxeySw==".to_owned(),
password: "fiWX+emwV1thN/dBcZ9melA061g=".to_owned(), password: "f01GWWpM8lJpfb6pceKS+tdF35A=".to_owned(),
ttl: 1200.to_string(), ttl: 1200.to_string(),
uris: vec!["turn:turn3.turn.turn".to_owned()] uris: vec!["turn:turn1.turn.turn".to_owned()]
}) })
] ]
); );
...@@ -355,6 +359,7 @@ mod tests { ...@@ -355,6 +359,7 @@ mod tests {
let mut third = 0; let mut third = 0;
for _ in 1..5000 { for _ in 1..5000 {
rr_servers(&mut rng, &three_servers, 1200) rr_servers(&mut rng, &three_servers, 1200)
.unwrap()
.iter() .iter()
.filter_map(|e| match e { .filter_map(|e| match e {
IceServer::Turn(turn) => Some(turn), IceServer::Turn(turn) => Some(turn),
......
// SPDX-FileCopyrightText: OpenTalk GmbH <mail@opentalk.eu>
//
// SPDX-License-Identifier: EUPL-1.2
use std::collections::HashSet;
use chrono::{Days, NaiveDate, Utc};
use log::warn;
use opentalk_controller_service_facade::RequestUser;
use opentalk_controller_settings::Settings;
use opentalk_controller_utils::CaptureApiError;
use opentalk_database::DbConnection;
use opentalk_db_storage::{
events::{
shared_folders::{EventSharedFolder, NewEventSharedFolder},
Event,
},
streaming_targets::get_room_streaming_targets,
tenants::Tenant,
users::User,
};
use opentalk_nextcloud_client::{Client, ShareId, SharePermission, ShareType};
use opentalk_types_api_v1::{
error::ApiError,
events::{DeleteSharedFolderQuery, PutSharedFolderQuery},
};
use opentalk_types_common::{
events::EventId,
shared_folders::{SharedFolder, SharedFolderAccess},
};
use snafu::Report;
use crate::{
events::{notifications::notify_event_invitees_about_update, shared_folder_for_user},
ControllerBackend,
};
impl ControllerBackend {
pub(crate) async fn get_shared_folder_for_event(
&self,
current_user: RequestUser,
event_id: EventId,
) -> Result<SharedFolder, CaptureApiError> {
let mut conn = self.db.get_conn().await?;
let event = Event::get(&mut conn, event_id).await?;
let shared_folder = SharedFolder::from(
EventSharedFolder::get_for_event(&mut conn, event_id)
.await?
.ok_or_else(ApiError::not_found)?,
);
let shared_folder = if event.created_by == current_user.id {
shared_folder
} else {
shared_folder.without_write_access()
};
Ok(shared_folder)
}
pub(crate) async fn put_shared_folder_for_event(
&self,
current_user: RequestUser,
event_id: EventId,
query: PutSharedFolderQuery,
) -> Result<(SharedFolder, bool), CaptureApiError> {
let settings = self.settings.load();
let mut conn = self.db.get_conn().await?;
let send_email_notification = !query.suppress_email_notification;
let (shared_folder, created) = put_shared_folder(&settings, event_id, &mut conn).await?;
let (
event,
_invite,
room,
sip_config,
_is_favorite,
_shared_folder,
_tariff,
_training_participation_report,
) = Event::get_with_related_items(&mut conn, current_user.id, event_id).await?;
if send_email_notification {
let shared_folder_for_user = shared_folder_for_user(
Some(shared_folder.clone()),
event.created_by,
current_user.id,
);
let current_tenant = Tenant::get(&mut conn, current_user.tenant_id).await?;
let current_user = User::get(&mut conn, current_user.id).await?;
let streaming_targets = get_room_streaming_targets(&mut conn, room.id).await?;
notify_event_invitees_about_update(
&self.kc_admin_client,
&settings,
&self.mail_service,
current_tenant,
current_user,
&mut conn,
event,
room,
sip_config,
shared_folder_for_user,
streaming_targets,
)
.await?;
}
Ok((SharedFolder::from(shared_folder), created))
}
pub(crate) async fn delete_shared_folder_for_event(
&self,
current_user: RequestUser,
event_id: EventId,
query: DeleteSharedFolderQuery,
) -> Result<(), CaptureApiError> {
let settings = self.settings.load();
let mut conn = self.db.get_conn().await?;
let send_email_notification = !query.suppress_email_notification;
let (
event,
_invite,
room,
sip_config,
_is_favorite,
shared_folder,
_tariff,
_training_participation_report,
) = Event::get_with_related_items(&mut conn, current_user.id, event_id).await?;
if let Some(shared_folder) = shared_folder {
let shared_folders = std::slice::from_ref(&shared_folder);
let deletion = delete_shared_folders(&settings, shared_folders).await;
let streaming_targets = get_room_streaming_targets(&mut conn, room.id).await?;
match deletion {
Ok(()) => {
shared_folder.delete(&mut conn).await?;
if send_email_notification {
let current_tenant = Tenant::get(&mut conn, current_user.tenant_id).await?;
let current_user = User::get(&mut conn, current_user.id).await?;
notify_event_invitees_about_update(
&self.kc_admin_client,
&settings,
&self.mail_service,
current_tenant,
current_user,
&mut conn,
event,
room,
sip_config,
None,
streaming_targets,
)
.await?;
}
Ok(())
}
Err(e) => {
if query.force_delete_reference_if_shared_folder_deletion_fails {
warn!(
"Deleting local shared folder reference anyway, because \
`force_delete_reference_if_shared_folder_deletion_fails` is set to true"
);
shared_folder.delete(&mut conn).await?;
if send_email_notification {
let current_tenant =
Tenant::get(&mut conn, current_user.tenant_id).await?;
let current_user = User::get(&mut conn, current_user.id).await?;
notify_event_invitees_about_update(
&self.kc_admin_client,
&settings,
&self.mail_service,
current_tenant,
current_user,
&mut conn,
event,
room,
sip_config,
None,
streaming_targets,
)
.await?;
}
Ok(())
} else {
Err(e.into())
}
}
}
} else {
Ok(())
}
}
}
/// Adds a shared folder to the specified event
pub async fn put_shared_folder(
settings: &Settings,
event_id: EventId,
conn: &mut DbConnection,
) -> Result<(EventSharedFolder, bool), CaptureApiError> {
let shared_folder = EventSharedFolder::get_for_event(conn, event_id).await?;
if let Some(shared_folder) = shared_folder {
return Ok((shared_folder, false));
}
let shared_folder_settings = settings.shared_folder.as_ref().ok_or_else(|| {
ApiError::bad_request().with_message("No shared folder configured for this server")
})?;
match shared_folder_settings {
opentalk_controller_settings::SharedFolder::Nextcloud {
url,
username,
password,
directory,
expiry,
} => {
let client =
Client::new(url.clone(), username.clone(), password.clone()).map_err(|e| {
warn!("Error creating NextCloud client: {}", Report::from_error(e));
ApiError::internal().with_message("Error creating NextCloud client")
})?;
let path = format!(
"{}/opentalk-event-{}",
directory.trim_matches('/'),
event_id
);
let user_path = format!("files/{username}/{path}");
client.create_folder(&user_path).await.map_err(|e| {
warn!(
"Error creating folder on NextCloud: {}",
Report::from_error(e)
);
ApiError::internal().with_message("Error creating folder on NextCloud")
})?;
let expire_date = expiry
.as_ref()
.map(|days| Utc::now().date_naive() + Days::new(*days));
let write_permissions = HashSet::from([
SharePermission::Read,
SharePermission::Create,
SharePermission::Update,
SharePermission::Delete,
]);
let read_permissions = HashSet::from([SharePermission::Read]);
async fn create_share(
client: &Client,
path: &str,
permissions: HashSet<SharePermission>,
label: &str,
password: String,
expire_date: Option<NaiveDate>,
) -> Result<(ShareId, SharedFolderAccess), ApiError> {
let mut creator = client
.create_share(path, ShareType::PublicLink)
.password(&password)
.label(label);
for permission in &permissions {
creator = creator.permission(*permission);
}
if let Some(expire_date) = expire_date {
creator = creator.expire_date(expire_date);
}
let share = creator.send().await.map_err(|e| {
warn!(
"Error creating share on NextCloud: {}",
Report::from_error(e)
);
ApiError::internal().with_message("Error creating share on NextCloud")
})?;
// Workaround for NextCloud up to version 25 not processing the share permissions
// on folder creation. We just need to change them with a subsequent update request.
//
// See: https://github.com/nextcloud/server/issues/32611
if share.data.permissions != permissions {
_ = client
.update_share(share.data.id.clone())
.permissions(permissions)
.await
.map_err(|e| {
warn!(
"Error setting permissions for share on NextCloud: {}",
Report::from_error(e)
);
ApiError::internal()
.with_message("Error setting permissions for share on NextCloud")
})?;
}
Ok((
share.data.id,
SharedFolderAccess {
url: share.data.url,
password,
},
))
}
let write_password = generate_password(&client).await?;
let read_password = generate_password(&client).await?;
let (
write_share_id,
SharedFolderAccess {
url: write_url,
password: write_password,
},
) = create_share(
&client,
&path,
write_permissions,
"OpenTalk read-write",
write_password,
expire_date,
)
.await?;
let (
read_share_id,
SharedFolderAccess {
url: read_url,
password: read_password,
},
) = create_share(
&client,
&path,
read_permissions,
"OpenTalk read-only",
read_password,
expire_date,
)
.await?;
let new_shared_folder = NewEventSharedFolder {
event_id,
path,
write_share_id: write_share_id.to_string(),
write_url,
write_password,
read_share_id: read_share_id.to_string(),
read_url,
read_password,
};
let shared_folder = new_shared_folder
.try_insert(conn)
.await?
.ok_or_else(ApiError::internal)?;
Ok((shared_folder, true))
}
}
}
/// Deletes the shared folders for the specified event
pub async fn delete_shared_folders(
settings: &Settings,
shared_folders: &[EventSharedFolder],
) -> Result<(), ApiError> {
if shared_folders.is_empty() {
return Ok(());
}
let shared_folder_settings = if let Some(settings) = settings.shared_folder.as_ref() {
settings
} else {
return Err(
ApiError::bad_request().with_message("No shared folder configured for this server")
);
};
match shared_folder_settings {
opentalk_controller_settings::SharedFolder::Nextcloud {
url,
username,
password,
..
} => {
let client =
Client::new(url.clone(), username.clone(), password.clone()).map_err(|e| {
warn!("Error creating NextCloud client: {}", Report::from_error(e));
ApiError::internal().with_message("Error creating NextCloud client")
})?;
for shared_folder in shared_folders {
let path = &shared_folder.path;
if path.trim_matches('/').is_empty() {
warn!("Preventing recursive deletion of empty shared folder path, this is probably harmful and not intended");
return Err(ApiError::internal());
}
let user_path = format!("files/{username}/{path}");
if let Err(e) = client
.delete_share(ShareId::from(shared_folder.read_share_id.clone()))
.await
{
warn!(
"Could not delete NextCloud read share: {}",
Report::from_error(e)
);
}
if let Err(e) = client
.delete_share(ShareId::from(shared_folder.write_share_id.clone()))
.await
{
warn!(
"Could not delete NextCloud write share: {}",
Report::from_error(e)
);
}
match client.delete(&user_path).await {
Ok(()) | Err(opentalk_nextcloud_client::Error::FileNotFound { .. }) => {}
Err(e) => {
warn!(
"Error deleting folder on NextCloud: {}",
Report::from_error(e)
);
return Err(
ApiError::internal().with_message("Error deleting folder on NextCloud")
);
}
};
}
Ok(())
}
}
}
async fn generate_password(client: &Client) -> Result<String, ApiError> {
client.generate_password().await.map_err(|e| {
warn!(
"Error generating share password on NextCloud: {}",
Report::from_error(e)
);
ApiError::internal().with_message("Error generating share password NextCloud")
})
}
// SPDX-FileCopyrightText: OpenTalk GmbH <mail@opentalk.eu>
//
// SPDX-License-Identifier: EUPL-1.2
//! Handles event-related notifications.
use opentalk_controller_settings::Settings;
use opentalk_controller_utils::CaptureApiError;
use opentalk_database::DbConnection;
use opentalk_db_storage::{
events::{Event, EventException},
invites::Invite,
rooms::Room,
sip_configs::SipConfig,
streaming_targets::get_room_streaming_targets,
tenants::Tenant,
users::User,
};
use opentalk_keycloak_admin::KeycloakAdminClient;
use opentalk_types_common::{
rooms::RoomId, shared_folders::SharedFolder, streaming::RoomStreamingTarget,
};
use snafu::Report;
use crate::{
events::{enrich_from_keycloak, get_invited_mail_recipients_for_event, shared_folder_for_user},
services::{MailRecipient, MailService},
};
/// Provides information for event update notifications (e.g. via email)
#[derive(Debug)]
pub struct UpdateNotificationValues {
/// The tenant id
pub tenant: Tenant,
/// The user who has created the event
pub created_by: User,
/// The event that was updated
pub event: Event,
/// The event exception that was updated
pub event_exception: Option<EventException>,
/// The room of the updated event
pub room: Room,
/// The SIP configuration of the updated event
pub sip_config: Option<SipConfig>,
/// The users to notify about the update
pub users_to_notify: Vec<MailRecipient>,
/// The updated invite
pub invite_for_room: Invite,
}
/// Notifies the invitees of an event belonging to the specified room
pub async fn notify_event_invitees_by_room_about_update(
kc_admin_client: &KeycloakAdminClient,
settings: &Settings,
mail_service: &MailService,
current_tenant: Tenant,
current_user: User,
conn: &mut DbConnection,
room_id: RoomId,
) -> Result<(), CaptureApiError> {
let event = Event::get_for_room(conn, room_id).await?;
if let Some(event) = event {
let (
event,
_invite,
room,
sip_config,
_is_favorite,
shared_folder,
_tariff,
_training_participation_report,
) = Event::get_with_related_items(conn, current_user.id, event.id).await?;
let shared_folder_for_user =
shared_folder_for_user(shared_folder, event.created_by, current_user.id);
let streaming_targets = get_room_streaming_targets(conn, room.id).await?;
notify_event_invitees_about_update(
kc_admin_client,
settings,
mail_service,
current_tenant,
current_user,
conn,
event,
room,
sip_config,
shared_folder_for_user,
streaming_targets,
)
.await?;
}
Ok(())
}
/// Notifies the invitees of an event about updates
#[allow(clippy::too_many_arguments)]
pub async fn notify_event_invitees_about_update(
kc_admin_client: &KeycloakAdminClient,
settings: &Settings,
mail_service: &MailService,
current_tenant: Tenant,
current_user: User,
conn: &mut DbConnection,
event: Event,
room: Room,
sip_config: Option<SipConfig>,
shared_folder_for_user: Option<SharedFolder>,
streaming_targets: Vec<RoomStreamingTarget>,
) -> Result<(), CaptureApiError> {
let invited_users = get_invited_mail_recipients_for_event(conn, event.id).await?;
let current_user_mail_recipient = MailRecipient::Registered(current_user.clone().into());
let users_to_notify = invited_users
.into_iter()
.chain(std::iter::once(current_user_mail_recipient))
.collect::<Vec<_>>();
let invite_for_room =
Invite::get_first_or_create_for_room(conn, room.id, current_user.id).await?;
let created_by = if event.created_by == current_user.id {
current_user
} else {
User::get(conn, event.created_by).await?
};
let notification_values = UpdateNotificationValues {
tenant: current_tenant,
created_by,
event,
event_exception: None,
room,
sip_config,
users_to_notify,
invite_for_room,
};
notify_invitees_about_update(
settings,
notification_values,
mail_service,
kc_admin_client,
shared_folder_for_user,
streaming_targets,
)
.await;
Ok(())
}
/// Notifies the invitees of an event about updates
pub async fn notify_invitees_about_update(
settings: &Settings,
notification_values: UpdateNotificationValues,
mail_service: &MailService,
kc_admin_client: &KeycloakAdminClient,
shared_folder: Option<SharedFolder>,
streaming_targets: Vec<RoomStreamingTarget>,
) {
for user in notification_values.users_to_notify {
let invited_user =
enrich_from_keycloak(settings, user, &notification_values.tenant, kc_admin_client)
.await;
if let Err(e) = mail_service
.send_event_update(
notification_values.created_by.clone(),
notification_values.event.clone(),
notification_values.event_exception.clone(),
notification_values.room.clone(),
notification_values.sip_config.clone(),
invited_user,
notification_values.invite_for_room.id.to_string(),
shared_folder.clone(),
streaming_targets.clone(),
)
.await
{
log::error!(
"Failed to send event update with MailService, {}",
Report::from_error(e)
);
}
}
}
...@@ -33,6 +33,7 @@ opentalk-signaling-core.workspace = true ...@@ -33,6 +33,7 @@ opentalk-signaling-core.workspace = true
opentalk-types-api-v1 = { workspace = true, features = ["actix"] } opentalk-types-api-v1 = { workspace = true, features = ["actix"] }
opentalk-types-common = { workspace = true, features = ["kustos"] } opentalk-types-common = { workspace = true, features = ["kustos"] }
opentalk-types-signaling.workspace = true opentalk-types-signaling.workspace = true
rand.workspace = true
rrule.workspace = true rrule.workspace = true
serde_json.workspace = true serde_json.workspace = true
snafu.workspace = true snafu.workspace = true
...@@ -7,6 +7,7 @@ use std::fmt::Display; ...@@ -7,6 +7,7 @@ use std::fmt::Display;
use opentalk_database::DatabaseError; use opentalk_database::DatabaseError;
use opentalk_signaling_core::{assets::AssetError, ObjectStorageError}; use opentalk_signaling_core::{assets::AssetError, ObjectStorageError};
use opentalk_types_api_v1::error::ApiError; use opentalk_types_api_v1::error::ApiError;
use rand::distr::uniform;
use snafu::Whatever; use snafu::Whatever;
use crate::event::EventRRuleSetError; use crate::event::EventRRuleSetError;
...@@ -93,6 +94,13 @@ impl From<AssetError> for CaptureApiError { ...@@ -93,6 +94,13 @@ impl From<AssetError> for CaptureApiError {
} }
} }
impl From<uniform::Error> for CaptureApiError {
fn from(value: uniform::Error) -> Self {
log::error!("REST API threw internal error: {value:?}");
CaptureApiError(ApiError::internal())
}
}
impl Display for CaptureApiError { impl Display for CaptureApiError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f) self.0.fmt(f)
......
...@@ -27,6 +27,7 @@ use opentalk_types_common::{ ...@@ -27,6 +27,7 @@ use opentalk_types_common::{
sql_enum, sql_enum,
tenants::TenantId, tenants::TenantId,
time::TimeZone, time::TimeZone,
training_participation_report::{TimeRange, TrainingParticipationReportParameterSet},
users::UserId, users::UserId,
}; };
use redis_args::{FromRedisValue, ToRedisArgs}; use redis_args::{FromRedisValue, ToRedisArgs};
...@@ -36,8 +37,9 @@ use self::shared_folders::EventSharedFolder; ...@@ -36,8 +37,9 @@ use self::shared_folders::EventSharedFolder;
use crate::{ use crate::{
rooms::Room, rooms::Room,
schema::{ schema::{
event_exceptions, event_favorites, event_invites, event_shared_folders, events, rooms, event_exceptions, event_favorites, event_invites, event_shared_folders,
sip_configs, tariffs, users, event_training_participation_report_parameter_sets, events, rooms, sip_configs, tariffs,
users,
}, },
sip_configs::SipConfig, sip_configs::SipConfig,
tariffs::Tariff, tariffs::Tariff,
...@@ -352,36 +354,43 @@ impl Event { ...@@ -352,36 +354,43 @@ impl Event {
bool, bool,
Option<EventSharedFolder>, Option<EventSharedFolder>,
Tariff, Tariff,
Option<EventTrainingParticipationReportParameterSet>,
)> { )> {
let query = events::table let query =
.left_join( events::table
event_invites::table.on(event_invites::event_id .left_join(
.eq(events::id) event_invites::table.on(event_invites::event_id
.and(event_invites::invitee.eq(user_id))), .eq(events::id)
) .and(event_invites::invitee.eq(user_id))),
.left_join( )
event_favorites::table.on(event_favorites::event_id .left_join(
.eq(events::id) event_favorites::table.on(event_favorites::event_id
.and(event_favorites::user_id.eq(user_id))), .eq(events::id)
) .and(event_favorites::user_id.eq(user_id))),
.left_join( )
event_shared_folders::table.on(event_shared_folders::event_id.eq(events::id)), .left_join(
) event_shared_folders::table.on(event_shared_folders::event_id.eq(events::id)),
.inner_join(rooms::table.on(events::room.eq(rooms::id))) )
.left_join(sip_configs::table.on(rooms::id.eq(sip_configs::room))) .inner_join(rooms::table.on(events::room.eq(rooms::id)))
.inner_join(users::table.on(users::id.eq(rooms::created_by))) .left_join(sip_configs::table.on(rooms::id.eq(sip_configs::room)))
.inner_join(tariffs::table.on(tariffs::id.eq(users::tariff_id))) .inner_join(users::table.on(users::id.eq(rooms::created_by)))
.select(( .inner_join(tariffs::table.on(tariffs::id.eq(users::tariff_id)))
events::all_columns, .left_join(
event_invites::all_columns.nullable(), event_training_participation_report_parameter_sets::table
rooms::all_columns, .on(event_training_participation_report_parameter_sets::event_id
sip_configs::all_columns.nullable(), .eq(events::id)),
event_favorites::user_id.nullable().is_not_null(), )
event_shared_folders::all_columns.nullable(), .select((
tariffs::all_columns, events::all_columns,
)) event_invites::all_columns.nullable(),
.filter(events::id.eq(event_id)); rooms::all_columns,
sip_configs::all_columns.nullable(),
event_favorites::user_id.nullable().is_not_null(),
event_shared_folders::all_columns.nullable(),
tariffs::all_columns,
event_training_participation_report_parameter_sets::all_columns.nullable(),
))
.filter(events::id.eq(event_id));
Ok(query.first(conn).await?) Ok(query.first(conn).await?)
} }
...@@ -431,6 +440,7 @@ impl Event { ...@@ -431,6 +440,7 @@ impl Event {
bool, bool,
Option<EventSharedFolder>, Option<EventSharedFolder>,
Tariff, Tariff,
Option<TrainingParticipationReportParameterSet>,
)>, )>,
> { > {
// Filter applied to all events which validates that the event is either created by // Filter applied to all events which validates that the event is either created by
...@@ -585,6 +595,8 @@ impl Event { ...@@ -585,6 +595,8 @@ impl Event {
} else { } else {
vec![] vec![]
}; };
// TODO: remove this
let training_participation_report_parameter_set = None;
events_with_invite_room_and_exceptions.push(( events_with_invite_room_and_exceptions.push((
event, event,
...@@ -595,6 +607,7 @@ impl Event { ...@@ -595,6 +607,7 @@ impl Event {
is_favorite, is_favorite,
shared_folders, shared_folders,
tariff, tariff,
training_participation_report_parameter_set,
)); ));
} }
...@@ -1132,3 +1145,164 @@ impl NewEventFavorite { ...@@ -1132,3 +1145,164 @@ impl NewEventFavorite {
} }
} }
} }
#[derive(Debug, Insertable, Queryable, Identifiable, Associations)]
#[diesel(table_name = event_training_participation_report_parameter_sets)]
#[diesel(primary_key(event_id))]
#[diesel(belongs_to(Event, foreign_key = event_id))]
pub struct EventTrainingParticipationReportParameterSet {
pub event_id: EventId,
pub initial_checkpoint_delay_after: i64,
pub initial_checkpoint_delay_within: i64,
pub checkpoint_interval_after: i64,
pub checkpoint_interval_within: i64,
}
impl EventTrainingParticipationReportParameterSet {
#[tracing::instrument(err, skip_all)]
pub async fn get_for_event(conn: &mut DbConnection, event_id: EventId) -> Result<Option<Self>> {
let parameter_set = event_training_participation_report_parameter_sets::table
.filter(event_training_participation_report_parameter_sets::event_id.eq(event_id))
.get_result(conn)
.await
.optional()?;
Ok(parameter_set)
}
/// Tries to insert the EventTrainingParticipationParameterSet into the database
///
/// When yielding a unique key violation, None is returned.
#[tracing::instrument(err, skip_all)]
pub async fn try_insert(self, conn: &mut DbConnection) -> Result<Option<Self>> {
let query = self.insert_into(event_training_participation_report_parameter_sets::table);
let result = query.get_result(conn).await;
match result {
Ok(event_invite) => Ok(Some(event_invite)),
Err(diesel::result::Error::DatabaseError(
diesel::result::DatabaseErrorKind::UniqueViolation,
..,
)) => Ok(None),
Err(e) => Err(e.into()),
}
}
#[tracing::instrument(err, skip_all)]
pub async fn delete_by_id(conn: &mut DbConnection, event_id: EventId) -> Result<()> {
let query = diesel::delete(
event_training_participation_report_parameter_sets::table
.filter(event_training_participation_report_parameter_sets::event_id.eq(event_id)),
);
query.execute(conn).await?;
Ok(())
}
}
impl From<EventTrainingParticipationReportParameterSet>
for TrainingParticipationReportParameterSet
{
fn from(
EventTrainingParticipationReportParameterSet {
event_id: _,
initial_checkpoint_delay_after,
initial_checkpoint_delay_within,
checkpoint_interval_after,
checkpoint_interval_within,
}: EventTrainingParticipationReportParameterSet,
) -> Self {
Self {
initial_checkpoint_delay: TimeRange {
after: u64::try_from(initial_checkpoint_delay_after).unwrap_or_default(),
within: u64::try_from(initial_checkpoint_delay_within).unwrap_or_default(),
},
checkpoint_interval: TimeRange {
after: u64::try_from(checkpoint_interval_after).unwrap_or_default(),
within: u64::try_from(checkpoint_interval_within).unwrap_or_default(),
},
}
}
}
impl From<(EventId, TrainingParticipationReportParameterSet)>
for EventTrainingParticipationReportParameterSet
{
fn from(
(
event_id,
TrainingParticipationReportParameterSet {
initial_checkpoint_delay,
checkpoint_interval,
},
): (EventId, TrainingParticipationReportParameterSet),
) -> Self {
Self {
event_id,
initial_checkpoint_delay_after: i64::try_from(initial_checkpoint_delay.after)
.unwrap_or(i64::MAX),
initial_checkpoint_delay_within: i64::try_from(initial_checkpoint_delay.within)
.unwrap_or(i64::MAX),
checkpoint_interval_after: i64::try_from(checkpoint_interval.after).unwrap_or(i64::MAX),
checkpoint_interval_within: i64::try_from(checkpoint_interval.within)
.unwrap_or(i64::MAX),
}
}
}
#[derive(AsChangeset)]
#[diesel(table_name = event_training_participation_report_parameter_sets)]
pub struct UpdateEventTrainingParticipationReportParameterSet {
pub initial_checkpoint_delay_after: Option<i64>,
pub initial_checkpoint_delay_within: Option<i64>,
pub checkpoint_interval_after: Option<i64>,
pub checkpoint_interval_within: Option<i64>,
}
impl UpdateEventTrainingParticipationReportParameterSet {
/// Apply the update to the invite where `user_id` is the invitee
#[tracing::instrument(err, skip_all)]
pub async fn apply(
self,
conn: &mut DbConnection,
event_id: EventId,
) -> Result<EventTrainingParticipationReportParameterSet> {
let query = diesel::update(event_training_participation_report_parameter_sets::table)
.filter(event_training_participation_report_parameter_sets::event_id.eq(event_id))
.set(self)
// change it here
.returning(event_training_participation_report_parameter_sets::all_columns);
let event_training_participation_report_parameter_sets = query.get_result(conn).await?;
Ok(event_training_participation_report_parameter_sets)
}
}
impl From<TrainingParticipationReportParameterSet>
for UpdateEventTrainingParticipationReportParameterSet
{
fn from(
TrainingParticipationReportParameterSet {
initial_checkpoint_delay,
checkpoint_interval,
}: TrainingParticipationReportParameterSet,
) -> Self {
Self {
initial_checkpoint_delay_after: Some(
i64::try_from(initial_checkpoint_delay.after).unwrap_or(i64::MAX),
),
initial_checkpoint_delay_within: Some(
i64::try_from(initial_checkpoint_delay.within).unwrap_or(i64::MAX),
),
checkpoint_interval_after: Some(
i64::try_from(checkpoint_interval.after).unwrap_or(i64::MAX),
),
checkpoint_interval_within: Some(
i64::try_from(checkpoint_interval.within).unwrap_or(i64::MAX),
),
}
}
}
CREATE TABLE event_training_participation_report_parameter_sets (
event_id UUID PRIMARY KEY REFERENCES events(id) ON DELETE CASCADE NOT NULL,
initial_checkpoint_delay_after BIGINT NOT NULL,
initial_checkpoint_delay_within BIGINT NOT NULL,
checkpoint_interval_after BIGINT NOT NULL,
checkpoint_interval_within BIGINT NOT NULL
);
...@@ -113,6 +113,18 @@ diesel::table! { ...@@ -113,6 +113,18 @@ diesel::table! {
} }
} }
diesel::table! {
use crate::sql_types::*;
event_training_participation_report_parameter_sets (event_id) {
event_id -> Uuid,
initial_checkpoint_delay_after -> Int8,
initial_checkpoint_delay_within -> Int8,
checkpoint_interval_after -> Int8,
checkpoint_interval_within -> Int8,
}
}
diesel::table! { diesel::table! {
use crate::sql_types::*; use crate::sql_types::*;
...@@ -384,6 +396,7 @@ diesel::joinable!(event_favorites -> events (event_id)); ...@@ -384,6 +396,7 @@ diesel::joinable!(event_favorites -> events (event_id));
diesel::joinable!(event_favorites -> users (user_id)); diesel::joinable!(event_favorites -> users (user_id));
diesel::joinable!(event_invites -> events (event_id)); diesel::joinable!(event_invites -> events (event_id));
diesel::joinable!(event_shared_folders -> events (event_id)); diesel::joinable!(event_shared_folders -> events (event_id));
diesel::joinable!(event_training_participation_report_parameter_sets -> events (event_id));
diesel::joinable!(events -> rooms (room)); diesel::joinable!(events -> rooms (room));
diesel::joinable!(events -> tenants (tenant_id)); diesel::joinable!(events -> tenants (tenant_id));
diesel::joinable!(external_tariffs -> tariffs (tariff_id)); diesel::joinable!(external_tariffs -> tariffs (tariff_id));
...@@ -413,6 +426,7 @@ diesel::allow_tables_to_appear_in_same_query!( ...@@ -413,6 +426,7 @@ diesel::allow_tables_to_appear_in_same_query!(
event_favorites, event_favorites,
event_invites, event_invites,
event_shared_folders, event_shared_folders,
event_training_participation_report_parameter_sets,
events, events,
external_tariffs, external_tariffs,
groups, groups,
......
...@@ -9,7 +9,7 @@ use std::{ ...@@ -9,7 +9,7 @@ use std::{
time::{Duration, Instant}, time::{Duration, Instant},
}; };
use rand::{thread_rng, Rng}; use rand::{rng, Rng};
use redis::{aio::ConnectionLike, RedisError, Script, ToRedisArgs, Value}; use redis::{aio::ConnectionLike, RedisError, Script, ToRedisArgs, Value};
use snafu::Snafu; use snafu::Snafu;
use tokio::time::sleep; use tokio::time::sleep;
...@@ -149,8 +149,8 @@ where ...@@ -149,8 +149,8 @@ where
where where
C: ConnectionLike, C: ConnectionLike,
{ {
let canary = thread_rng() let canary = rng()
.sample_iter(rand::distributions::Alphanumeric) .sample_iter(rand::distr::Alphanumeric)
.take(20) .take(20)
.collect::<Vec<u8>>(); .collect::<Vec<u8>>();
...@@ -180,7 +180,7 @@ where ...@@ -180,7 +180,7 @@ where
}; };
return Ok(guard); return Ok(guard);
} else { } else {
sleep(thread_rng().gen_range(self.wait_time.clone())).await; sleep(rng().random_range(self.wait_time.clone())).await;
} }
} }
......
...@@ -570,12 +570,14 @@ impl Livekit { ...@@ -570,12 +570,14 @@ impl Livekit {
.screen_share_requires_permission; .screen_share_requires_permission;
let mut available_sources = LIVEKIT_MEDIA_SOURCES.to_vec(); let mut available_sources = LIVEKIT_MEDIA_SOURCES.to_vec();
if let MicrophoneRestrictionState::Enabled { if !self.role.is_moderator() {
unrestricted_participants, if let MicrophoneRestrictionState::Enabled {
} = &microphone_restriction_state unrestricted_participants,
{ } = &microphone_restriction_state
if !unrestricted_participants.contains(&self.participant_id) { {
available_sources.retain(|s| s != &TrackSource::Microphone); if !unrestricted_participants.contains(&self.participant_id) {
available_sources.retain(|s| s != &TrackSource::Microphone);
}
} }
} }
......
...@@ -80,7 +80,7 @@ ...@@ -80,7 +80,7 @@
table.hline(y: 1), table.hline(y: 1),
..for (i, participant) in data ..for (i, participant) in data
.participants .participants
.filter(p => "left_at" not in p and visible_kinds.contains(p.kind)) .filter(p => visible_kinds.contains(p.kind))
.sorted(key: p => role_order.at(p.role)) .sorted(key: p => role_order.at(p.role))
.enumerate(start: 1) { .enumerate(start: 1) {
( (
......

Consent

On this website, we use the web analytics service Matomo to analyze and review the use of our website. Through the collected statistics, we can improve our offerings and make them more appealing for you. Here, you can decide whether to allow us to process your data and set corresponding cookies for these purposes, in addition to technically necessary cookies. Further information on data protection—especially regarding "cookies" and "Matomo"—can be found in our privacy policy. You can withdraw your consent at any time.