aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1585
-rw-r--r--docs/man/gitolfs3-server.119
-rw-r--r--flake.lock71
-rw-r--r--flake.nix14
-rw-r--r--gitolfs3-authenticate/Cargo.toml2
-rw-r--r--gitolfs3-authenticate/src/main.rs4
-rw-r--r--gitolfs3-common/Cargo.toml4
-rw-r--r--gitolfs3-common/src/lib.rs8
-rw-r--r--gitolfs3-server/Cargo.toml14
-rw-r--r--gitolfs3-server/src/api.rs220
-rw-r--r--gitolfs3-server/src/authz.rs84
-rw-r--r--gitolfs3-server/src/config.rs124
-rw-r--r--gitolfs3-server/src/dlimit.rs2
-rw-r--r--gitolfs3-server/src/handler.rs468
-rw-r--r--gitolfs3-server/src/main.rs25
-rw-r--r--gitolfs3-shell/Cargo.toml2
16 files changed, 1628 insertions, 1018 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 00f856e..b54ae10 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,33 +1,21 @@
1# This file is automatically @generated by Cargo. 1# This file is automatically @generated by Cargo.
2# It is not intended for manual editing. 2# It is not intended for manual editing.
3version = 3 3version = 4
4 4
5[[package]] 5[[package]]
6name = "addr2line" 6name = "addr2line"
7version = "0.21.0" 7version = "0.24.2"
8source = "registry+https://github.com/rust-lang/crates.io-index" 8source = "registry+https://github.com/rust-lang/crates.io-index"
9checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 9checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
10dependencies = [ 10dependencies = [
11 "gimli", 11 "gimli",
12] 12]
13 13
14[[package]] 14[[package]]
15name = "adler" 15name = "adler2"
16version = "1.0.2" 16version = "2.0.0"
17source = "registry+https://github.com/rust-lang/crates.io-index"
18checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
19
20[[package]]
21name = "ahash"
22version = "0.8.11"
23source = "registry+https://github.com/rust-lang/crates.io-index" 17source = "registry+https://github.com/rust-lang/crates.io-index"
24checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 18checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
25dependencies = [
26 "cfg-if",
27 "once_cell",
28 "version_check",
29 "zerocopy",
30]
31 19
32[[package]] 20[[package]]
33name = "aho-corasick" 21name = "aho-corasick"
@@ -40,9 +28,9 @@ dependencies = [
40 28
41[[package]] 29[[package]]
42name = "allocator-api2" 30name = "allocator-api2"
43version = "0.2.18" 31version = "0.2.21"
44source = "registry+https://github.com/rust-lang/crates.io-index" 32source = "registry+https://github.com/rust-lang/crates.io-index"
45checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" 33checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
46 34
47[[package]] 35[[package]]
48name = "android-tzdata" 36name = "android-tzdata"
@@ -61,32 +49,27 @@ dependencies = [
61 49
62[[package]] 50[[package]]
63name = "anyhow" 51name = "anyhow"
64version = "1.0.82" 52version = "1.0.97"
65source = "registry+https://github.com/rust-lang/crates.io-index" 53source = "registry+https://github.com/rust-lang/crates.io-index"
66checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" 54checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f"
67 55
68[[package]] 56[[package]]
69name = "async-trait" 57name = "atomic-waker"
70version = "0.1.80" 58version = "1.1.2"
71source = "registry+https://github.com/rust-lang/crates.io-index" 59source = "registry+https://github.com/rust-lang/crates.io-index"
72checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" 60checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
73dependencies = [
74 "proc-macro2",
75 "quote",
76 "syn",
77]
78 61
79[[package]] 62[[package]]
80name = "autocfg" 63name = "autocfg"
81version = "1.2.0" 64version = "1.4.0"
82source = "registry+https://github.com/rust-lang/crates.io-index" 65source = "registry+https://github.com/rust-lang/crates.io-index"
83checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" 66checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
84 67
85[[package]] 68[[package]]
86name = "aws-config" 69name = "aws-config"
87version = "1.2.1" 70version = "1.6.1"
88source = "registry+https://github.com/rust-lang/crates.io-index" 71source = "registry+https://github.com/rust-lang/crates.io-index"
89checksum = "b2a4707646259764ab59fd9a50e9de2e92c637b28b36285d6f6fa030e915fbd9" 72checksum = "8c39646d1a6b51240a1a23bb57ea4eebede7e16fbc237fdc876980233dcecb4f"
90dependencies = [ 73dependencies = [
91 "aws-credential-types", 74 "aws-credential-types",
92 "aws-runtime", 75 "aws-runtime",
@@ -103,8 +86,7 @@ dependencies = [
103 "bytes", 86 "bytes",
104 "fastrand", 87 "fastrand",
105 "hex", 88 "hex",
106 "http 0.2.12", 89 "http 1.3.1",
107 "hyper 0.14.28",
108 "ring", 90 "ring",
109 "time", 91 "time",
110 "tokio", 92 "tokio",
@@ -115,9 +97,9 @@ dependencies = [
115 97
116[[package]] 98[[package]]
117name = "aws-credential-types" 99name = "aws-credential-types"
118version = "1.2.0" 100version = "1.2.2"
119source = "registry+https://github.com/rust-lang/crates.io-index" 101source = "registry+https://github.com/rust-lang/crates.io-index"
120checksum = "e16838e6c9e12125face1c1eff1343c75e3ff540de98ff7ebd61874a89bcfeb9" 102checksum = "4471bef4c22a06d2c7a1b6492493d3fdf24a805323109d6874f9c94d5906ac14"
121dependencies = [ 103dependencies = [
122 "aws-smithy-async", 104 "aws-smithy-async",
123 "aws-smithy-runtime-api", 105 "aws-smithy-runtime-api",
@@ -126,16 +108,40 @@ dependencies = [
126] 108]
127 109
128[[package]] 110[[package]]
111name = "aws-lc-rs"
112version = "1.13.0"
113source = "registry+https://github.com/rust-lang/crates.io-index"
114checksum = "19b756939cb2f8dc900aa6dcd505e6e2428e9cae7ff7b028c49e3946efa70878"
115dependencies = [
116 "aws-lc-sys",
117 "zeroize",
118]
119
120[[package]]
121name = "aws-lc-sys"
122version = "0.28.0"
123source = "registry+https://github.com/rust-lang/crates.io-index"
124checksum = "b9f7720b74ed28ca77f90769a71fd8c637a0137f6fae4ae947e1050229cff57f"
125dependencies = [
126 "bindgen",
127 "cc",
128 "cmake",
129 "dunce",
130 "fs_extra",
131]
132
133[[package]]
129name = "aws-runtime" 134name = "aws-runtime"
130version = "1.2.0" 135version = "1.5.6"
131source = "registry+https://github.com/rust-lang/crates.io-index" 136source = "registry+https://github.com/rust-lang/crates.io-index"
132checksum = "f4963ac9ff2d33a4231b3806c1c69f578f221a9cabb89ad2bde62ce2b442c8a7" 137checksum = "0aff45ffe35196e593ea3b9dd65b320e51e2dda95aff4390bc459e461d09c6ad"
133dependencies = [ 138dependencies = [
134 "aws-credential-types", 139 "aws-credential-types",
135 "aws-sigv4", 140 "aws-sigv4",
136 "aws-smithy-async", 141 "aws-smithy-async",
137 "aws-smithy-eventstream", 142 "aws-smithy-eventstream",
138 "aws-smithy-http", 143 "aws-smithy-http",
144 "aws-smithy-runtime",
139 "aws-smithy-runtime-api", 145 "aws-smithy-runtime-api",
140 "aws-smithy-types", 146 "aws-smithy-types",
141 "aws-types", 147 "aws-types",
@@ -143,6 +149,7 @@ dependencies = [
143 "fastrand", 149 "fastrand",
144 "http 0.2.12", 150 "http 0.2.12",
145 "http-body 0.4.6", 151 "http-body 0.4.6",
152 "once_cell",
146 "percent-encoding", 153 "percent-encoding",
147 "pin-project-lite", 154 "pin-project-lite",
148 "tracing", 155 "tracing",
@@ -151,11 +158,10 @@ dependencies = [
151 158
152[[package]] 159[[package]]
153name = "aws-sdk-s3" 160name = "aws-sdk-s3"
154version = "1.24.0" 161version = "1.82.0"
155source = "registry+https://github.com/rust-lang/crates.io-index" 162source = "registry+https://github.com/rust-lang/crates.io-index"
156checksum = "7f522b68eb0294c59f7beb0defa30e84fed24ebc50ee219e111d6c33eaea96a8" 163checksum = "e6eab2900764411ab01c8e91a76fd11a63b4e12bc3da97d9e14a0ce1343d86d3"
157dependencies = [ 164dependencies = [
158 "ahash",
159 "aws-credential-types", 165 "aws-credential-types",
160 "aws-runtime", 166 "aws-runtime",
161 "aws-sigv4", 167 "aws-sigv4",
@@ -174,6 +180,7 @@ dependencies = [
174 "hex", 180 "hex",
175 "hmac", 181 "hmac",
176 "http 0.2.12", 182 "http 0.2.12",
183 "http 1.3.1",
177 "http-body 0.4.6", 184 "http-body 0.4.6",
178 "lru", 185 "lru",
179 "once_cell", 186 "once_cell",
@@ -186,9 +193,9 @@ dependencies = [
186 193
187[[package]] 194[[package]]
188name = "aws-sdk-sso" 195name = "aws-sdk-sso"
189version = "1.21.0" 196version = "1.64.0"
190source = "registry+https://github.com/rust-lang/crates.io-index" 197source = "registry+https://github.com/rust-lang/crates.io-index"
191checksum = "3d70fb493f4183f5102d8a8d0cc9b57aec29a762f55c0e7bf527e0f7177bb408" 198checksum = "02d4bdb0e5f80f0689e61c77ab678b2b9304af329616af38aef5b6b967b8e736"
192dependencies = [ 199dependencies = [
193 "aws-credential-types", 200 "aws-credential-types",
194 "aws-runtime", 201 "aws-runtime",
@@ -200,6 +207,7 @@ dependencies = [
200 "aws-smithy-types", 207 "aws-smithy-types",
201 "aws-types", 208 "aws-types",
202 "bytes", 209 "bytes",
210 "fastrand",
203 "http 0.2.12", 211 "http 0.2.12",
204 "once_cell", 212 "once_cell",
205 "regex-lite", 213 "regex-lite",
@@ -208,9 +216,9 @@ dependencies = [
208 216
209[[package]] 217[[package]]
210name = "aws-sdk-ssooidc" 218name = "aws-sdk-ssooidc"
211version = "1.21.0" 219version = "1.65.0"
212source = "registry+https://github.com/rust-lang/crates.io-index" 220source = "registry+https://github.com/rust-lang/crates.io-index"
213checksum = "de3f37549b3e38b7ea5efd419d4d7add6ea1e55223506eb0b4fef9d25e7cc90d" 221checksum = "acbbb3ce8da257aedbccdcb1aadafbbb6a5fe9adf445db0e1ea897bdc7e22d08"
214dependencies = [ 222dependencies = [
215 "aws-credential-types", 223 "aws-credential-types",
216 "aws-runtime", 224 "aws-runtime",
@@ -222,6 +230,7 @@ dependencies = [
222 "aws-smithy-types", 230 "aws-smithy-types",
223 "aws-types", 231 "aws-types",
224 "bytes", 232 "bytes",
233 "fastrand",
225 "http 0.2.12", 234 "http 0.2.12",
226 "once_cell", 235 "once_cell",
227 "regex-lite", 236 "regex-lite",
@@ -230,9 +239,9 @@ dependencies = [
230 239
231[[package]] 240[[package]]
232name = "aws-sdk-sts" 241name = "aws-sdk-sts"
233version = "1.21.0" 242version = "1.65.0"
234source = "registry+https://github.com/rust-lang/crates.io-index" 243source = "registry+https://github.com/rust-lang/crates.io-index"
235checksum = "3b2ff219a5d4b795cd33251c19dbe9c4b401f2b2cbe513e07c76ada644eaf34e" 244checksum = "96a78a8f50a1630db757b60f679c8226a8a70ee2ab5f5e6e51dc67f6c61c7cfd"
236dependencies = [ 245dependencies = [
237 "aws-credential-types", 246 "aws-credential-types",
238 "aws-runtime", 247 "aws-runtime",
@@ -245,6 +254,7 @@ dependencies = [
245 "aws-smithy-types", 254 "aws-smithy-types",
246 "aws-smithy-xml", 255 "aws-smithy-xml",
247 "aws-types", 256 "aws-types",
257 "fastrand",
248 "http 0.2.12", 258 "http 0.2.12",
249 "once_cell", 259 "once_cell",
250 "regex-lite", 260 "regex-lite",
@@ -253,9 +263,9 @@ dependencies = [
253 263
254[[package]] 264[[package]]
255name = "aws-sigv4" 265name = "aws-sigv4"
256version = "1.2.1" 266version = "1.3.0"
257source = "registry+https://github.com/rust-lang/crates.io-index" 267source = "registry+https://github.com/rust-lang/crates.io-index"
258checksum = "58b56f1cbe6fd4d0c2573df72868f20ab1c125ca9c9dbce17927a463433a2e57" 268checksum = "69d03c3c05ff80d54ff860fe38c726f6f494c639ae975203a101335f223386db"
259dependencies = [ 269dependencies = [
260 "aws-credential-types", 270 "aws-credential-types",
261 "aws-smithy-eventstream", 271 "aws-smithy-eventstream",
@@ -268,7 +278,7 @@ dependencies = [
268 "hex", 278 "hex",
269 "hmac", 279 "hmac",
270 "http 0.2.12", 280 "http 0.2.12",
271 "http 1.1.0", 281 "http 1.3.1",
272 "once_cell", 282 "once_cell",
273 "p256", 283 "p256",
274 "percent-encoding", 284 "percent-encoding",
@@ -282,9 +292,9 @@ dependencies = [
282 292
283[[package]] 293[[package]]
284name = "aws-smithy-async" 294name = "aws-smithy-async"
285version = "1.2.1" 295version = "1.2.5"
286source = "registry+https://github.com/rust-lang/crates.io-index" 296source = "registry+https://github.com/rust-lang/crates.io-index"
287checksum = "62220bc6e97f946ddd51b5f1361f78996e704677afc518a4ff66b7a72ea1378c" 297checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c"
288dependencies = [ 298dependencies = [
289 "futures-util", 299 "futures-util",
290 "pin-project-lite", 300 "pin-project-lite",
@@ -293,15 +303,16 @@ dependencies = [
293 303
294[[package]] 304[[package]]
295name = "aws-smithy-checksums" 305name = "aws-smithy-checksums"
296version = "0.60.7" 306version = "0.63.1"
297source = "registry+https://github.com/rust-lang/crates.io-index" 307source = "registry+https://github.com/rust-lang/crates.io-index"
298checksum = "83fa43bc04a6b2441968faeab56e68da3812f978a670a5db32accbdcafddd12f" 308checksum = "b65d21e1ba6f2cdec92044f904356a19f5ad86961acf015741106cdfafd747c0"
299dependencies = [ 309dependencies = [
300 "aws-smithy-http", 310 "aws-smithy-http",
301 "aws-smithy-types", 311 "aws-smithy-types",
302 "bytes", 312 "bytes",
303 "crc32c", 313 "crc32c",
304 "crc32fast", 314 "crc32fast",
315 "crc64fast-nvme",
305 "hex", 316 "hex",
306 "http 0.2.12", 317 "http 0.2.12",
307 "http-body 0.4.6", 318 "http-body 0.4.6",
@@ -314,9 +325,9 @@ dependencies = [
314 325
315[[package]] 326[[package]]
316name = "aws-smithy-eventstream" 327name = "aws-smithy-eventstream"
317version = "0.60.4" 328version = "0.60.8"
318source = "registry+https://github.com/rust-lang/crates.io-index" 329source = "registry+https://github.com/rust-lang/crates.io-index"
319checksum = "e6363078f927f612b970edf9d1903ef5cef9a64d1e8423525ebb1f0a1633c858" 330checksum = "7c45d3dddac16c5c59d553ece225a88870cf81b7b813c9cc17b78cf4685eac7a"
320dependencies = [ 331dependencies = [
321 "aws-smithy-types", 332 "aws-smithy-types",
322 "bytes", 333 "bytes",
@@ -325,9 +336,9 @@ dependencies = [
325 336
326[[package]] 337[[package]]
327name = "aws-smithy-http" 338name = "aws-smithy-http"
328version = "0.60.8" 339version = "0.62.0"
329source = "registry+https://github.com/rust-lang/crates.io-index" 340source = "registry+https://github.com/rust-lang/crates.io-index"
330checksum = "4a7de001a1b9a25601016d8057ea16e31a45fdca3751304c8edf4ad72e706c08" 341checksum = "c5949124d11e538ca21142d1fba61ab0a2a2c1bc3ed323cdb3e4b878bfb83166"
331dependencies = [ 342dependencies = [
332 "aws-smithy-eventstream", 343 "aws-smithy-eventstream",
333 "aws-smithy-runtime-api", 344 "aws-smithy-runtime-api",
@@ -336,6 +347,7 @@ dependencies = [
336 "bytes-utils", 347 "bytes-utils",
337 "futures-core", 348 "futures-core",
338 "http 0.2.12", 349 "http 0.2.12",
350 "http 1.3.1",
339 "http-body 0.4.6", 351 "http-body 0.4.6",
340 "once_cell", 352 "once_cell",
341 "percent-encoding", 353 "percent-encoding",
@@ -345,15 +357,53 @@ dependencies = [
345] 357]
346 358
347[[package]] 359[[package]]
360name = "aws-smithy-http-client"
361version = "1.0.1"
362source = "registry+https://github.com/rust-lang/crates.io-index"
363checksum = "8aff1159006441d02e57204bf57a1b890ba68bedb6904ffd2873c1c4c11c546b"
364dependencies = [
365 "aws-smithy-async",
366 "aws-smithy-runtime-api",
367 "aws-smithy-types",
368 "h2 0.4.8",
369 "http 0.2.12",
370 "http 1.3.1",
371 "http-body 0.4.6",
372 "hyper 0.14.32",
373 "hyper 1.6.0",
374 "hyper-rustls 0.24.2",
375 "hyper-rustls 0.27.5",
376 "hyper-util",
377 "pin-project-lite",
378 "rustls 0.21.12",
379 "rustls 0.23.25",
380 "rustls-native-certs 0.8.1",
381 "rustls-pki-types",
382 "tokio",
383 "tower",
384 "tracing",
385]
386
387[[package]]
348name = "aws-smithy-json" 388name = "aws-smithy-json"
349version = "0.60.7" 389version = "0.61.3"
350source = "registry+https://github.com/rust-lang/crates.io-index" 390source = "registry+https://github.com/rust-lang/crates.io-index"
351checksum = "4683df9469ef09468dad3473d129960119a0d3593617542b7d52086c8486f2d6" 391checksum = "92144e45819cae7dc62af23eac5a038a58aa544432d2102609654376a900bd07"
352dependencies = [ 392dependencies = [
353 "aws-smithy-types", 393 "aws-smithy-types",
354] 394]
355 395
356[[package]] 396[[package]]
397name = "aws-smithy-observability"
398version = "0.1.2"
399source = "registry+https://github.com/rust-lang/crates.io-index"
400checksum = "445d065e76bc1ef54963db400319f1dd3ebb3e0a74af20f7f7630625b0cc7cc0"
401dependencies = [
402 "aws-smithy-runtime-api",
403 "once_cell",
404]
405
406[[package]]
357name = "aws-smithy-query" 407name = "aws-smithy-query"
358version = "0.60.7" 408version = "0.60.7"
359source = "registry+https://github.com/rust-lang/crates.io-index" 409source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -365,41 +415,40 @@ dependencies = [
365 415
366[[package]] 416[[package]]
367name = "aws-smithy-runtime" 417name = "aws-smithy-runtime"
368version = "1.3.1" 418version = "1.8.1"
369source = "registry+https://github.com/rust-lang/crates.io-index" 419source = "registry+https://github.com/rust-lang/crates.io-index"
370checksum = "44e7945379821074549168917e89e60630647e186a69243248f08c6d168b975a" 420checksum = "0152749e17ce4d1b47c7747bdfec09dac1ccafdcbc741ebf9daa2a373356730f"
371dependencies = [ 421dependencies = [
372 "aws-smithy-async", 422 "aws-smithy-async",
373 "aws-smithy-http", 423 "aws-smithy-http",
424 "aws-smithy-http-client",
425 "aws-smithy-observability",
374 "aws-smithy-runtime-api", 426 "aws-smithy-runtime-api",
375 "aws-smithy-types", 427 "aws-smithy-types",
376 "bytes", 428 "bytes",
377 "fastrand", 429 "fastrand",
378 "h2",
379 "http 0.2.12", 430 "http 0.2.12",
431 "http 1.3.1",
380 "http-body 0.4.6", 432 "http-body 0.4.6",
381 "http-body 1.0.0", 433 "http-body 1.0.1",
382 "hyper 0.14.28",
383 "hyper-rustls",
384 "once_cell", 434 "once_cell",
385 "pin-project-lite", 435 "pin-project-lite",
386 "pin-utils", 436 "pin-utils",
387 "rustls",
388 "tokio", 437 "tokio",
389 "tracing", 438 "tracing",
390] 439]
391 440
392[[package]] 441[[package]]
393name = "aws-smithy-runtime-api" 442name = "aws-smithy-runtime-api"
394version = "1.4.0" 443version = "1.7.4"
395source = "registry+https://github.com/rust-lang/crates.io-index" 444source = "registry+https://github.com/rust-lang/crates.io-index"
396checksum = "4cc56a5c96ec741de6c5e6bf1ce6948be969d6506dfa9c39cffc284e31e4979b" 445checksum = "3da37cf5d57011cb1753456518ec76e31691f1f474b73934a284eb2a1c76510f"
397dependencies = [ 446dependencies = [
398 "aws-smithy-async", 447 "aws-smithy-async",
399 "aws-smithy-types", 448 "aws-smithy-types",
400 "bytes", 449 "bytes",
401 "http 0.2.12", 450 "http 0.2.12",
402 "http 1.1.0", 451 "http 1.3.1",
403 "pin-project-lite", 452 "pin-project-lite",
404 "tokio", 453 "tokio",
405 "tracing", 454 "tracing",
@@ -408,18 +457,18 @@ dependencies = [
408 457
409[[package]] 458[[package]]
410name = "aws-smithy-types" 459name = "aws-smithy-types"
411version = "1.1.8" 460version = "1.3.0"
412source = "registry+https://github.com/rust-lang/crates.io-index" 461source = "registry+https://github.com/rust-lang/crates.io-index"
413checksum = "abe14dceea1e70101d38fbf2a99e6a34159477c0fb95e68e05c66bd7ae4c3729" 462checksum = "836155caafba616c0ff9b07944324785de2ab016141c3550bd1c07882f8cee8f"
414dependencies = [ 463dependencies = [
415 "base64-simd", 464 "base64-simd",
416 "bytes", 465 "bytes",
417 "bytes-utils", 466 "bytes-utils",
418 "futures-core", 467 "futures-core",
419 "http 0.2.12", 468 "http 0.2.12",
420 "http 1.1.0", 469 "http 1.3.1",
421 "http-body 0.4.6", 470 "http-body 0.4.6",
422 "http-body 1.0.0", 471 "http-body 1.0.1",
423 "http-body-util", 472 "http-body-util",
424 "itoa", 473 "itoa",
425 "num-integer", 474 "num-integer",
@@ -434,42 +483,41 @@ dependencies = [
434 483
435[[package]] 484[[package]]
436name = "aws-smithy-xml" 485name = "aws-smithy-xml"
437version = "0.60.8" 486version = "0.60.9"
438source = "registry+https://github.com/rust-lang/crates.io-index" 487source = "registry+https://github.com/rust-lang/crates.io-index"
439checksum = "d123fbc2a4adc3c301652ba8e149bf4bc1d1725affb9784eb20c953ace06bf55" 488checksum = "ab0b0166827aa700d3dc519f72f8b3a91c35d0b8d042dc5d643a91e6f80648fc"
440dependencies = [ 489dependencies = [
441 "xmlparser", 490 "xmlparser",
442] 491]
443 492
444[[package]] 493[[package]]
445name = "aws-types" 494name = "aws-types"
446version = "1.2.0" 495version = "1.3.6"
447source = "registry+https://github.com/rust-lang/crates.io-index" 496source = "registry+https://github.com/rust-lang/crates.io-index"
448checksum = "5a43b56df2c529fe44cb4d92bd64d0479883fb9608ff62daede4df5405381814" 497checksum = "3873f8deed8927ce8d04487630dc9ff73193bab64742a61d050e57a68dec4125"
449dependencies = [ 498dependencies = [
450 "aws-credential-types", 499 "aws-credential-types",
451 "aws-smithy-async", 500 "aws-smithy-async",
452 "aws-smithy-runtime-api", 501 "aws-smithy-runtime-api",
453 "aws-smithy-types", 502 "aws-smithy-types",
454 "http 0.2.12",
455 "rustc_version", 503 "rustc_version",
456 "tracing", 504 "tracing",
457] 505]
458 506
459[[package]] 507[[package]]
460name = "axum" 508name = "axum"
461version = "0.7.5" 509version = "0.8.3"
462source = "registry+https://github.com/rust-lang/crates.io-index" 510source = "registry+https://github.com/rust-lang/crates.io-index"
463checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" 511checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288"
464dependencies = [ 512dependencies = [
465 "async-trait",
466 "axum-core", 513 "axum-core",
467 "bytes", 514 "bytes",
515 "form_urlencoded",
468 "futures-util", 516 "futures-util",
469 "http 1.1.0", 517 "http 1.3.1",
470 "http-body 1.0.0", 518 "http-body 1.0.1",
471 "http-body-util", 519 "http-body-util",
472 "hyper 1.3.1", 520 "hyper 1.6.0",
473 "hyper-util", 521 "hyper-util",
474 "itoa", 522 "itoa",
475 "matchit", 523 "matchit",
@@ -482,7 +530,7 @@ dependencies = [
482 "serde_json", 530 "serde_json",
483 "serde_path_to_error", 531 "serde_path_to_error",
484 "serde_urlencoded", 532 "serde_urlencoded",
485 "sync_wrapper 1.0.1", 533 "sync_wrapper",
486 "tokio", 534 "tokio",
487 "tower", 535 "tower",
488 "tower-layer", 536 "tower-layer",
@@ -492,20 +540,19 @@ dependencies = [
492 540
493[[package]] 541[[package]]
494name = "axum-core" 542name = "axum-core"
495version = "0.4.3" 543version = "0.5.2"
496source = "registry+https://github.com/rust-lang/crates.io-index" 544source = "registry+https://github.com/rust-lang/crates.io-index"
497checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" 545checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6"
498dependencies = [ 546dependencies = [
499 "async-trait",
500 "bytes", 547 "bytes",
501 "futures-util", 548 "futures-core",
502 "http 1.1.0", 549 "http 1.3.1",
503 "http-body 1.0.0", 550 "http-body 1.0.1",
504 "http-body-util", 551 "http-body-util",
505 "mime", 552 "mime",
506 "pin-project-lite", 553 "pin-project-lite",
507 "rustversion", 554 "rustversion",
508 "sync_wrapper 0.1.2", 555 "sync_wrapper",
509 "tower-layer", 556 "tower-layer",
510 "tower-service", 557 "tower-service",
511 "tracing", 558 "tracing",
@@ -513,17 +560,17 @@ dependencies = [
513 560
514[[package]] 561[[package]]
515name = "backtrace" 562name = "backtrace"
516version = "0.3.71" 563version = "0.3.74"
517source = "registry+https://github.com/rust-lang/crates.io-index" 564source = "registry+https://github.com/rust-lang/crates.io-index"
518checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" 565checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
519dependencies = [ 566dependencies = [
520 "addr2line", 567 "addr2line",
521 "cc",
522 "cfg-if", 568 "cfg-if",
523 "libc", 569 "libc",
524 "miniz_oxide", 570 "miniz_oxide",
525 "object", 571 "object",
526 "rustc-demangle", 572 "rustc-demangle",
573 "windows-targets",
527] 574]
528 575
529[[package]] 576[[package]]
@@ -539,6 +586,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
539checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 586checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
540 587
541[[package]] 588[[package]]
589name = "base64"
590version = "0.22.1"
591source = "registry+https://github.com/rust-lang/crates.io-index"
592checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
593
594[[package]]
542name = "base64-simd" 595name = "base64-simd"
543version = "0.8.0" 596version = "0.8.0"
544source = "registry+https://github.com/rust-lang/crates.io-index" 597source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -550,21 +603,38 @@ dependencies = [
550 603
551[[package]] 604[[package]]
552name = "base64ct" 605name = "base64ct"
553version = "1.6.0" 606version = "1.7.3"
554source = "registry+https://github.com/rust-lang/crates.io-index" 607source = "registry+https://github.com/rust-lang/crates.io-index"
555checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 608checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3"
556 609
557[[package]] 610[[package]]
558name = "bitflags" 611name = "bindgen"
559version = "1.3.2" 612version = "0.69.5"
560source = "registry+https://github.com/rust-lang/crates.io-index" 613source = "registry+https://github.com/rust-lang/crates.io-index"
561checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 614checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088"
615dependencies = [
616 "bitflags",
617 "cexpr",
618 "clang-sys",
619 "itertools",
620 "lazy_static",
621 "lazycell",
622 "log",
623 "prettyplease",
624 "proc-macro2",
625 "quote",
626 "regex",
627 "rustc-hash",
628 "shlex",
629 "syn",
630 "which",
631]
562 632
563[[package]] 633[[package]]
564name = "bitflags" 634name = "bitflags"
565version = "2.5.0" 635version = "2.9.0"
566source = "registry+https://github.com/rust-lang/crates.io-index" 636source = "registry+https://github.com/rust-lang/crates.io-index"
567checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" 637checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
568 638
569[[package]] 639[[package]]
570name = "block-buffer" 640name = "block-buffer"
@@ -577,15 +647,15 @@ dependencies = [
577 647
578[[package]] 648[[package]]
579name = "bumpalo" 649name = "bumpalo"
580version = "3.16.0" 650version = "3.17.0"
581source = "registry+https://github.com/rust-lang/crates.io-index" 651source = "registry+https://github.com/rust-lang/crates.io-index"
582checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 652checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
583 653
584[[package]] 654[[package]]
585name = "bytes" 655name = "bytes"
586version = "1.6.0" 656version = "1.10.1"
587source = "registry+https://github.com/rust-lang/crates.io-index" 657source = "registry+https://github.com/rust-lang/crates.io-index"
588checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" 658checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
589 659
590[[package]] 660[[package]]
591name = "bytes-utils" 661name = "bytes-utils"
@@ -599,9 +669,23 @@ dependencies = [
599 669
600[[package]] 670[[package]]
601name = "cc" 671name = "cc"
602version = "1.0.95" 672version = "1.2.18"
673source = "registry+https://github.com/rust-lang/crates.io-index"
674checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c"
675dependencies = [
676 "jobserver",
677 "libc",
678 "shlex",
679]
680
681[[package]]
682name = "cexpr"
683version = "0.6.0"
603source = "registry+https://github.com/rust-lang/crates.io-index" 684source = "registry+https://github.com/rust-lang/crates.io-index"
604checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" 685checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
686dependencies = [
687 "nom",
688]
605 689
606[[package]] 690[[package]]
607name = "cfg-if" 691name = "cfg-if"
@@ -611,9 +695,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
611 695
612[[package]] 696[[package]]
613name = "chrono" 697name = "chrono"
614version = "0.4.38" 698version = "0.4.40"
615source = "registry+https://github.com/rust-lang/crates.io-index" 699source = "registry+https://github.com/rust-lang/crates.io-index"
616checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" 700checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c"
617dependencies = [ 701dependencies = [
618 "android-tzdata", 702 "android-tzdata",
619 "iana-time-zone", 703 "iana-time-zone",
@@ -621,7 +705,27 @@ dependencies = [
621 "num-traits", 705 "num-traits",
622 "serde", 706 "serde",
623 "wasm-bindgen", 707 "wasm-bindgen",
624 "windows-targets 0.52.5", 708 "windows-link",
709]
710
711[[package]]
712name = "clang-sys"
713version = "1.8.1"
714source = "registry+https://github.com/rust-lang/crates.io-index"
715checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
716dependencies = [
717 "glob",
718 "libc",
719 "libloading",
720]
721
722[[package]]
723name = "cmake"
724version = "0.1.54"
725source = "registry+https://github.com/rust-lang/crates.io-index"
726checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0"
727dependencies = [
728 "cc",
625] 729]
626 730
627[[package]] 731[[package]]
@@ -641,39 +745,73 @@ dependencies = [
641] 745]
642 746
643[[package]] 747[[package]]
748name = "core-foundation"
749version = "0.10.0"
750source = "registry+https://github.com/rust-lang/crates.io-index"
751checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63"
752dependencies = [
753 "core-foundation-sys",
754 "libc",
755]
756
757[[package]]
644name = "core-foundation-sys" 758name = "core-foundation-sys"
645version = "0.8.6" 759version = "0.8.7"
646source = "registry+https://github.com/rust-lang/crates.io-index" 760source = "registry+https://github.com/rust-lang/crates.io-index"
647checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 761checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
648 762
649[[package]] 763[[package]]
650name = "cpufeatures" 764name = "cpufeatures"
651version = "0.2.12" 765version = "0.2.17"
652source = "registry+https://github.com/rust-lang/crates.io-index" 766source = "registry+https://github.com/rust-lang/crates.io-index"
653checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 767checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
654dependencies = [ 768dependencies = [
655 "libc", 769 "libc",
656] 770]
657 771
658[[package]] 772[[package]]
773name = "crc"
774version = "3.2.1"
775source = "registry+https://github.com/rust-lang/crates.io-index"
776checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
777dependencies = [
778 "crc-catalog",
779]
780
781[[package]]
782name = "crc-catalog"
783version = "2.4.0"
784source = "registry+https://github.com/rust-lang/crates.io-index"
785checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
786
787[[package]]
659name = "crc32c" 788name = "crc32c"
660version = "0.6.5" 789version = "0.6.8"
661source = "registry+https://github.com/rust-lang/crates.io-index" 790source = "registry+https://github.com/rust-lang/crates.io-index"
662checksum = "89254598aa9b9fa608de44b3ae54c810f0f06d755e24c50177f1f8f31ff50ce2" 791checksum = "3a47af21622d091a8f0fb295b88bc886ac74efcc613efc19f5d0b21de5c89e47"
663dependencies = [ 792dependencies = [
664 "rustc_version", 793 "rustc_version",
665] 794]
666 795
667[[package]] 796[[package]]
668name = "crc32fast" 797name = "crc32fast"
669version = "1.4.0" 798version = "1.4.2"
670source = "registry+https://github.com/rust-lang/crates.io-index" 799source = "registry+https://github.com/rust-lang/crates.io-index"
671checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" 800checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
672dependencies = [ 801dependencies = [
673 "cfg-if", 802 "cfg-if",
674] 803]
675 804
676[[package]] 805[[package]]
806name = "crc64fast-nvme"
807version = "1.2.0"
808source = "registry+https://github.com/rust-lang/crates.io-index"
809checksum = "4955638f00a809894c947f85a024020a20815b65a5eea633798ea7924edab2b3"
810dependencies = [
811 "crc",
812]
813
814[[package]]
677name = "crypto-bigint" 815name = "crypto-bigint"
678version = "0.4.9" 816version = "0.4.9"
679source = "registry+https://github.com/rust-lang/crates.io-index" 817source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -717,9 +855,9 @@ dependencies = [
717 855
718[[package]] 856[[package]]
719name = "deranged" 857name = "deranged"
720version = "0.3.11" 858version = "0.4.0"
721source = "registry+https://github.com/rust-lang/crates.io-index" 859source = "registry+https://github.com/rust-lang/crates.io-index"
722checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 860checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
723dependencies = [ 861dependencies = [
724 "powerfmt", 862 "powerfmt",
725] 863]
@@ -736,6 +874,23 @@ dependencies = [
736] 874]
737 875
738[[package]] 876[[package]]
877name = "displaydoc"
878version = "0.2.5"
879source = "registry+https://github.com/rust-lang/crates.io-index"
880checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
881dependencies = [
882 "proc-macro2",
883 "quote",
884 "syn",
885]
886
887[[package]]
888name = "dunce"
889version = "1.0.5"
890source = "registry+https://github.com/rust-lang/crates.io-index"
891checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
892
893[[package]]
739name = "ecdsa" 894name = "ecdsa"
740version = "0.14.8" 895version = "0.14.8"
741source = "registry+https://github.com/rust-lang/crates.io-index" 896source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -749,9 +904,9 @@ dependencies = [
749 904
750[[package]] 905[[package]]
751name = "either" 906name = "either"
752version = "1.11.0" 907version = "1.15.0"
753source = "registry+https://github.com/rust-lang/crates.io-index" 908source = "registry+https://github.com/rust-lang/crates.io-index"
754checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" 909checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
755 910
756[[package]] 911[[package]]
757name = "elliptic-curve" 912name = "elliptic-curve"
@@ -775,15 +930,25 @@ dependencies = [
775 930
776[[package]] 931[[package]]
777name = "equivalent" 932name = "equivalent"
778version = "1.0.1" 933version = "1.0.2"
779source = "registry+https://github.com/rust-lang/crates.io-index" 934source = "registry+https://github.com/rust-lang/crates.io-index"
780checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 935checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
936
937[[package]]
938name = "errno"
939version = "0.3.11"
940source = "registry+https://github.com/rust-lang/crates.io-index"
941checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
942dependencies = [
943 "libc",
944 "windows-sys 0.59.0",
945]
781 946
782[[package]] 947[[package]]
783name = "fastrand" 948name = "fastrand"
784version = "2.1.0" 949version = "2.3.0"
785source = "registry+https://github.com/rust-lang/crates.io-index" 950source = "registry+https://github.com/rust-lang/crates.io-index"
786checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" 951checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
787 952
788[[package]] 953[[package]]
789name = "ff" 954name = "ff"
@@ -802,6 +967,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
802checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 967checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
803 968
804[[package]] 969[[package]]
970name = "foldhash"
971version = "0.1.5"
972source = "registry+https://github.com/rust-lang/crates.io-index"
973checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
974
975[[package]]
805name = "form_urlencoded" 976name = "form_urlencoded"
806version = "1.2.1" 977version = "1.2.1"
807source = "registry+https://github.com/rust-lang/crates.io-index" 978source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -811,37 +982,43 @@ dependencies = [
811] 982]
812 983
813[[package]] 984[[package]]
985name = "fs_extra"
986version = "1.3.0"
987source = "registry+https://github.com/rust-lang/crates.io-index"
988checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
989
990[[package]]
814name = "futures-channel" 991name = "futures-channel"
815version = "0.3.30" 992version = "0.3.31"
816source = "registry+https://github.com/rust-lang/crates.io-index" 993source = "registry+https://github.com/rust-lang/crates.io-index"
817checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 994checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
818dependencies = [ 995dependencies = [
819 "futures-core", 996 "futures-core",
820] 997]
821 998
822[[package]] 999[[package]]
823name = "futures-core" 1000name = "futures-core"
824version = "0.3.30" 1001version = "0.3.31"
825source = "registry+https://github.com/rust-lang/crates.io-index" 1002source = "registry+https://github.com/rust-lang/crates.io-index"
826checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 1003checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
827 1004
828[[package]] 1005[[package]]
829name = "futures-sink" 1006name = "futures-sink"
830version = "0.3.30" 1007version = "0.3.31"
831source = "registry+https://github.com/rust-lang/crates.io-index" 1008source = "registry+https://github.com/rust-lang/crates.io-index"
832checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 1009checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
833 1010
834[[package]] 1011[[package]]
835name = "futures-task" 1012name = "futures-task"
836version = "0.3.30" 1013version = "0.3.31"
837source = "registry+https://github.com/rust-lang/crates.io-index" 1014source = "registry+https://github.com/rust-lang/crates.io-index"
838checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 1015checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
839 1016
840[[package]] 1017[[package]]
841name = "futures-util" 1018name = "futures-util"
842version = "0.3.30" 1019version = "0.3.31"
843source = "registry+https://github.com/rust-lang/crates.io-index" 1020source = "registry+https://github.com/rust-lang/crates.io-index"
844checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 1021checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
845dependencies = [ 1022dependencies = [
846 "futures-core", 1023 "futures-core",
847 "futures-task", 1024 "futures-task",
@@ -861,20 +1038,32 @@ dependencies = [
861 1038
862[[package]] 1039[[package]]
863name = "getrandom" 1040name = "getrandom"
864version = "0.2.14" 1041version = "0.2.15"
1042source = "registry+https://github.com/rust-lang/crates.io-index"
1043checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
1044dependencies = [
1045 "cfg-if",
1046 "libc",
1047 "wasi 0.11.0+wasi-snapshot-preview1",
1048]
1049
1050[[package]]
1051name = "getrandom"
1052version = "0.3.2"
865source = "registry+https://github.com/rust-lang/crates.io-index" 1053source = "registry+https://github.com/rust-lang/crates.io-index"
866checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" 1054checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0"
867dependencies = [ 1055dependencies = [
868 "cfg-if", 1056 "cfg-if",
869 "libc", 1057 "libc",
870 "wasi", 1058 "r-efi",
1059 "wasi 0.14.2+wasi-0.2.4",
871] 1060]
872 1061
873[[package]] 1062[[package]]
874name = "gimli" 1063name = "gimli"
875version = "0.28.1" 1064version = "0.31.1"
876source = "registry+https://github.com/rust-lang/crates.io-index" 1065source = "registry+https://github.com/rust-lang/crates.io-index"
877checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 1066checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
878 1067
879[[package]] 1068[[package]]
880name = "gitolfs3-authenticate" 1069name = "gitolfs3-authenticate"
@@ -903,7 +1092,7 @@ dependencies = [
903 "aws-config", 1092 "aws-config",
904 "aws-sdk-s3", 1093 "aws-sdk-s3",
905 "axum", 1094 "axum",
906 "base64", 1095 "base64 0.22.1",
907 "chrono", 1096 "chrono",
908 "gitolfs3-common", 1097 "gitolfs3-common",
909 "mime", 1098 "mime",
@@ -920,6 +1109,12 @@ name = "gitolfs3-shell"
920version = "0.1.0" 1109version = "0.1.0"
921 1110
922[[package]] 1111[[package]]
1112name = "glob"
1113version = "0.3.2"
1114source = "registry+https://github.com/rust-lang/crates.io-index"
1115checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
1116
1117[[package]]
923name = "group" 1118name = "group"
924version = "0.12.1" 1119version = "0.12.1"
925source = "registry+https://github.com/rust-lang/crates.io-index" 1120source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -950,20 +1145,34 @@ dependencies = [
950] 1145]
951 1146
952[[package]] 1147[[package]]
953name = "hashbrown" 1148name = "h2"
954version = "0.14.5" 1149version = "0.4.8"
955source = "registry+https://github.com/rust-lang/crates.io-index" 1150source = "registry+https://github.com/rust-lang/crates.io-index"
956checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1151checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2"
957dependencies = [ 1152dependencies = [
958 "ahash", 1153 "atomic-waker",
959 "allocator-api2", 1154 "bytes",
1155 "fnv",
1156 "futures-core",
1157 "futures-sink",
1158 "http 1.3.1",
1159 "indexmap",
1160 "slab",
1161 "tokio",
1162 "tokio-util",
1163 "tracing",
960] 1164]
961 1165
962[[package]] 1166[[package]]
963name = "hermit-abi" 1167name = "hashbrown"
964version = "0.3.9" 1168version = "0.15.2"
965source = "registry+https://github.com/rust-lang/crates.io-index" 1169source = "registry+https://github.com/rust-lang/crates.io-index"
966checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 1170checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
1171dependencies = [
1172 "allocator-api2",
1173 "equivalent",
1174 "foldhash",
1175]
967 1176
968[[package]] 1177[[package]]
969name = "hex" 1178name = "hex"
@@ -982,9 +1191,18 @@ dependencies = [
982 1191
983[[package]] 1192[[package]]
984name = "hmac-sha256" 1193name = "hmac-sha256"
985version = "1.1.7" 1194version = "1.1.8"
986source = "registry+https://github.com/rust-lang/crates.io-index" 1195source = "registry+https://github.com/rust-lang/crates.io-index"
987checksum = "3688e69b38018fec1557254f64c8dc2cc8ec502890182f395dbb0aa997aa5735" 1196checksum = "4a8575493d277c9092b988c780c94737fb9fd8651a1001e16bee3eccfc1baedb"
1197
1198[[package]]
1199name = "home"
1200version = "0.5.11"
1201source = "registry+https://github.com/rust-lang/crates.io-index"
1202checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf"
1203dependencies = [
1204 "windows-sys 0.59.0",
1205]
988 1206
989[[package]] 1207[[package]]
990name = "http" 1208name = "http"
@@ -999,9 +1217,9 @@ dependencies = [
999 1217
1000[[package]] 1218[[package]]
1001name = "http" 1219name = "http"
1002version = "1.1.0" 1220version = "1.3.1"
1003source = "registry+https://github.com/rust-lang/crates.io-index" 1221source = "registry+https://github.com/rust-lang/crates.io-index"
1004checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 1222checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
1005dependencies = [ 1223dependencies = [
1006 "bytes", 1224 "bytes",
1007 "fnv", 1225 "fnv",
@@ -1021,32 +1239,32 @@ dependencies = [
1021 1239
1022[[package]] 1240[[package]]
1023name = "http-body" 1241name = "http-body"
1024version = "1.0.0" 1242version = "1.0.1"
1025source = "registry+https://github.com/rust-lang/crates.io-index" 1243source = "registry+https://github.com/rust-lang/crates.io-index"
1026checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" 1244checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
1027dependencies = [ 1245dependencies = [
1028 "bytes", 1246 "bytes",
1029 "http 1.1.0", 1247 "http 1.3.1",
1030] 1248]
1031 1249
1032[[package]] 1250[[package]]
1033name = "http-body-util" 1251name = "http-body-util"
1034version = "0.1.1" 1252version = "0.1.3"
1035source = "registry+https://github.com/rust-lang/crates.io-index" 1253source = "registry+https://github.com/rust-lang/crates.io-index"
1036checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" 1254checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
1037dependencies = [ 1255dependencies = [
1038 "bytes", 1256 "bytes",
1039 "futures-core", 1257 "futures-core",
1040 "http 1.1.0", 1258 "http 1.3.1",
1041 "http-body 1.0.0", 1259 "http-body 1.0.1",
1042 "pin-project-lite", 1260 "pin-project-lite",
1043] 1261]
1044 1262
1045[[package]] 1263[[package]]
1046name = "httparse" 1264name = "httparse"
1047version = "1.8.0" 1265version = "1.10.1"
1048source = "registry+https://github.com/rust-lang/crates.io-index" 1266source = "registry+https://github.com/rust-lang/crates.io-index"
1049checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1267checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
1050 1268
1051[[package]] 1269[[package]]
1052name = "httpdate" 1270name = "httpdate"
@@ -1056,15 +1274,15 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
1056 1274
1057[[package]] 1275[[package]]
1058name = "hyper" 1276name = "hyper"
1059version = "0.14.28" 1277version = "0.14.32"
1060source = "registry+https://github.com/rust-lang/crates.io-index" 1278source = "registry+https://github.com/rust-lang/crates.io-index"
1061checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" 1279checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7"
1062dependencies = [ 1280dependencies = [
1063 "bytes", 1281 "bytes",
1064 "futures-channel", 1282 "futures-channel",
1065 "futures-core", 1283 "futures-core",
1066 "futures-util", 1284 "futures-util",
1067 "h2", 1285 "h2 0.3.26",
1068 "http 0.2.12", 1286 "http 0.2.12",
1069 "http-body 0.4.6", 1287 "http-body 0.4.6",
1070 "httparse", 1288 "httparse",
@@ -1080,21 +1298,23 @@ dependencies = [
1080 1298
1081[[package]] 1299[[package]]
1082name = "hyper" 1300name = "hyper"
1083version = "1.3.1" 1301version = "1.6.0"
1084source = "registry+https://github.com/rust-lang/crates.io-index" 1302source = "registry+https://github.com/rust-lang/crates.io-index"
1085checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" 1303checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
1086dependencies = [ 1304dependencies = [
1087 "bytes", 1305 "bytes",
1088 "futures-channel", 1306 "futures-channel",
1089 "futures-util", 1307 "futures-util",
1090 "http 1.1.0", 1308 "h2 0.4.8",
1091 "http-body 1.0.0", 1309 "http 1.3.1",
1310 "http-body 1.0.1",
1092 "httparse", 1311 "httparse",
1093 "httpdate", 1312 "httpdate",
1094 "itoa", 1313 "itoa",
1095 "pin-project-lite", 1314 "pin-project-lite",
1096 "smallvec", 1315 "smallvec",
1097 "tokio", 1316 "tokio",
1317 "want",
1098] 1318]
1099 1319
1100[[package]] 1320[[package]]
@@ -1105,40 +1325,63 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
1105dependencies = [ 1325dependencies = [
1106 "futures-util", 1326 "futures-util",
1107 "http 0.2.12", 1327 "http 0.2.12",
1108 "hyper 0.14.28", 1328 "hyper 0.14.32",
1109 "log", 1329 "log",
1110 "rustls", 1330 "rustls 0.21.12",
1111 "rustls-native-certs", 1331 "rustls-native-certs 0.6.3",
1332 "tokio",
1333 "tokio-rustls 0.24.1",
1334]
1335
1336[[package]]
1337name = "hyper-rustls"
1338version = "0.27.5"
1339source = "registry+https://github.com/rust-lang/crates.io-index"
1340checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2"
1341dependencies = [
1342 "futures-util",
1343 "http 1.3.1",
1344 "hyper 1.6.0",
1345 "hyper-util",
1346 "rustls 0.23.25",
1347 "rustls-native-certs 0.8.1",
1348 "rustls-pki-types",
1112 "tokio", 1349 "tokio",
1113 "tokio-rustls", 1350 "tokio-rustls 0.26.2",
1351 "tower-service",
1114] 1352]
1115 1353
1116[[package]] 1354[[package]]
1117name = "hyper-util" 1355name = "hyper-util"
1118version = "0.1.3" 1356version = "0.1.11"
1119source = "registry+https://github.com/rust-lang/crates.io-index" 1357source = "registry+https://github.com/rust-lang/crates.io-index"
1120checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" 1358checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2"
1121dependencies = [ 1359dependencies = [
1122 "bytes", 1360 "bytes",
1361 "futures-channel",
1123 "futures-util", 1362 "futures-util",
1124 "http 1.1.0", 1363 "http 1.3.1",
1125 "http-body 1.0.0", 1364 "http-body 1.0.1",
1126 "hyper 1.3.1", 1365 "hyper 1.6.0",
1366 "libc",
1127 "pin-project-lite", 1367 "pin-project-lite",
1128 "socket2", 1368 "socket2",
1129 "tokio", 1369 "tokio",
1370 "tower-service",
1371 "tracing",
1130] 1372]
1131 1373
1132[[package]] 1374[[package]]
1133name = "iana-time-zone" 1375name = "iana-time-zone"
1134version = "0.1.60" 1376version = "0.1.63"
1135source = "registry+https://github.com/rust-lang/crates.io-index" 1377source = "registry+https://github.com/rust-lang/crates.io-index"
1136checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" 1378checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
1137dependencies = [ 1379dependencies = [
1138 "android_system_properties", 1380 "android_system_properties",
1139 "core-foundation-sys", 1381 "core-foundation-sys",
1140 "iana-time-zone-haiku", 1382 "iana-time-zone-haiku",
1141 "js-sys", 1383 "js-sys",
1384 "log",
1142 "wasm-bindgen", 1385 "wasm-bindgen",
1143 "windows-core", 1386 "windows-core",
1144] 1387]
@@ -1153,51 +1396,228 @@ dependencies = [
1153] 1396]
1154 1397
1155[[package]] 1398[[package]]
1399name = "icu_collections"
1400version = "1.5.0"
1401source = "registry+https://github.com/rust-lang/crates.io-index"
1402checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
1403dependencies = [
1404 "displaydoc",
1405 "yoke",
1406 "zerofrom",
1407 "zerovec",
1408]
1409
1410[[package]]
1411name = "icu_locid"
1412version = "1.5.0"
1413source = "registry+https://github.com/rust-lang/crates.io-index"
1414checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
1415dependencies = [
1416 "displaydoc",
1417 "litemap",
1418 "tinystr",
1419 "writeable",
1420 "zerovec",
1421]
1422
1423[[package]]
1424name = "icu_locid_transform"
1425version = "1.5.0"
1426source = "registry+https://github.com/rust-lang/crates.io-index"
1427checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
1428dependencies = [
1429 "displaydoc",
1430 "icu_locid",
1431 "icu_locid_transform_data",
1432 "icu_provider",
1433 "tinystr",
1434 "zerovec",
1435]
1436
1437[[package]]
1438name = "icu_locid_transform_data"
1439version = "1.5.1"
1440source = "registry+https://github.com/rust-lang/crates.io-index"
1441checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d"
1442
1443[[package]]
1444name = "icu_normalizer"
1445version = "1.5.0"
1446source = "registry+https://github.com/rust-lang/crates.io-index"
1447checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
1448dependencies = [
1449 "displaydoc",
1450 "icu_collections",
1451 "icu_normalizer_data",
1452 "icu_properties",
1453 "icu_provider",
1454 "smallvec",
1455 "utf16_iter",
1456 "utf8_iter",
1457 "write16",
1458 "zerovec",
1459]
1460
1461[[package]]
1462name = "icu_normalizer_data"
1463version = "1.5.1"
1464source = "registry+https://github.com/rust-lang/crates.io-index"
1465checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7"
1466
1467[[package]]
1468name = "icu_properties"
1469version = "1.5.1"
1470source = "registry+https://github.com/rust-lang/crates.io-index"
1471checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
1472dependencies = [
1473 "displaydoc",
1474 "icu_collections",
1475 "icu_locid_transform",
1476 "icu_properties_data",
1477 "icu_provider",
1478 "tinystr",
1479 "zerovec",
1480]
1481
1482[[package]]
1483name = "icu_properties_data"
1484version = "1.5.1"
1485source = "registry+https://github.com/rust-lang/crates.io-index"
1486checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2"
1487
1488[[package]]
1489name = "icu_provider"
1490version = "1.5.0"
1491source = "registry+https://github.com/rust-lang/crates.io-index"
1492checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
1493dependencies = [
1494 "displaydoc",
1495 "icu_locid",
1496 "icu_provider_macros",
1497 "stable_deref_trait",
1498 "tinystr",
1499 "writeable",
1500 "yoke",
1501 "zerofrom",
1502 "zerovec",
1503]
1504
1505[[package]]
1506name = "icu_provider_macros"
1507version = "1.5.0"
1508source = "registry+https://github.com/rust-lang/crates.io-index"
1509checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
1510dependencies = [
1511 "proc-macro2",
1512 "quote",
1513 "syn",
1514]
1515
1516[[package]]
1156name = "idna" 1517name = "idna"
1157version = "0.5.0" 1518version = "1.0.3"
1519source = "registry+https://github.com/rust-lang/crates.io-index"
1520checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
1521dependencies = [
1522 "idna_adapter",
1523 "smallvec",
1524 "utf8_iter",
1525]
1526
1527[[package]]
1528name = "idna_adapter"
1529version = "1.2.0"
1158source = "registry+https://github.com/rust-lang/crates.io-index" 1530source = "registry+https://github.com/rust-lang/crates.io-index"
1159checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 1531checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
1160dependencies = [ 1532dependencies = [
1161 "unicode-bidi", 1533 "icu_normalizer",
1162 "unicode-normalization", 1534 "icu_properties",
1163] 1535]
1164 1536
1165[[package]] 1537[[package]]
1166name = "indexmap" 1538name = "indexmap"
1167version = "2.2.6" 1539version = "2.9.0"
1168source = "registry+https://github.com/rust-lang/crates.io-index" 1540source = "registry+https://github.com/rust-lang/crates.io-index"
1169checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 1541checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
1170dependencies = [ 1542dependencies = [
1171 "equivalent", 1543 "equivalent",
1172 "hashbrown", 1544 "hashbrown",
1173] 1545]
1174 1546
1175[[package]] 1547[[package]]
1548name = "itertools"
1549version = "0.12.1"
1550source = "registry+https://github.com/rust-lang/crates.io-index"
1551checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
1552dependencies = [
1553 "either",
1554]
1555
1556[[package]]
1176name = "itoa" 1557name = "itoa"
1177version = "1.0.11" 1558version = "1.0.15"
1559source = "registry+https://github.com/rust-lang/crates.io-index"
1560checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
1561
1562[[package]]
1563name = "jobserver"
1564version = "0.1.33"
1178source = "registry+https://github.com/rust-lang/crates.io-index" 1565source = "registry+https://github.com/rust-lang/crates.io-index"
1179checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 1566checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a"
1567dependencies = [
1568 "getrandom 0.3.2",
1569 "libc",
1570]
1180 1571
1181[[package]] 1572[[package]]
1182name = "js-sys" 1573name = "js-sys"
1183version = "0.3.69" 1574version = "0.3.77"
1184source = "registry+https://github.com/rust-lang/crates.io-index" 1575source = "registry+https://github.com/rust-lang/crates.io-index"
1185checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 1576checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
1186dependencies = [ 1577dependencies = [
1578 "once_cell",
1187 "wasm-bindgen", 1579 "wasm-bindgen",
1188] 1580]
1189 1581
1190[[package]] 1582[[package]]
1191name = "lazy_static" 1583name = "lazy_static"
1192version = "1.4.0" 1584version = "1.5.0"
1585source = "registry+https://github.com/rust-lang/crates.io-index"
1586checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
1587
1588[[package]]
1589name = "lazycell"
1590version = "1.3.0"
1193source = "registry+https://github.com/rust-lang/crates.io-index" 1591source = "registry+https://github.com/rust-lang/crates.io-index"
1194checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1592checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
1195 1593
1196[[package]] 1594[[package]]
1197name = "libc" 1595name = "libc"
1198version = "0.2.153" 1596version = "0.2.171"
1597source = "registry+https://github.com/rust-lang/crates.io-index"
1598checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
1599
1600[[package]]
1601name = "libloading"
1602version = "0.8.6"
1199source = "registry+https://github.com/rust-lang/crates.io-index" 1603source = "registry+https://github.com/rust-lang/crates.io-index"
1200checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" 1604checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
1605dependencies = [
1606 "cfg-if",
1607 "windows-targets",
1608]
1609
1610[[package]]
1611name = "linux-raw-sys"
1612version = "0.4.15"
1613source = "registry+https://github.com/rust-lang/crates.io-index"
1614checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
1615
1616[[package]]
1617name = "litemap"
1618version = "0.7.5"
1619source = "registry+https://github.com/rust-lang/crates.io-index"
1620checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856"
1201 1621
1202[[package]] 1622[[package]]
1203name = "lock_api" 1623name = "lock_api"
@@ -1211,15 +1631,15 @@ dependencies = [
1211 1631
1212[[package]] 1632[[package]]
1213name = "log" 1633name = "log"
1214version = "0.4.21" 1634version = "0.4.27"
1215source = "registry+https://github.com/rust-lang/crates.io-index" 1635source = "registry+https://github.com/rust-lang/crates.io-index"
1216checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 1636checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
1217 1637
1218[[package]] 1638[[package]]
1219name = "lru" 1639name = "lru"
1220version = "0.12.3" 1640version = "0.12.5"
1221source = "registry+https://github.com/rust-lang/crates.io-index" 1641source = "registry+https://github.com/rust-lang/crates.io-index"
1222checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" 1642checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
1223dependencies = [ 1643dependencies = [
1224 "hashbrown", 1644 "hashbrown",
1225] 1645]
@@ -1235,9 +1655,9 @@ dependencies = [
1235 1655
1236[[package]] 1656[[package]]
1237name = "matchit" 1657name = "matchit"
1238version = "0.7.3" 1658version = "0.8.4"
1239source = "registry+https://github.com/rust-lang/crates.io-index" 1659source = "registry+https://github.com/rust-lang/crates.io-index"
1240checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" 1660checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
1241 1661
1242[[package]] 1662[[package]]
1243name = "md-5" 1663name = "md-5"
@@ -1251,9 +1671,9 @@ dependencies = [
1251 1671
1252[[package]] 1672[[package]]
1253name = "memchr" 1673name = "memchr"
1254version = "2.7.2" 1674version = "2.7.4"
1255source = "registry+https://github.com/rust-lang/crates.io-index" 1675source = "registry+https://github.com/rust-lang/crates.io-index"
1256checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" 1676checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
1257 1677
1258[[package]] 1678[[package]]
1259name = "mime" 1679name = "mime"
@@ -1262,23 +1682,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1262checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1682checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
1263 1683
1264[[package]] 1684[[package]]
1685name = "minimal-lexical"
1686version = "0.2.1"
1687source = "registry+https://github.com/rust-lang/crates.io-index"
1688checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
1689
1690[[package]]
1265name = "miniz_oxide" 1691name = "miniz_oxide"
1266version = "0.7.2" 1692version = "0.8.8"
1267source = "registry+https://github.com/rust-lang/crates.io-index" 1693source = "registry+https://github.com/rust-lang/crates.io-index"
1268checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" 1694checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a"
1269dependencies = [ 1695dependencies = [
1270 "adler", 1696 "adler2",
1271] 1697]
1272 1698
1273[[package]] 1699[[package]]
1274name = "mio" 1700name = "mio"
1275version = "0.8.11" 1701version = "1.0.3"
1276source = "registry+https://github.com/rust-lang/crates.io-index" 1702source = "registry+https://github.com/rust-lang/crates.io-index"
1277checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 1703checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
1278dependencies = [ 1704dependencies = [
1279 "libc", 1705 "libc",
1280 "wasi", 1706 "wasi 0.11.0+wasi-snapshot-preview1",
1281 "windows-sys 0.48.0", 1707 "windows-sys 0.52.0",
1708]
1709
1710[[package]]
1711name = "nom"
1712version = "7.1.3"
1713source = "registry+https://github.com/rust-lang/crates.io-index"
1714checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
1715dependencies = [
1716 "memchr",
1717 "minimal-lexical",
1282] 1718]
1283 1719
1284[[package]] 1720[[package]]
@@ -1308,49 +1744,39 @@ dependencies = [
1308 1744
1309[[package]] 1745[[package]]
1310name = "num-traits" 1746name = "num-traits"
1311version = "0.2.18" 1747version = "0.2.19"
1312source = "registry+https://github.com/rust-lang/crates.io-index" 1748source = "registry+https://github.com/rust-lang/crates.io-index"
1313checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" 1749checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
1314dependencies = [ 1750dependencies = [
1315 "autocfg", 1751 "autocfg",
1316] 1752]
1317 1753
1318[[package]] 1754[[package]]
1319name = "num_cpus"
1320version = "1.16.0"
1321source = "registry+https://github.com/rust-lang/crates.io-index"
1322checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
1323dependencies = [
1324 "hermit-abi",
1325 "libc",
1326]
1327
1328[[package]]
1329name = "object" 1755name = "object"
1330version = "0.32.2" 1756version = "0.36.7"
1331source = "registry+https://github.com/rust-lang/crates.io-index" 1757source = "registry+https://github.com/rust-lang/crates.io-index"
1332checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 1758checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
1333dependencies = [ 1759dependencies = [
1334 "memchr", 1760 "memchr",
1335] 1761]
1336 1762
1337[[package]] 1763[[package]]
1338name = "once_cell" 1764name = "once_cell"
1339version = "1.19.0" 1765version = "1.21.3"
1340source = "registry+https://github.com/rust-lang/crates.io-index" 1766source = "registry+https://github.com/rust-lang/crates.io-index"
1341checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1767checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
1342 1768
1343[[package]] 1769[[package]]
1344name = "openssl-probe" 1770name = "openssl-probe"
1345version = "0.1.5" 1771version = "0.1.6"
1346source = "registry+https://github.com/rust-lang/crates.io-index" 1772source = "registry+https://github.com/rust-lang/crates.io-index"
1347checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1773checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
1348 1774
1349[[package]] 1775[[package]]
1350name = "outref" 1776name = "outref"
1351version = "0.5.1" 1777version = "0.5.2"
1352source = "registry+https://github.com/rust-lang/crates.io-index" 1778source = "registry+https://github.com/rust-lang/crates.io-index"
1353checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" 1779checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
1354 1780
1355[[package]] 1781[[package]]
1356name = "overload" 1782name = "overload"
@@ -1371,9 +1797,9 @@ dependencies = [
1371 1797
1372[[package]] 1798[[package]]
1373name = "parking_lot" 1799name = "parking_lot"
1374version = "0.12.2" 1800version = "0.12.3"
1375source = "registry+https://github.com/rust-lang/crates.io-index" 1801source = "registry+https://github.com/rust-lang/crates.io-index"
1376checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" 1802checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
1377dependencies = [ 1803dependencies = [
1378 "lock_api", 1804 "lock_api",
1379 "parking_lot_core", 1805 "parking_lot_core",
@@ -1389,7 +1815,7 @@ dependencies = [
1389 "libc", 1815 "libc",
1390 "redox_syscall", 1816 "redox_syscall",
1391 "smallvec", 1817 "smallvec",
1392 "windows-targets 0.52.5", 1818 "windows-targets",
1393] 1819]
1394 1820
1395[[package]] 1821[[package]]
@@ -1399,30 +1825,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1399checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1825checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
1400 1826
1401[[package]] 1827[[package]]
1402name = "pin-project"
1403version = "1.1.5"
1404source = "registry+https://github.com/rust-lang/crates.io-index"
1405checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3"
1406dependencies = [
1407 "pin-project-internal",
1408]
1409
1410[[package]]
1411name = "pin-project-internal"
1412version = "1.1.5"
1413source = "registry+https://github.com/rust-lang/crates.io-index"
1414checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
1415dependencies = [
1416 "proc-macro2",
1417 "quote",
1418 "syn",
1419]
1420
1421[[package]]
1422name = "pin-project-lite" 1828name = "pin-project-lite"
1423version = "0.2.14" 1829version = "0.2.16"
1424source = "registry+https://github.com/rust-lang/crates.io-index" 1830source = "registry+https://github.com/rust-lang/crates.io-index"
1425checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 1831checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
1426 1832
1427[[package]] 1833[[package]]
1428name = "pin-utils" 1834name = "pin-utils"
@@ -1447,51 +1853,67 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1447checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1853checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
1448 1854
1449[[package]] 1855[[package]]
1856name = "prettyplease"
1857version = "0.2.32"
1858source = "registry+https://github.com/rust-lang/crates.io-index"
1859checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6"
1860dependencies = [
1861 "proc-macro2",
1862 "syn",
1863]
1864
1865[[package]]
1450name = "proc-macro2" 1866name = "proc-macro2"
1451version = "1.0.81" 1867version = "1.0.94"
1452source = "registry+https://github.com/rust-lang/crates.io-index" 1868source = "registry+https://github.com/rust-lang/crates.io-index"
1453checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" 1869checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84"
1454dependencies = [ 1870dependencies = [
1455 "unicode-ident", 1871 "unicode-ident",
1456] 1872]
1457 1873
1458[[package]] 1874[[package]]
1459name = "quote" 1875name = "quote"
1460version = "1.0.36" 1876version = "1.0.40"
1461source = "registry+https://github.com/rust-lang/crates.io-index" 1877source = "registry+https://github.com/rust-lang/crates.io-index"
1462checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 1878checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
1463dependencies = [ 1879dependencies = [
1464 "proc-macro2", 1880 "proc-macro2",
1465] 1881]
1466 1882
1467[[package]] 1883[[package]]
1884name = "r-efi"
1885version = "5.2.0"
1886source = "registry+https://github.com/rust-lang/crates.io-index"
1887checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
1888
1889[[package]]
1468name = "rand_core" 1890name = "rand_core"
1469version = "0.6.4" 1891version = "0.6.4"
1470source = "registry+https://github.com/rust-lang/crates.io-index" 1892source = "registry+https://github.com/rust-lang/crates.io-index"
1471checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1893checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1472dependencies = [ 1894dependencies = [
1473 "getrandom", 1895 "getrandom 0.2.15",
1474] 1896]
1475 1897
1476[[package]] 1898[[package]]
1477name = "redox_syscall" 1899name = "redox_syscall"
1478version = "0.5.1" 1900version = "0.5.11"
1479source = "registry+https://github.com/rust-lang/crates.io-index" 1901source = "registry+https://github.com/rust-lang/crates.io-index"
1480checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" 1902checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3"
1481dependencies = [ 1903dependencies = [
1482 "bitflags 2.5.0", 1904 "bitflags",
1483] 1905]
1484 1906
1485[[package]] 1907[[package]]
1486name = "regex" 1908name = "regex"
1487version = "1.10.4" 1909version = "1.11.1"
1488source = "registry+https://github.com/rust-lang/crates.io-index" 1910source = "registry+https://github.com/rust-lang/crates.io-index"
1489checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" 1911checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
1490dependencies = [ 1912dependencies = [
1491 "aho-corasick", 1913 "aho-corasick",
1492 "memchr", 1914 "memchr",
1493 "regex-automata 0.4.6", 1915 "regex-automata 0.4.9",
1494 "regex-syntax 0.8.3", 1916 "regex-syntax 0.8.5",
1495] 1917]
1496 1918
1497[[package]] 1919[[package]]
@@ -1505,20 +1927,20 @@ dependencies = [
1505 1927
1506[[package]] 1928[[package]]
1507name = "regex-automata" 1929name = "regex-automata"
1508version = "0.4.6" 1930version = "0.4.9"
1509source = "registry+https://github.com/rust-lang/crates.io-index" 1931source = "registry+https://github.com/rust-lang/crates.io-index"
1510checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" 1932checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
1511dependencies = [ 1933dependencies = [
1512 "aho-corasick", 1934 "aho-corasick",
1513 "memchr", 1935 "memchr",
1514 "regex-syntax 0.8.3", 1936 "regex-syntax 0.8.5",
1515] 1937]
1516 1938
1517[[package]] 1939[[package]]
1518name = "regex-lite" 1940name = "regex-lite"
1519version = "0.1.5" 1941version = "0.1.6"
1520source = "registry+https://github.com/rust-lang/crates.io-index" 1942source = "registry+https://github.com/rust-lang/crates.io-index"
1521checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" 1943checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a"
1522 1944
1523[[package]] 1945[[package]]
1524name = "regex-syntax" 1946name = "regex-syntax"
@@ -1528,9 +1950,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
1528 1950
1529[[package]] 1951[[package]]
1530name = "regex-syntax" 1952name = "regex-syntax"
1531version = "0.8.3" 1953version = "0.8.5"
1532source = "registry+https://github.com/rust-lang/crates.io-index" 1954source = "registry+https://github.com/rust-lang/crates.io-index"
1533checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" 1955checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1534 1956
1535[[package]] 1957[[package]]
1536name = "rfc6979" 1958name = "rfc6979"
@@ -1545,35 +1967,53 @@ dependencies = [
1545 1967
1546[[package]] 1968[[package]]
1547name = "ring" 1969name = "ring"
1548version = "0.17.8" 1970version = "0.17.14"
1549source = "registry+https://github.com/rust-lang/crates.io-index" 1971source = "registry+https://github.com/rust-lang/crates.io-index"
1550checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1972checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
1551dependencies = [ 1973dependencies = [
1552 "cc", 1974 "cc",
1553 "cfg-if", 1975 "cfg-if",
1554 "getrandom", 1976 "getrandom 0.2.15",
1555 "libc", 1977 "libc",
1556 "spin",
1557 "untrusted", 1978 "untrusted",
1558 "windows-sys 0.52.0", 1979 "windows-sys 0.52.0",
1559] 1980]
1560 1981
1561[[package]] 1982[[package]]
1562name = "rustc-demangle" 1983name = "rustc-demangle"
1563version = "0.1.23" 1984version = "0.1.24"
1985source = "registry+https://github.com/rust-lang/crates.io-index"
1986checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
1987
1988[[package]]
1989name = "rustc-hash"
1990version = "1.1.0"
1564source = "registry+https://github.com/rust-lang/crates.io-index" 1991source = "registry+https://github.com/rust-lang/crates.io-index"
1565checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 1992checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
1566 1993
1567[[package]] 1994[[package]]
1568name = "rustc_version" 1995name = "rustc_version"
1569version = "0.4.0" 1996version = "0.4.1"
1570source = "registry+https://github.com/rust-lang/crates.io-index" 1997source = "registry+https://github.com/rust-lang/crates.io-index"
1571checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1998checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
1572dependencies = [ 1999dependencies = [
1573 "semver", 2000 "semver",
1574] 2001]
1575 2002
1576[[package]] 2003[[package]]
2004name = "rustix"
2005version = "0.38.44"
2006source = "registry+https://github.com/rust-lang/crates.io-index"
2007checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
2008dependencies = [
2009 "bitflags",
2010 "errno",
2011 "libc",
2012 "linux-raw-sys",
2013 "windows-sys 0.59.0",
2014]
2015
2016[[package]]
1577name = "rustls" 2017name = "rustls"
1578version = "0.21.12" 2018version = "0.21.12"
1579source = "registry+https://github.com/rust-lang/crates.io-index" 2019source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1581,11 +2021,25 @@ checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
1581dependencies = [ 2021dependencies = [
1582 "log", 2022 "log",
1583 "ring", 2023 "ring",
1584 "rustls-webpki", 2024 "rustls-webpki 0.101.7",
1585 "sct", 2025 "sct",
1586] 2026]
1587 2027
1588[[package]] 2028[[package]]
2029name = "rustls"
2030version = "0.23.25"
2031source = "registry+https://github.com/rust-lang/crates.io-index"
2032checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c"
2033dependencies = [
2034 "aws-lc-rs",
2035 "once_cell",
2036 "rustls-pki-types",
2037 "rustls-webpki 0.103.1",
2038 "subtle",
2039 "zeroize",
2040]
2041
2042[[package]]
1589name = "rustls-native-certs" 2043name = "rustls-native-certs"
1590version = "0.6.3" 2044version = "0.6.3"
1591source = "registry+https://github.com/rust-lang/crates.io-index" 2045source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1594,7 +2048,19 @@ dependencies = [
1594 "openssl-probe", 2048 "openssl-probe",
1595 "rustls-pemfile", 2049 "rustls-pemfile",
1596 "schannel", 2050 "schannel",
1597 "security-framework", 2051 "security-framework 2.11.1",
2052]
2053
2054[[package]]
2055name = "rustls-native-certs"
2056version = "0.8.1"
2057source = "registry+https://github.com/rust-lang/crates.io-index"
2058checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3"
2059dependencies = [
2060 "openssl-probe",
2061 "rustls-pki-types",
2062 "schannel",
2063 "security-framework 3.2.0",
1598] 2064]
1599 2065
1600[[package]] 2066[[package]]
@@ -1603,10 +2069,16 @@ version = "1.0.4"
1603source = "registry+https://github.com/rust-lang/crates.io-index" 2069source = "registry+https://github.com/rust-lang/crates.io-index"
1604checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 2070checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
1605dependencies = [ 2071dependencies = [
1606 "base64", 2072 "base64 0.21.7",
1607] 2073]
1608 2074
1609[[package]] 2075[[package]]
2076name = "rustls-pki-types"
2077version = "1.11.0"
2078source = "registry+https://github.com/rust-lang/crates.io-index"
2079checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c"
2080
2081[[package]]
1610name = "rustls-webpki" 2082name = "rustls-webpki"
1611version = "0.101.7" 2083version = "0.101.7"
1612source = "registry+https://github.com/rust-lang/crates.io-index" 2084source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1617,24 +2089,36 @@ dependencies = [
1617] 2089]
1618 2090
1619[[package]] 2091[[package]]
2092name = "rustls-webpki"
2093version = "0.103.1"
2094source = "registry+https://github.com/rust-lang/crates.io-index"
2095checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03"
2096dependencies = [
2097 "aws-lc-rs",
2098 "ring",
2099 "rustls-pki-types",
2100 "untrusted",
2101]
2102
2103[[package]]
1620name = "rustversion" 2104name = "rustversion"
1621version = "1.0.15" 2105version = "1.0.20"
1622source = "registry+https://github.com/rust-lang/crates.io-index" 2106source = "registry+https://github.com/rust-lang/crates.io-index"
1623checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" 2107checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
1624 2108
1625[[package]] 2109[[package]]
1626name = "ryu" 2110name = "ryu"
1627version = "1.0.17" 2111version = "1.0.20"
1628source = "registry+https://github.com/rust-lang/crates.io-index" 2112source = "registry+https://github.com/rust-lang/crates.io-index"
1629checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" 2113checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
1630 2114
1631[[package]] 2115[[package]]
1632name = "schannel" 2116name = "schannel"
1633version = "0.1.23" 2117version = "0.1.27"
1634source = "registry+https://github.com/rust-lang/crates.io-index" 2118source = "registry+https://github.com/rust-lang/crates.io-index"
1635checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 2119checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
1636dependencies = [ 2120dependencies = [
1637 "windows-sys 0.52.0", 2121 "windows-sys 0.59.0",
1638] 2122]
1639 2123
1640[[package]] 2124[[package]]
@@ -1669,12 +2153,25 @@ dependencies = [
1669 2153
1670[[package]] 2154[[package]]
1671name = "security-framework" 2155name = "security-framework"
1672version = "2.10.0" 2156version = "2.11.1"
2157source = "registry+https://github.com/rust-lang/crates.io-index"
2158checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
2159dependencies = [
2160 "bitflags",
2161 "core-foundation 0.9.4",
2162 "core-foundation-sys",
2163 "libc",
2164 "security-framework-sys",
2165]
2166
2167[[package]]
2168name = "security-framework"
2169version = "3.2.0"
1673source = "registry+https://github.com/rust-lang/crates.io-index" 2170source = "registry+https://github.com/rust-lang/crates.io-index"
1674checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" 2171checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316"
1675dependencies = [ 2172dependencies = [
1676 "bitflags 1.3.2", 2173 "bitflags",
1677 "core-foundation", 2174 "core-foundation 0.10.0",
1678 "core-foundation-sys", 2175 "core-foundation-sys",
1679 "libc", 2176 "libc",
1680 "security-framework-sys", 2177 "security-framework-sys",
@@ -1682,9 +2179,9 @@ dependencies = [
1682 2179
1683[[package]] 2180[[package]]
1684name = "security-framework-sys" 2181name = "security-framework-sys"
1685version = "2.10.0" 2182version = "2.14.0"
1686source = "registry+https://github.com/rust-lang/crates.io-index" 2183source = "registry+https://github.com/rust-lang/crates.io-index"
1687checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" 2184checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
1688dependencies = [ 2185dependencies = [
1689 "core-foundation-sys", 2186 "core-foundation-sys",
1690 "libc", 2187 "libc",
@@ -1692,24 +2189,24 @@ dependencies = [
1692 2189
1693[[package]] 2190[[package]]
1694name = "semver" 2191name = "semver"
1695version = "1.0.22" 2192version = "1.0.26"
1696source = "registry+https://github.com/rust-lang/crates.io-index" 2193source = "registry+https://github.com/rust-lang/crates.io-index"
1697checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" 2194checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
1698 2195
1699[[package]] 2196[[package]]
1700name = "serde" 2197name = "serde"
1701version = "1.0.199" 2198version = "1.0.219"
1702source = "registry+https://github.com/rust-lang/crates.io-index" 2199source = "registry+https://github.com/rust-lang/crates.io-index"
1703checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a" 2200checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
1704dependencies = [ 2201dependencies = [
1705 "serde_derive", 2202 "serde_derive",
1706] 2203]
1707 2204
1708[[package]] 2205[[package]]
1709name = "serde_derive" 2206name = "serde_derive"
1710version = "1.0.199" 2207version = "1.0.219"
1711source = "registry+https://github.com/rust-lang/crates.io-index" 2208source = "registry+https://github.com/rust-lang/crates.io-index"
1712checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc" 2209checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
1713dependencies = [ 2210dependencies = [
1714 "proc-macro2", 2211 "proc-macro2",
1715 "quote", 2212 "quote",
@@ -1718,20 +2215,21 @@ dependencies = [
1718 2215
1719[[package]] 2216[[package]]
1720name = "serde_json" 2217name = "serde_json"
1721version = "1.0.116" 2218version = "1.0.140"
1722source = "registry+https://github.com/rust-lang/crates.io-index" 2219source = "registry+https://github.com/rust-lang/crates.io-index"
1723checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" 2220checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
1724dependencies = [ 2221dependencies = [
1725 "itoa", 2222 "itoa",
2223 "memchr",
1726 "ryu", 2224 "ryu",
1727 "serde", 2225 "serde",
1728] 2226]
1729 2227
1730[[package]] 2228[[package]]
1731name = "serde_path_to_error" 2229name = "serde_path_to_error"
1732version = "0.1.16" 2230version = "0.1.17"
1733source = "registry+https://github.com/rust-lang/crates.io-index" 2231source = "registry+https://github.com/rust-lang/crates.io-index"
1734checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" 2232checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a"
1735dependencies = [ 2233dependencies = [
1736 "itoa", 2234 "itoa",
1737 "serde", 2235 "serde",
@@ -1781,6 +2279,12 @@ dependencies = [
1781] 2279]
1782 2280
1783[[package]] 2281[[package]]
2282name = "shlex"
2283version = "1.3.0"
2284source = "registry+https://github.com/rust-lang/crates.io-index"
2285checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
2286
2287[[package]]
1784name = "signal-hook-registry" 2288name = "signal-hook-registry"
1785version = "1.4.2" 2289version = "1.4.2"
1786source = "registry+https://github.com/rust-lang/crates.io-index" 2290source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1810,27 +2314,21 @@ dependencies = [
1810 2314
1811[[package]] 2315[[package]]
1812name = "smallvec" 2316name = "smallvec"
1813version = "1.13.2" 2317version = "1.15.0"
1814source = "registry+https://github.com/rust-lang/crates.io-index" 2318source = "registry+https://github.com/rust-lang/crates.io-index"
1815checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 2319checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
1816 2320
1817[[package]] 2321[[package]]
1818name = "socket2" 2322name = "socket2"
1819version = "0.5.7" 2323version = "0.5.9"
1820source = "registry+https://github.com/rust-lang/crates.io-index" 2324source = "registry+https://github.com/rust-lang/crates.io-index"
1821checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 2325checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef"
1822dependencies = [ 2326dependencies = [
1823 "libc", 2327 "libc",
1824 "windows-sys 0.52.0", 2328 "windows-sys 0.52.0",
1825] 2329]
1826 2330
1827[[package]] 2331[[package]]
1828name = "spin"
1829version = "0.9.8"
1830source = "registry+https://github.com/rust-lang/crates.io-index"
1831checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
1832
1833[[package]]
1834name = "spki" 2332name = "spki"
1835version = "0.6.0" 2333version = "0.6.0"
1836source = "registry+https://github.com/rust-lang/crates.io-index" 2334source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1841,16 +2339,22 @@ dependencies = [
1841] 2339]
1842 2340
1843[[package]] 2341[[package]]
2342name = "stable_deref_trait"
2343version = "1.2.0"
2344source = "registry+https://github.com/rust-lang/crates.io-index"
2345checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
2346
2347[[package]]
1844name = "subtle" 2348name = "subtle"
1845version = "2.5.0" 2349version = "2.6.1"
1846source = "registry+https://github.com/rust-lang/crates.io-index" 2350source = "registry+https://github.com/rust-lang/crates.io-index"
1847checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 2351checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
1848 2352
1849[[package]] 2353[[package]]
1850name = "syn" 2354name = "syn"
1851version = "2.0.60" 2355version = "2.0.100"
1852source = "registry+https://github.com/rust-lang/crates.io-index" 2356source = "registry+https://github.com/rust-lang/crates.io-index"
1853checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" 2357checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
1854dependencies = [ 2358dependencies = [
1855 "proc-macro2", 2359 "proc-macro2",
1856 "quote", 2360 "quote",
@@ -1859,15 +2363,20 @@ dependencies = [
1859 2363
1860[[package]] 2364[[package]]
1861name = "sync_wrapper" 2365name = "sync_wrapper"
1862version = "0.1.2" 2366version = "1.0.2"
1863source = "registry+https://github.com/rust-lang/crates.io-index" 2367source = "registry+https://github.com/rust-lang/crates.io-index"
1864checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 2368checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
1865 2369
1866[[package]] 2370[[package]]
1867name = "sync_wrapper" 2371name = "synstructure"
1868version = "1.0.1" 2372version = "0.13.1"
1869source = "registry+https://github.com/rust-lang/crates.io-index" 2373source = "registry+https://github.com/rust-lang/crates.io-index"
1870checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" 2374checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
2375dependencies = [
2376 "proc-macro2",
2377 "quote",
2378 "syn",
2379]
1871 2380
1872[[package]] 2381[[package]]
1873name = "thread_local" 2382name = "thread_local"
@@ -1881,9 +2390,9 @@ dependencies = [
1881 2390
1882[[package]] 2391[[package]]
1883name = "time" 2392name = "time"
1884version = "0.3.36" 2393version = "0.3.41"
1885source = "registry+https://github.com/rust-lang/crates.io-index" 2394source = "registry+https://github.com/rust-lang/crates.io-index"
1886checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" 2395checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40"
1887dependencies = [ 2396dependencies = [
1888 "deranged", 2397 "deranged",
1889 "num-conv", 2398 "num-conv",
@@ -1895,59 +2404,53 @@ dependencies = [
1895 2404
1896[[package]] 2405[[package]]
1897name = "time-core" 2406name = "time-core"
1898version = "0.1.2" 2407version = "0.1.4"
1899source = "registry+https://github.com/rust-lang/crates.io-index" 2408source = "registry+https://github.com/rust-lang/crates.io-index"
1900checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 2409checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c"
1901 2410
1902[[package]] 2411[[package]]
1903name = "time-macros" 2412name = "time-macros"
1904version = "0.2.18" 2413version = "0.2.22"
1905source = "registry+https://github.com/rust-lang/crates.io-index" 2414source = "registry+https://github.com/rust-lang/crates.io-index"
1906checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" 2415checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49"
1907dependencies = [ 2416dependencies = [
1908 "num-conv", 2417 "num-conv",
1909 "time-core", 2418 "time-core",
1910] 2419]
1911 2420
1912[[package]] 2421[[package]]
1913name = "tinyvec" 2422name = "tinystr"
1914version = "1.6.0" 2423version = "0.7.6"
1915source = "registry+https://github.com/rust-lang/crates.io-index" 2424source = "registry+https://github.com/rust-lang/crates.io-index"
1916checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2425checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
1917dependencies = [ 2426dependencies = [
1918 "tinyvec_macros", 2427 "displaydoc",
2428 "zerovec",
1919] 2429]
1920 2430
1921[[package]] 2431[[package]]
1922name = "tinyvec_macros"
1923version = "0.1.1"
1924source = "registry+https://github.com/rust-lang/crates.io-index"
1925checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
1926
1927[[package]]
1928name = "tokio" 2432name = "tokio"
1929version = "1.37.0" 2433version = "1.44.2"
1930source = "registry+https://github.com/rust-lang/crates.io-index" 2434source = "registry+https://github.com/rust-lang/crates.io-index"
1931checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" 2435checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48"
1932dependencies = [ 2436dependencies = [
1933 "backtrace", 2437 "backtrace",
1934 "bytes", 2438 "bytes",
1935 "libc", 2439 "libc",
1936 "mio", 2440 "mio",
1937 "num_cpus",
1938 "parking_lot", 2441 "parking_lot",
1939 "pin-project-lite", 2442 "pin-project-lite",
1940 "signal-hook-registry", 2443 "signal-hook-registry",
1941 "socket2", 2444 "socket2",
1942 "tokio-macros", 2445 "tokio-macros",
1943 "windows-sys 0.48.0", 2446 "windows-sys 0.52.0",
1944] 2447]
1945 2448
1946[[package]] 2449[[package]]
1947name = "tokio-macros" 2450name = "tokio-macros"
1948version = "2.2.0" 2451version = "2.5.0"
1949source = "registry+https://github.com/rust-lang/crates.io-index" 2452source = "registry+https://github.com/rust-lang/crates.io-index"
1950checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 2453checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
1951dependencies = [ 2454dependencies = [
1952 "proc-macro2", 2455 "proc-macro2",
1953 "quote", 2456 "quote",
@@ -1960,34 +2463,43 @@ version = "0.24.1"
1960source = "registry+https://github.com/rust-lang/crates.io-index" 2463source = "registry+https://github.com/rust-lang/crates.io-index"
1961checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 2464checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
1962dependencies = [ 2465dependencies = [
1963 "rustls", 2466 "rustls 0.21.12",
2467 "tokio",
2468]
2469
2470[[package]]
2471name = "tokio-rustls"
2472version = "0.26.2"
2473source = "registry+https://github.com/rust-lang/crates.io-index"
2474checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b"
2475dependencies = [
2476 "rustls 0.23.25",
1964 "tokio", 2477 "tokio",
1965] 2478]
1966 2479
1967[[package]] 2480[[package]]
1968name = "tokio-util" 2481name = "tokio-util"
1969version = "0.7.10" 2482version = "0.7.14"
1970source = "registry+https://github.com/rust-lang/crates.io-index" 2483source = "registry+https://github.com/rust-lang/crates.io-index"
1971checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" 2484checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034"
1972dependencies = [ 2485dependencies = [
1973 "bytes", 2486 "bytes",
1974 "futures-core", 2487 "futures-core",
1975 "futures-sink", 2488 "futures-sink",
1976 "pin-project-lite", 2489 "pin-project-lite",
1977 "tokio", 2490 "tokio",
1978 "tracing",
1979] 2491]
1980 2492
1981[[package]] 2493[[package]]
1982name = "tower" 2494name = "tower"
1983version = "0.4.13" 2495version = "0.5.2"
1984source = "registry+https://github.com/rust-lang/crates.io-index" 2496source = "registry+https://github.com/rust-lang/crates.io-index"
1985checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 2497checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
1986dependencies = [ 2498dependencies = [
1987 "futures-core", 2499 "futures-core",
1988 "futures-util", 2500 "futures-util",
1989 "pin-project",
1990 "pin-project-lite", 2501 "pin-project-lite",
2502 "sync_wrapper",
1991 "tokio", 2503 "tokio",
1992 "tower-layer", 2504 "tower-layer",
1993 "tower-service", 2505 "tower-service",
@@ -1996,21 +2508,21 @@ dependencies = [
1996 2508
1997[[package]] 2509[[package]]
1998name = "tower-layer" 2510name = "tower-layer"
1999version = "0.3.2" 2511version = "0.3.3"
2000source = "registry+https://github.com/rust-lang/crates.io-index" 2512source = "registry+https://github.com/rust-lang/crates.io-index"
2001checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 2513checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
2002 2514
2003[[package]] 2515[[package]]
2004name = "tower-service" 2516name = "tower-service"
2005version = "0.3.2" 2517version = "0.3.3"
2006source = "registry+https://github.com/rust-lang/crates.io-index" 2518source = "registry+https://github.com/rust-lang/crates.io-index"
2007checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2519checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
2008 2520
2009[[package]] 2521[[package]]
2010name = "tracing" 2522name = "tracing"
2011version = "0.1.40" 2523version = "0.1.41"
2012source = "registry+https://github.com/rust-lang/crates.io-index" 2524source = "registry+https://github.com/rust-lang/crates.io-index"
2013checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 2525checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
2014dependencies = [ 2526dependencies = [
2015 "log", 2527 "log",
2016 "pin-project-lite", 2528 "pin-project-lite",
@@ -2020,9 +2532,9 @@ dependencies = [
2020 2532
2021[[package]] 2533[[package]]
2022name = "tracing-attributes" 2534name = "tracing-attributes"
2023version = "0.1.27" 2535version = "0.1.28"
2024source = "registry+https://github.com/rust-lang/crates.io-index" 2536source = "registry+https://github.com/rust-lang/crates.io-index"
2025checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 2537checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
2026dependencies = [ 2538dependencies = [
2027 "proc-macro2", 2539 "proc-macro2",
2028 "quote", 2540 "quote",
@@ -2031,9 +2543,9 @@ dependencies = [
2031 2543
2032[[package]] 2544[[package]]
2033name = "tracing-core" 2545name = "tracing-core"
2034version = "0.1.32" 2546version = "0.1.33"
2035source = "registry+https://github.com/rust-lang/crates.io-index" 2547source = "registry+https://github.com/rust-lang/crates.io-index"
2036checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 2548checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
2037dependencies = [ 2549dependencies = [
2038 "once_cell", 2550 "once_cell",
2039 "valuable", 2551 "valuable",
@@ -2052,9 +2564,9 @@ dependencies = [
2052 2564
2053[[package]] 2565[[package]]
2054name = "tracing-subscriber" 2566name = "tracing-subscriber"
2055version = "0.3.18" 2567version = "0.3.19"
2056source = "registry+https://github.com/rust-lang/crates.io-index" 2568source = "registry+https://github.com/rust-lang/crates.io-index"
2057checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 2569checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
2058dependencies = [ 2570dependencies = [
2059 "matchers", 2571 "matchers",
2060 "nu-ansi-term", 2572 "nu-ansi-term",
@@ -2076,30 +2588,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
2076 2588
2077[[package]] 2589[[package]]
2078name = "typenum" 2590name = "typenum"
2079version = "1.17.0" 2591version = "1.18.0"
2080source = "registry+https://github.com/rust-lang/crates.io-index" 2592source = "registry+https://github.com/rust-lang/crates.io-index"
2081checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2593checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
2082
2083[[package]]
2084name = "unicode-bidi"
2085version = "0.3.15"
2086source = "registry+https://github.com/rust-lang/crates.io-index"
2087checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
2088 2594
2089[[package]] 2595[[package]]
2090name = "unicode-ident" 2596name = "unicode-ident"
2091version = "1.0.12" 2597version = "1.0.18"
2092source = "registry+https://github.com/rust-lang/crates.io-index"
2093checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
2094
2095[[package]]
2096name = "unicode-normalization"
2097version = "0.1.23"
2098source = "registry+https://github.com/rust-lang/crates.io-index" 2598source = "registry+https://github.com/rust-lang/crates.io-index"
2099checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 2599checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
2100dependencies = [
2101 "tinyvec",
2102]
2103 2600
2104[[package]] 2601[[package]]
2105name = "untrusted" 2602name = "untrusted"
@@ -2109,9 +2606,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
2109 2606
2110[[package]] 2607[[package]]
2111name = "url" 2608name = "url"
2112version = "2.5.0" 2609version = "2.5.4"
2113source = "registry+https://github.com/rust-lang/crates.io-index" 2610source = "registry+https://github.com/rust-lang/crates.io-index"
2114checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 2611checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
2115dependencies = [ 2612dependencies = [
2116 "form_urlencoded", 2613 "form_urlencoded",
2117 "idna", 2614 "idna",
@@ -2125,22 +2622,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2125checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 2622checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
2126 2623
2127[[package]] 2624[[package]]
2625name = "utf16_iter"
2626version = "1.0.5"
2627source = "registry+https://github.com/rust-lang/crates.io-index"
2628checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
2629
2630[[package]]
2631name = "utf8_iter"
2632version = "1.0.4"
2633source = "registry+https://github.com/rust-lang/crates.io-index"
2634checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
2635
2636[[package]]
2128name = "uuid" 2637name = "uuid"
2129version = "1.8.0" 2638version = "1.16.0"
2130source = "registry+https://github.com/rust-lang/crates.io-index" 2639source = "registry+https://github.com/rust-lang/crates.io-index"
2131checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" 2640checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
2132 2641
2133[[package]] 2642[[package]]
2134name = "valuable" 2643name = "valuable"
2135version = "0.1.0" 2644version = "0.1.1"
2136source = "registry+https://github.com/rust-lang/crates.io-index" 2645source = "registry+https://github.com/rust-lang/crates.io-index"
2137checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2646checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
2138 2647
2139[[package]] 2648[[package]]
2140name = "version_check" 2649name = "version_check"
2141version = "0.9.4" 2650version = "0.9.5"
2142source = "registry+https://github.com/rust-lang/crates.io-index" 2651source = "registry+https://github.com/rust-lang/crates.io-index"
2143checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2652checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
2144 2653
2145[[package]] 2654[[package]]
2146name = "vsimd" 2655name = "vsimd"
@@ -2164,24 +2673,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2164checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2673checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
2165 2674
2166[[package]] 2675[[package]]
2676name = "wasi"
2677version = "0.14.2+wasi-0.2.4"
2678source = "registry+https://github.com/rust-lang/crates.io-index"
2679checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
2680dependencies = [
2681 "wit-bindgen-rt",
2682]
2683
2684[[package]]
2167name = "wasm-bindgen" 2685name = "wasm-bindgen"
2168version = "0.2.92" 2686version = "0.2.100"
2169source = "registry+https://github.com/rust-lang/crates.io-index" 2687source = "registry+https://github.com/rust-lang/crates.io-index"
2170checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 2688checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
2171dependencies = [ 2689dependencies = [
2172 "cfg-if", 2690 "cfg-if",
2691 "once_cell",
2692 "rustversion",
2173 "wasm-bindgen-macro", 2693 "wasm-bindgen-macro",
2174] 2694]
2175 2695
2176[[package]] 2696[[package]]
2177name = "wasm-bindgen-backend" 2697name = "wasm-bindgen-backend"
2178version = "0.2.92" 2698version = "0.2.100"
2179source = "registry+https://github.com/rust-lang/crates.io-index" 2699source = "registry+https://github.com/rust-lang/crates.io-index"
2180checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 2700checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
2181dependencies = [ 2701dependencies = [
2182 "bumpalo", 2702 "bumpalo",
2183 "log", 2703 "log",
2184 "once_cell",
2185 "proc-macro2", 2704 "proc-macro2",
2186 "quote", 2705 "quote",
2187 "syn", 2706 "syn",
@@ -2190,9 +2709,9 @@ dependencies = [
2190 2709
2191[[package]] 2710[[package]]
2192name = "wasm-bindgen-macro" 2711name = "wasm-bindgen-macro"
2193version = "0.2.92" 2712version = "0.2.100"
2194source = "registry+https://github.com/rust-lang/crates.io-index" 2713source = "registry+https://github.com/rust-lang/crates.io-index"
2195checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 2714checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
2196dependencies = [ 2715dependencies = [
2197 "quote", 2716 "quote",
2198 "wasm-bindgen-macro-support", 2717 "wasm-bindgen-macro-support",
@@ -2200,9 +2719,9 @@ dependencies = [
2200 2719
2201[[package]] 2720[[package]]
2202name = "wasm-bindgen-macro-support" 2721name = "wasm-bindgen-macro-support"
2203version = "0.2.92" 2722version = "0.2.100"
2204source = "registry+https://github.com/rust-lang/crates.io-index" 2723source = "registry+https://github.com/rust-lang/crates.io-index"
2205checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 2724checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
2206dependencies = [ 2725dependencies = [
2207 "proc-macro2", 2726 "proc-macro2",
2208 "quote", 2727 "quote",
@@ -2213,9 +2732,24 @@ dependencies = [
2213 2732
2214[[package]] 2733[[package]]
2215name = "wasm-bindgen-shared" 2734name = "wasm-bindgen-shared"
2216version = "0.2.92" 2735version = "0.2.100"
2217source = "registry+https://github.com/rust-lang/crates.io-index" 2736source = "registry+https://github.com/rust-lang/crates.io-index"
2218checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 2737checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
2738dependencies = [
2739 "unicode-ident",
2740]
2741
2742[[package]]
2743name = "which"
2744version = "4.4.2"
2745source = "registry+https://github.com/rust-lang/crates.io-index"
2746checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
2747dependencies = [
2748 "either",
2749 "home",
2750 "once_cell",
2751 "rustix",
2752]
2219 2753
2220[[package]] 2754[[package]]
2221name = "winapi" 2755name = "winapi"
@@ -2241,151 +2775,165 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
2241 2775
2242[[package]] 2776[[package]]
2243name = "windows-core" 2777name = "windows-core"
2244version = "0.52.0" 2778version = "0.61.0"
2245source = "registry+https://github.com/rust-lang/crates.io-index" 2779source = "registry+https://github.com/rust-lang/crates.io-index"
2246checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2780checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980"
2247dependencies = [ 2781dependencies = [
2248 "windows-targets 0.52.5", 2782 "windows-implement",
2783 "windows-interface",
2784 "windows-link",
2785 "windows-result",
2786 "windows-strings",
2249] 2787]
2250 2788
2251[[package]] 2789[[package]]
2252name = "windows-sys" 2790name = "windows-implement"
2253version = "0.48.0" 2791version = "0.60.0"
2254source = "registry+https://github.com/rust-lang/crates.io-index" 2792source = "registry+https://github.com/rust-lang/crates.io-index"
2255checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2793checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
2256dependencies = [ 2794dependencies = [
2257 "windows-targets 0.48.5", 2795 "proc-macro2",
2796 "quote",
2797 "syn",
2258] 2798]
2259 2799
2260[[package]] 2800[[package]]
2261name = "windows-sys" 2801name = "windows-interface"
2262version = "0.52.0" 2802version = "0.59.1"
2263source = "registry+https://github.com/rust-lang/crates.io-index" 2803source = "registry+https://github.com/rust-lang/crates.io-index"
2264checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2804checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
2265dependencies = [ 2805dependencies = [
2266 "windows-targets 0.52.5", 2806 "proc-macro2",
2807 "quote",
2808 "syn",
2267] 2809]
2268 2810
2269[[package]] 2811[[package]]
2270name = "windows-targets" 2812name = "windows-link"
2271version = "0.48.5" 2813version = "0.1.1"
2814source = "registry+https://github.com/rust-lang/crates.io-index"
2815checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
2816
2817[[package]]
2818name = "windows-result"
2819version = "0.3.2"
2272source = "registry+https://github.com/rust-lang/crates.io-index" 2820source = "registry+https://github.com/rust-lang/crates.io-index"
2273checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2821checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252"
2274dependencies = [ 2822dependencies = [
2275 "windows_aarch64_gnullvm 0.48.5", 2823 "windows-link",
2276 "windows_aarch64_msvc 0.48.5",
2277 "windows_i686_gnu 0.48.5",
2278 "windows_i686_msvc 0.48.5",
2279 "windows_x86_64_gnu 0.48.5",
2280 "windows_x86_64_gnullvm 0.48.5",
2281 "windows_x86_64_msvc 0.48.5",
2282] 2824]
2283 2825
2284[[package]] 2826[[package]]
2285name = "windows-targets" 2827name = "windows-strings"
2286version = "0.52.5" 2828version = "0.4.0"
2287source = "registry+https://github.com/rust-lang/crates.io-index" 2829source = "registry+https://github.com/rust-lang/crates.io-index"
2288checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" 2830checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97"
2289dependencies = [ 2831dependencies = [
2290 "windows_aarch64_gnullvm 0.52.5", 2832 "windows-link",
2291 "windows_aarch64_msvc 0.52.5",
2292 "windows_i686_gnu 0.52.5",
2293 "windows_i686_gnullvm",
2294 "windows_i686_msvc 0.52.5",
2295 "windows_x86_64_gnu 0.52.5",
2296 "windows_x86_64_gnullvm 0.52.5",
2297 "windows_x86_64_msvc 0.52.5",
2298] 2833]
2299 2834
2300[[package]] 2835[[package]]
2301name = "windows_aarch64_gnullvm" 2836name = "windows-sys"
2302version = "0.48.5" 2837version = "0.52.0"
2303source = "registry+https://github.com/rust-lang/crates.io-index" 2838source = "registry+https://github.com/rust-lang/crates.io-index"
2304checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2839checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
2840dependencies = [
2841 "windows-targets",
2842]
2305 2843
2306[[package]] 2844[[package]]
2307name = "windows_aarch64_gnullvm" 2845name = "windows-sys"
2308version = "0.52.5" 2846version = "0.59.0"
2309source = "registry+https://github.com/rust-lang/crates.io-index" 2847source = "registry+https://github.com/rust-lang/crates.io-index"
2310checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" 2848checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
2849dependencies = [
2850 "windows-targets",
2851]
2311 2852
2312[[package]] 2853[[package]]
2313name = "windows_aarch64_msvc" 2854name = "windows-targets"
2314version = "0.48.5" 2855version = "0.52.6"
2315source = "registry+https://github.com/rust-lang/crates.io-index" 2856source = "registry+https://github.com/rust-lang/crates.io-index"
2316checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2857checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
2858dependencies = [
2859 "windows_aarch64_gnullvm",
2860 "windows_aarch64_msvc",
2861 "windows_i686_gnu",
2862 "windows_i686_gnullvm",
2863 "windows_i686_msvc",
2864 "windows_x86_64_gnu",
2865 "windows_x86_64_gnullvm",
2866 "windows_x86_64_msvc",
2867]
2317 2868
2318[[package]] 2869[[package]]
2319name = "windows_aarch64_msvc" 2870name = "windows_aarch64_gnullvm"
2320version = "0.52.5" 2871version = "0.52.6"
2321source = "registry+https://github.com/rust-lang/crates.io-index" 2872source = "registry+https://github.com/rust-lang/crates.io-index"
2322checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" 2873checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
2323 2874
2324[[package]] 2875[[package]]
2325name = "windows_i686_gnu" 2876name = "windows_aarch64_msvc"
2326version = "0.48.5" 2877version = "0.52.6"
2327source = "registry+https://github.com/rust-lang/crates.io-index" 2878source = "registry+https://github.com/rust-lang/crates.io-index"
2328checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2879checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
2329 2880
2330[[package]] 2881[[package]]
2331name = "windows_i686_gnu" 2882name = "windows_i686_gnu"
2332version = "0.52.5" 2883version = "0.52.6"
2333source = "registry+https://github.com/rust-lang/crates.io-index" 2884source = "registry+https://github.com/rust-lang/crates.io-index"
2334checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" 2885checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
2335 2886
2336[[package]] 2887[[package]]
2337name = "windows_i686_gnullvm" 2888name = "windows_i686_gnullvm"
2338version = "0.52.5" 2889version = "0.52.6"
2339source = "registry+https://github.com/rust-lang/crates.io-index"
2340checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
2341
2342[[package]]
2343name = "windows_i686_msvc"
2344version = "0.48.5"
2345source = "registry+https://github.com/rust-lang/crates.io-index" 2890source = "registry+https://github.com/rust-lang/crates.io-index"
2346checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2891checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
2347 2892
2348[[package]] 2893[[package]]
2349name = "windows_i686_msvc" 2894name = "windows_i686_msvc"
2350version = "0.52.5" 2895version = "0.52.6"
2351source = "registry+https://github.com/rust-lang/crates.io-index" 2896source = "registry+https://github.com/rust-lang/crates.io-index"
2352checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" 2897checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
2353 2898
2354[[package]] 2899[[package]]
2355name = "windows_x86_64_gnu" 2900name = "windows_x86_64_gnu"
2356version = "0.48.5" 2901version = "0.52.6"
2357source = "registry+https://github.com/rust-lang/crates.io-index" 2902source = "registry+https://github.com/rust-lang/crates.io-index"
2358checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2903checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
2359 2904
2360[[package]] 2905[[package]]
2361name = "windows_x86_64_gnu" 2906name = "windows_x86_64_gnullvm"
2362version = "0.52.5" 2907version = "0.52.6"
2363source = "registry+https://github.com/rust-lang/crates.io-index" 2908source = "registry+https://github.com/rust-lang/crates.io-index"
2364checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" 2909checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
2365 2910
2366[[package]] 2911[[package]]
2367name = "windows_x86_64_gnullvm" 2912name = "windows_x86_64_msvc"
2368version = "0.48.5" 2913version = "0.52.6"
2369source = "registry+https://github.com/rust-lang/crates.io-index" 2914source = "registry+https://github.com/rust-lang/crates.io-index"
2370checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2915checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2371 2916
2372[[package]] 2917[[package]]
2373name = "windows_x86_64_gnullvm" 2918name = "wit-bindgen-rt"
2374version = "0.52.5" 2919version = "0.39.0"
2375source = "registry+https://github.com/rust-lang/crates.io-index" 2920source = "registry+https://github.com/rust-lang/crates.io-index"
2376checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" 2921checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
2922dependencies = [
2923 "bitflags",
2924]
2377 2925
2378[[package]] 2926[[package]]
2379name = "windows_x86_64_msvc" 2927name = "write16"
2380version = "0.48.5" 2928version = "1.0.0"
2381source = "registry+https://github.com/rust-lang/crates.io-index" 2929source = "registry+https://github.com/rust-lang/crates.io-index"
2382checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2930checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
2383 2931
2384[[package]] 2932[[package]]
2385name = "windows_x86_64_msvc" 2933name = "writeable"
2386version = "0.52.5" 2934version = "0.5.5"
2387source = "registry+https://github.com/rust-lang/crates.io-index" 2935source = "registry+https://github.com/rust-lang/crates.io-index"
2388checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" 2936checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
2389 2937
2390[[package]] 2938[[package]]
2391name = "xmlparser" 2939name = "xmlparser"
@@ -2394,27 +2942,74 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2394checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" 2942checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4"
2395 2943
2396[[package]] 2944[[package]]
2397name = "zerocopy" 2945name = "yoke"
2398version = "0.7.32" 2946version = "0.7.5"
2399source = "registry+https://github.com/rust-lang/crates.io-index" 2947source = "registry+https://github.com/rust-lang/crates.io-index"
2400checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" 2948checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
2401dependencies = [ 2949dependencies = [
2402 "zerocopy-derive", 2950 "serde",
2951 "stable_deref_trait",
2952 "yoke-derive",
2953 "zerofrom",
2403] 2954]
2404 2955
2405[[package]] 2956[[package]]
2406name = "zerocopy-derive" 2957name = "yoke-derive"
2407version = "0.7.32" 2958version = "0.7.5"
2408source = "registry+https://github.com/rust-lang/crates.io-index" 2959source = "registry+https://github.com/rust-lang/crates.io-index"
2409checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" 2960checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
2410dependencies = [ 2961dependencies = [
2411 "proc-macro2", 2962 "proc-macro2",
2412 "quote", 2963 "quote",
2413 "syn", 2964 "syn",
2965 "synstructure",
2966]
2967
2968[[package]]
2969name = "zerofrom"
2970version = "0.1.6"
2971source = "registry+https://github.com/rust-lang/crates.io-index"
2972checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
2973dependencies = [
2974 "zerofrom-derive",
2975]
2976
2977[[package]]
2978name = "zerofrom-derive"
2979version = "0.1.6"
2980source = "registry+https://github.com/rust-lang/crates.io-index"
2981checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
2982dependencies = [
2983 "proc-macro2",
2984 "quote",
2985 "syn",
2986 "synstructure",
2414] 2987]
2415 2988
2416[[package]] 2989[[package]]
2417name = "zeroize" 2990name = "zeroize"
2418version = "1.7.0" 2991version = "1.8.1"
2992source = "registry+https://github.com/rust-lang/crates.io-index"
2993checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
2994
2995[[package]]
2996name = "zerovec"
2997version = "0.10.4"
2998source = "registry+https://github.com/rust-lang/crates.io-index"
2999checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
3000dependencies = [
3001 "yoke",
3002 "zerofrom",
3003 "zerovec-derive",
3004]
3005
3006[[package]]
3007name = "zerovec-derive"
3008version = "0.10.3"
2419source = "registry+https://github.com/rust-lang/crates.io-index" 3009source = "registry+https://github.com/rust-lang/crates.io-index"
2420checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" 3010checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
3011dependencies = [
3012 "proc-macro2",
3013 "quote",
3014 "syn",
3015]
diff --git a/docs/man/gitolfs3-server.1 b/docs/man/gitolfs3-server.1
index 30f8cb5..ec70f0c 100644
--- a/docs/man/gitolfs3-server.1
+++ b/docs/man/gitolfs3-server.1
@@ -1,4 +1,4 @@
1.TH GITOLFS3-SERVER 1 2024-04-29 Gitolfs3 "Gitolfs3 Manual" 1.TH GITOLFS3-SERVER 1 2024-10-22 Gitolfs3 "Gitolfs3 Manual"
2.SH NAME 2.SH NAME
3gitolfs3-server \- Gitolfs3 Git LFS server 3gitolfs3-server \- Gitolfs3 Git LFS server
4.SH SYNOPSIS 4.SH SYNOPSIS
@@ -18,18 +18,13 @@ In the configured S3 bucket, a familiar structure is used:
18.IP 18.IP
19.TS 19.TS
20tab(%); 20tab(%);
21l l
22l l
23l l
24l l
25l l. 21l l.
26lfs-test.git/ % repository name 22lfs-test.git/ % repository name
27 lfs/objects/ % namespace 23 lfs/objects/ % namespace
28 4e/ % first byte of the object ID (OID) 24 4e/ % first byte of the object ID (OID)
29 7b/ % second byte of the OID 25 7b/ % second byte of the OID
30 4e7bfdb[...]11ce013 % OID (SHA256) 26 4e7bfdb[...]11ce013 % OID (SHA256)
31.TE 27.TE
32
33.P 28.P
34Public and private repositories are distinguished using the presence of a 29Public and private repositories are distinguished using the presence of a
35\fIgit-daemon-export-ok\fR file in the bare repository. 30\fIgit-daemon-export-ok\fR file in the bare repository.
@@ -125,7 +120,7 @@ Only untrusted hosts are held to this limit.
125A comma-separated list of hosts which can be classified as 'trusted'. 120A comma-separated list of hosts which can be classified as 'trusted'.
126 121
127If a request comes in for which the X-Forwarded-Host header contains one of the 122If a request comes in for which the X-Forwarded-Host header contains one of the
128hosts in this list, then the user is automatically generated read access to all 123hosts in this list, then the user is automatically granted read access to all
129repositories, regardless of the presence of a \fIgit-daemon-export-ok\fR file. 124repositories, regardless of the presence of a \fIgit-daemon-export-ok\fR file.
130Furthermore, presigned URLs are returned for download requests, instead of 125Furthermore, presigned URLs are returned for download requests, instead of
131downloads being proxied through the Gitolfs3 server. 126downloads being proxied through the Gitolfs3 server.
diff --git a/flake.lock b/flake.lock
index 8e0b00e..e8847e0 100644
--- a/flake.lock
+++ b/flake.lock
@@ -3,11 +3,11 @@
3 "advisory-db": { 3 "advisory-db": {
4 "flake": false, 4 "flake": false,
5 "locked": { 5 "locked": {
6 "lastModified": 1714183630, 6 "lastModified": 1744103523,
7 "narHash": "sha256-1BVft7ggSN2XXFeXQjazU3jN9wVECd9qp2mZx/8GDMk=", 7 "narHash": "sha256-La+KO5n68p6qdhLBr9qiIQUheS7OooxyqzBXMMDqr/0=",
8 "owner": "rustsec", 8 "owner": "rustsec",
9 "repo": "advisory-db", 9 "repo": "advisory-db",
10 "rev": "35e7459a331d3e0c585e56dabd03006b9b354088", 10 "rev": "fcb34000ec9c560710ee69cef5b3e589ad1b93f7",
11 "type": "github" 11 "type": "github"
12 }, 12 },
13 "original": { 13 "original": {
@@ -17,22 +17,18 @@
17 } 17 }
18 }, 18 },
19 "crane": { 19 "crane": {
20 "inputs": {
21 "nixpkgs": [
22 "nixpkgs"
23 ]
24 },
25 "locked": { 20 "locked": {
26 "lastModified": 1712513517, 21 "lastModified": 1743908961,
27 "narHash": "sha256-VuLm5tTMqfS82NZAsNfsW7U+pTZ1+GcOU7gYR/Fb1Z4=", 22 "narHash": "sha256-e1idZdpnnHWuosI3KsBgAgrhMR05T2oqskXCmNzGPq0=",
28 "rev": "9caad1eb0c69a13ee6467035353b71a76c85ea53", 23 "owner": "ipetkov",
29 "revCount": 540, 24 "repo": "crane",
30 "type": "tarball", 25 "rev": "80ceeec0dc94ef967c371dcdc56adb280328f591",
31 "url": "https://api.flakehub.com/f/pinned/ipetkov/crane/0.16.4/018eb9c4-47d3-7d6b-9a55-1e0f89eabf96/source.tar.gz" 26 "type": "github"
32 }, 27 },
33 "original": { 28 "original": {
34 "type": "tarball", 29 "owner": "ipetkov",
35 "url": "https://flakehub.com/f/ipetkov/crane/0.16.3.tar.gz" 30 "repo": "crane",
31 "type": "github"
36 } 32 }
37 }, 33 },
38 "flake-utils": { 34 "flake-utils": {
@@ -40,30 +36,32 @@
40 "systems": "systems" 36 "systems": "systems"
41 }, 37 },
42 "locked": { 38 "locked": {
43 "lastModified": 1710146030, 39 "lastModified": 1731533236,
44 "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", 40 "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
45 "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", 41 "owner": "numtide",
46 "revCount": 92, 42 "repo": "flake-utils",
47 "type": "tarball", 43 "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
48 "url": "https://api.flakehub.com/f/pinned/numtide/flake-utils/0.1.92%2Brev-b1d9ab70662946ef0850d488da1c9019f3a9752a/018e2ca5-e5a2-7f80-9261-445a8cecd4d7/source.tar.gz" 44 "type": "github"
49 }, 45 },
50 "original": { 46 "original": {
51 "type": "tarball", 47 "owner": "numtide",
52 "url": "https://flakehub.com/f/numtide/flake-utils/0.1.92.tar.gz" 48 "repo": "flake-utils",
49 "type": "github"
53 } 50 }
54 }, 51 },
55 "nixpkgs": { 52 "nixpkgs": {
56 "locked": { 53 "locked": {
57 "lastModified": 1713828541, 54 "lastModified": 1743975612,
58 "narHash": "sha256-KtvQeE12MSkCOhvVmnmcZCjnx7t31zWin2XVSDOwBDE=", 55 "narHash": "sha256-o4FjFOUmjSRMK7dn0TFdAT0RRWUWD+WsspPHa+qEQT8=",
59 "rev": "b500489fd3cf653eafc075f9362423ad5cdd8676", 56 "owner": "NixOS",
60 "revCount": 557957, 57 "repo": "nixpkgs",
61 "type": "tarball", 58 "rev": "a880f49904d68b5e53338d1e8c7bf80f59903928",
62 "url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2311.557957%2Brev-b500489fd3cf653eafc075f9362423ad5cdd8676/018f0fd6-81fe-7478-8e97-08ae23c447b1/source.tar.gz" 59 "type": "github"
63 }, 60 },
64 "original": { 61 "original": {
65 "type": "tarball", 62 "id": "nixpkgs",
66 "url": "https://flakehub.com/f/NixOS/nixpkgs/0.2311.%2A.tar.gz" 63 "ref": "nixos-24.11",
64 "type": "indirect"
67 } 65 }
68 }, 66 },
69 "root": { 67 "root": {
@@ -77,19 +75,16 @@
77 }, 75 },
78 "rust-overlay": { 76 "rust-overlay": {
79 "inputs": { 77 "inputs": {
80 "flake-utils": [
81 "flake-utils"
82 ],
83 "nixpkgs": [ 78 "nixpkgs": [
84 "nixpkgs" 79 "nixpkgs"
85 ] 80 ]
86 }, 81 },
87 "locked": { 82 "locked": {
88 "lastModified": 1714356894, 83 "lastModified": 1744079607,
89 "narHash": "sha256-W6Mss7AG6bnFT1BqRApHXvLXBrFOu7V0+EUe9iML30s=", 84 "narHash": "sha256-5cog6Qd6w/bINdLO5mOysAHOHey8PwFXk4IWo+y+Czg=",
90 "owner": "oxalica", 85 "owner": "oxalica",
91 "repo": "rust-overlay", 86 "repo": "rust-overlay",
92 "rev": "d9b44509b4064f0a3fc9c7c92a603861f52fbedc", 87 "rev": "f6b62cc99c25e79a1c17e9fca91dc6b6faebec6c",
93 "type": "github" 88 "type": "github"
94 }, 89 },
95 "original": { 90 "original": {
diff --git a/flake.nix b/flake.nix
index 586486c..4d8c5b2 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,12 +1,9 @@
1{ 1{
2 inputs = { 2 inputs = {
3 nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.2311.*.tar.gz"; 3 nixpkgs.url = "nixpkgs/nixos-24.11";
4 flake-utils.url = "https://flakehub.com/f/numtide/flake-utils/0.1.92.tar.gz";
5 4
6 crane = { 5 crane.url = "github:ipetkov/crane";
7 url = "https://flakehub.com/f/ipetkov/crane/0.16.3.tar.gz"; 6 flake-utils.url = "github:numtide/flake-utils";
8 inputs.nixpkgs.follows = "nixpkgs";
9 };
10 7
11 advisory-db = { 8 advisory-db = {
12 url = "github:rustsec/advisory-db"; 9 url = "github:rustsec/advisory-db";
@@ -15,10 +12,7 @@
15 12
16 rust-overlay = { 13 rust-overlay = {
17 url = "github:oxalica/rust-overlay"; 14 url = "github:oxalica/rust-overlay";
18 inputs = { 15 inputs.nixpkgs.follows = "nixpkgs";
19 nixpkgs.follows = "nixpkgs";
20 flake-utils.follows = "flake-utils";
21 };
22 }; 16 };
23 }; 17 };
24 18
diff --git a/gitolfs3-authenticate/Cargo.toml b/gitolfs3-authenticate/Cargo.toml
index ff2b702..c39b736 100644
--- a/gitolfs3-authenticate/Cargo.toml
+++ b/gitolfs3-authenticate/Cargo.toml
@@ -1,7 +1,7 @@
1[package] 1[package]
2name = "gitolfs3-authenticate" 2name = "gitolfs3-authenticate"
3version = "0.1.0" 3version = "0.1.0"
4edition = "2021" 4edition = "2024"
5license = "MIT" 5license = "MIT"
6 6
7[dependencies] 7[dependencies]
diff --git a/gitolfs3-authenticate/src/main.rs b/gitolfs3-authenticate/src/main.rs
index 027c01b..1195b1c 100644
--- a/gitolfs3-authenticate/src/main.rs
+++ b/gitolfs3-authenticate/src/main.rs
@@ -1,6 +1,6 @@
1use anyhow::{anyhow, bail, Result}; 1use anyhow::{Result, anyhow, bail};
2use chrono::Utc; 2use chrono::Utc;
3use gitolfs3_common::{generate_tag, load_key, Claims, Key, Operation, SpecificClaims}; 3use gitolfs3_common::{Claims, Key, Operation, SpecificClaims, generate_tag, load_key};
4use serde_json::json; 4use serde_json::json;
5use std::{process::ExitCode, time::Duration}; 5use std::{process::ExitCode, time::Duration};
6 6
diff --git a/gitolfs3-common/Cargo.toml b/gitolfs3-common/Cargo.toml
index e0d3c3b..e5fbf75 100644
--- a/gitolfs3-common/Cargo.toml
+++ b/gitolfs3-common/Cargo.toml
@@ -1,11 +1,11 @@
1[package] 1[package]
2name = "gitolfs3-common" 2name = "gitolfs3-common"
3version = "0.1.0" 3version = "0.1.0"
4edition = "2021" 4edition = "2024"
5license = "MIT" 5license = "MIT"
6 6
7[dependencies] 7[dependencies]
8chrono = "0.4" 8chrono = "0.4"
9hmac-sha256 = "1.1" 9hmac-sha256 = "1.1"
10subtle = "2.5" 10subtle = "2.6"
11serde = { version = "1", features = ["derive"] } 11serde = { version = "1", features = ["derive"] }
diff --git a/gitolfs3-common/src/lib.rs b/gitolfs3-common/src/lib.rs
index 917f566..bac5729 100644
--- a/gitolfs3-common/src/lib.rs
+++ b/gitolfs3-common/src/lib.rs
@@ -1,5 +1,5 @@
1use chrono::{DateTime, Utc}; 1use chrono::{DateTime, Utc};
2use serde::{de, Deserialize, Serialize}; 2use serde::{Deserialize, Serialize, de};
3use std::{ 3use std::{
4 fmt::{self, Write}, 4 fmt::{self, Write},
5 ops, 5 ops,
@@ -163,13 +163,13 @@ impl fmt::Display for ReadHexError {
163} 163}
164 164
165fn parse_hex_exact(value: &str, buf: &mut [u8]) -> Result<(), ParseHexError> { 165fn parse_hex_exact(value: &str, buf: &mut [u8]) -> Result<(), ParseHexError> {
166 if value.bytes().len() % 2 == 1 { 166 if value.len() % 2 == 1 {
167 return Err(ParseHexError::UnevenNibbles); 167 return Err(ParseHexError::UnevenNibbles);
168 } 168 }
169 if value.bytes().len() < 2 * buf.len() { 169 if value.len() < 2 * buf.len() {
170 return Err(ParseHexError::TooShort); 170 return Err(ParseHexError::TooShort);
171 } 171 }
172 if value.bytes().len() > 2 * buf.len() { 172 if value.len() > 2 * buf.len() {
173 return Err(ParseHexError::TooLong); 173 return Err(ParseHexError::TooLong);
174 } 174 }
175 for (i, c) in value.bytes().enumerate() { 175 for (i, c) in value.bytes().enumerate() {
diff --git a/gitolfs3-server/Cargo.toml b/gitolfs3-server/Cargo.toml
index efea78b..5908770 100644
--- a/gitolfs3-server/Cargo.toml
+++ b/gitolfs3-server/Cargo.toml
@@ -1,20 +1,20 @@
1[package] 1[package]
2name = "gitolfs3-server" 2name = "gitolfs3-server"
3version = "0.1.0" 3version = "0.1.0"
4edition = "2021" 4edition = "2024"
5license = "MIT" 5license = "MIT"
6 6
7[dependencies] 7[dependencies]
8aws-config = { version = "1.1.2" } 8aws-config = "1.6"
9aws-sdk-s3 = "1.12.0" 9aws-sdk-s3 = "1.82"
10axum = "0.7" 10axum = "0.8"
11base64 = "0.21" 11base64 = "0.22"
12chrono = { version = "0.4", features = ["serde"] } 12chrono = { version = "0.4", features = ["serde"] }
13gitolfs3-common = { path = "../gitolfs3-common" } 13gitolfs3-common = { path = "../gitolfs3-common" }
14mime = "0.3" 14mime = "0.3"
15serde = { version = "1", features = ["derive"] } 15serde = { version = "1", features = ["derive"] }
16serde_json = "1" 16serde_json = "1"
17tokio = { version = "1.35", features = ["full"] } 17tokio = { version = "1.44", features = ["full"] }
18tokio-util = "0.7" 18tokio-util = "0.7"
19tower = "0.4" 19tower = "0.5"
20tracing-subscriber = { version = "0.3", features = ["env-filter"] } 20tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/gitolfs3-server/src/api.rs b/gitolfs3-server/src/api.rs
index dba7ada..e1a2983 100644
--- a/gitolfs3-server/src/api.rs
+++ b/gitolfs3-server/src/api.rs
@@ -1,89 +1,30 @@
1use std::collections::HashMap; 1use std::collections::HashMap;
2 2
3use axum::{ 3use axum::{
4 async_trait,
5 extract::{rejection, FromRequest, FromRequestParts, Request},
6 http::{header, request::Parts, HeaderValue, StatusCode},
7 response::{IntoResponse, Response},
8 Extension, Json, 4 Extension, Json,
5 extract::{FromRequest, FromRequestParts, Request, rejection},
6 http,
7 response::{IntoResponse, Response},
9}; 8};
10use chrono::{DateTime, Utc}; 9use chrono::{DateTime, Utc};
11use gitolfs3_common::{Oid, Operation}; 10use gitolfs3_common::{Oid, Operation};
12use serde::{de::DeserializeOwned, Deserialize, Serialize}; 11use serde::{Deserialize, Serialize, de::DeserializeOwned};
13
14pub const REPO_NOT_FOUND: GitLfsErrorResponse =
15 make_error_resp(StatusCode::NOT_FOUND, "Repository not found");
16
17#[derive(Clone)]
18pub struct RepositoryName(pub String);
19
20pub struct RepositoryNameRejection;
21
22impl IntoResponse for RepositoryNameRejection {
23 fn into_response(self) -> Response {
24 (StatusCode::INTERNAL_SERVER_ERROR, "Missing repository name").into_response()
25 }
26}
27
28#[async_trait]
29impl<S: Send + Sync> FromRequestParts<S> for RepositoryName {
30 type Rejection = RepositoryNameRejection;
31
32 async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {
33 let Ok(Extension(repo_name)) = Extension::<Self>::from_request_parts(parts, state).await
34 else {
35 return Err(RepositoryNameRejection);
36 };
37 Ok(repo_name)
38 }
39}
40 12
41#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] 13// ----------------------- Generic facilities ----------------------
42pub enum TransferAdapter {
43 #[serde(rename = "basic")]
44 Basic,
45 #[serde(other)]
46 Unknown,
47}
48 14
49#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] 15pub type GitLfsErrorResponse<'a> = (http::StatusCode, GitLfsJson<GitLfsErrorData<'a>>);
50pub enum HashAlgo {
51 #[serde(rename = "sha256")]
52 Sha256,
53 #[serde(other)]
54 Unknown,
55}
56 16
57impl Default for HashAlgo { 17#[derive(Debug, Serialize)]
58 fn default() -> Self { 18pub struct GitLfsErrorData<'a> {
59 Self::Sha256 19 pub message: &'a str,
60 }
61}
62
63#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
64pub struct BatchRequestObject {
65 pub oid: Oid,
66 pub size: i64,
67}
68
69#[derive(Debug, Serialize, Deserialize, Clone)]
70struct BatchRef {
71 name: String,
72} 20}
73 21
74fn default_transfers() -> Vec<TransferAdapter> { 22pub const fn make_error_resp(code: http::StatusCode, message: &str) -> GitLfsErrorResponse {
75 vec![TransferAdapter::Basic] 23 (code, GitLfsJson(Json(GitLfsErrorData { message })))
76} 24}
77 25
78#[derive(Debug, Deserialize, PartialEq, Eq, Clone)] 26pub const REPO_NOT_FOUND: GitLfsErrorResponse =
79pub struct BatchRequest { 27 make_error_resp(http::StatusCode::NOT_FOUND, "Repository not found");
80 pub operation: Operation,
81 #[serde(default = "default_transfers")]
82 pub transfers: Vec<TransferAdapter>,
83 pub objects: Vec<BatchRequestObject>,
84 #[serde(default)]
85 pub hash_algo: HashAlgo,
86}
87 28
88#[derive(Debug, Clone)] 29#[derive(Debug, Clone)]
89pub struct GitLfsJson<T>(pub Json<T>); 30pub struct GitLfsJson<T>(pub Json<T>);
@@ -100,7 +41,7 @@ impl IntoResponse for GitLfsJsonRejection {
100 match self { 41 match self {
101 Self::Json(rej) => rej.into_response(), 42 Self::Json(rej) => rej.into_response(),
102 Self::MissingGitLfsJsonContentType => make_error_resp( 43 Self::MissingGitLfsJsonContentType => make_error_resp(
103 StatusCode::UNSUPPORTED_MEDIA_TYPE, 44 http::StatusCode::UNSUPPORTED_MEDIA_TYPE,
104 &format!("Expected request with `Content-Type: {LFS_MIME}`"), 45 &format!("Expected request with `Content-Type: {LFS_MIME}`"),
105 ) 46 )
106 .into_response(), 47 .into_response(),
@@ -125,7 +66,7 @@ pub fn is_git_lfs_json_mimetype(mimetype: &str) -> bool {
125} 66}
126 67
127fn has_git_lfs_json_content_type(req: &Request) -> bool { 68fn has_git_lfs_json_content_type(req: &Request) -> bool {
128 let Some(content_type) = req.headers().get(header::CONTENT_TYPE) else { 69 let Some(content_type) = req.headers().get(http::header::CONTENT_TYPE) else {
129 return false; 70 return false;
130 }; 71 };
131 let Ok(content_type) = content_type.to_str() else { 72 let Ok(content_type) = content_type.to_str() else {
@@ -134,7 +75,6 @@ fn has_git_lfs_json_content_type(req: &Request) -> bool {
134 is_git_lfs_json_mimetype(content_type) 75 is_git_lfs_json_mimetype(content_type)
135} 76}
136 77
137#[async_trait]
138impl<T, S> FromRequest<S> for GitLfsJson<T> 78impl<T, S> FromRequest<S> for GitLfsJson<T>
139where 79where
140 T: DeserializeOwned, 80 T: DeserializeOwned,
@@ -158,46 +98,97 @@ impl<T: Serialize> IntoResponse for GitLfsJson<T> {
158 let GitLfsJson(json) = self; 98 let GitLfsJson(json) = self;
159 let mut resp = json.into_response(); 99 let mut resp = json.into_response();
160 resp.headers_mut().insert( 100 resp.headers_mut().insert(
161 header::CONTENT_TYPE, 101 http::header::CONTENT_TYPE,
162 HeaderValue::from_static("application/vnd.git-lfs+json; charset=utf-8"), 102 http::HeaderValue::from_static("application/vnd.git-lfs+json; charset=utf-8"),
163 ); 103 );
164 resp 104 resp
165 } 105 }
166} 106}
167 107
168#[derive(Debug, Serialize)] 108#[derive(Clone)]
169pub struct GitLfsErrorData<'a> { 109pub struct RepositoryName(pub String);
170 pub message: &'a str, 110
111pub struct RepositoryNameRejection;
112
113impl IntoResponse for RepositoryNameRejection {
114 fn into_response(self) -> Response {
115 (
116 http::StatusCode::INTERNAL_SERVER_ERROR,
117 "Missing repository name",
118 )
119 .into_response()
120 }
171} 121}
172 122
173pub type GitLfsErrorResponse<'a> = (StatusCode, GitLfsJson<GitLfsErrorData<'a>>); 123impl<S: Send + Sync> FromRequestParts<S> for RepositoryName {
124 type Rejection = RepositoryNameRejection;
174 125
175pub const fn make_error_resp(code: StatusCode, message: &str) -> GitLfsErrorResponse { 126 async fn from_request_parts(
176 (code, GitLfsJson(Json(GitLfsErrorData { message }))) 127 parts: &mut http::request::Parts,
128 state: &S,
129 ) -> Result<Self, Self::Rejection> {
130 let Ok(Extension(repo_name)) = Extension::<Self>::from_request_parts(parts, state).await
131 else {
132 return Err(RepositoryNameRejection);
133 };
134 Ok(repo_name)
135 }
177} 136}
178 137
179#[derive(Debug, Serialize, Clone)] 138// ----------------------- Git LFS Batch API -----------------------
180pub struct BatchResponseObjectAction { 139
181 pub href: String, 140#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
182 #[serde(skip_serializing_if = "HashMap::is_empty")] 141pub struct BatchRequest {
183 pub header: HashMap<String, String>, 142 pub operation: Operation,
184 pub expires_at: DateTime<Utc>, 143 #[serde(default = "default_transfers")]
144 pub transfers: Vec<TransferAdapter>,
145 pub objects: Vec<BatchRequestObject>,
146 #[serde(default)]
147 pub hash_algo: HashAlgo,
185} 148}
186 149
187#[derive(Default, Debug, Serialize, Clone)] 150#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
188pub struct BatchResponseObjectActions { 151pub struct BatchRequestObject {
189 #[serde(skip_serializing_if = "Option::is_none")] 152 pub oid: Oid,
190 pub upload: Option<BatchResponseObjectAction>, 153 pub size: i64,
191 #[serde(skip_serializing_if = "Option::is_none")]
192 pub download: Option<BatchResponseObjectAction>,
193 #[serde(skip_serializing_if = "Option::is_none")]
194 pub verify: Option<BatchResponseObjectAction>,
195} 154}
196 155
197#[derive(Debug, Clone, Serialize)] 156#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)]
198pub struct BatchResponseObjectError { 157pub enum TransferAdapter {
199 pub code: u16, 158 #[serde(rename = "basic")]
200 pub message: String, 159 Basic,
160 #[serde(other)]
161 Unknown,
162}
163
164fn default_transfers() -> Vec<TransferAdapter> {
165 vec![TransferAdapter::Basic]
166}
167
168#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)]
169pub enum HashAlgo {
170 #[serde(rename = "sha256")]
171 Sha256,
172 #[serde(other)]
173 Unknown,
174}
175
176impl Default for HashAlgo {
177 fn default() -> Self {
178 Self::Sha256
179 }
180}
181
182#[derive(Debug, Serialize, Deserialize, Clone)]
183struct BatchRef {
184 name: String,
185}
186
187#[derive(Debug, Serialize, Clone)]
188pub struct BatchResponse {
189 pub transfer: TransferAdapter,
190 pub objects: Vec<BatchResponseObject>,
191 pub hash_algo: HashAlgo,
201} 192}
202 193
203#[derive(Debug, Serialize, Clone)] 194#[derive(Debug, Serialize, Clone)]
@@ -211,10 +202,16 @@ pub struct BatchResponseObject {
211 pub error: Option<BatchResponseObjectError>, 202 pub error: Option<BatchResponseObjectError>,
212} 203}
213 204
205#[derive(Debug, Clone, Serialize)]
206pub struct BatchResponseObjectError {
207 pub code: u16,
208 pub message: String,
209}
210
214impl BatchResponseObject { 211impl BatchResponseObject {
215 pub fn error( 212 pub fn error(
216 obj: &BatchRequestObject, 213 obj: &BatchRequestObject,
217 code: StatusCode, 214 code: http::StatusCode,
218 message: String, 215 message: String,
219 ) -> BatchResponseObject { 216 ) -> BatchResponseObject {
220 BatchResponseObject { 217 BatchResponseObject {
@@ -231,10 +228,21 @@ impl BatchResponseObject {
231} 228}
232 229
233#[derive(Debug, Serialize, Clone)] 230#[derive(Debug, Serialize, Clone)]
234pub struct BatchResponse { 231pub struct BatchResponseObjectAction {
235 pub transfer: TransferAdapter, 232 pub href: String,
236 pub objects: Vec<BatchResponseObject>, 233 #[serde(skip_serializing_if = "HashMap::is_empty")]
237 pub hash_algo: HashAlgo, 234 pub header: HashMap<String, String>,
235 pub expires_at: DateTime<Utc>,
236}
237
238#[derive(Default, Debug, Serialize, Clone)]
239pub struct BatchResponseObjectActions {
240 #[serde(skip_serializing_if = "Option::is_none")]
241 pub upload: Option<BatchResponseObjectAction>,
242 #[serde(skip_serializing_if = "Option::is_none")]
243 pub download: Option<BatchResponseObjectAction>,
244 #[serde(skip_serializing_if = "Option::is_none")]
245 pub verify: Option<BatchResponseObjectAction>,
238} 246}
239 247
240#[test] 248#[test]
diff --git a/gitolfs3-server/src/authz.rs b/gitolfs3-server/src/authz.rs
index 0674cef..c4cb6df 100644
--- a/gitolfs3-server/src/authz.rs
+++ b/gitolfs3-server/src/authz.rs
@@ -1,41 +1,22 @@
1use std::collections::HashSet; 1use std::collections::HashSet;
2 2
3use axum::http::{header, HeaderMap, StatusCode}; 3use axum::http;
4use chrono::{DateTime, Utc}; 4use chrono::{DateTime, Utc};
5use gitolfs3_common::{generate_tag, Claims, Digest, Oid, Operation, SpecificClaims}; 5use gitolfs3_common::{Claims, Digest, Oid, Operation, SpecificClaims, generate_tag};
6 6
7use crate::{ 7use crate::{
8 api::{make_error_resp, GitLfsErrorResponse, REPO_NOT_FOUND}, 8 api::{GitLfsErrorResponse, REPO_NOT_FOUND, make_error_resp},
9 config::AuthorizationConfig, 9 config::AuthorizationConfig,
10}; 10};
11 11
12pub struct Trusted(pub bool); 12pub struct Trusted(pub bool);
13 13
14fn forwarded_from_trusted_host(
15 headers: &HeaderMap,
16 trusted: &HashSet<String>,
17) -> Result<bool, GitLfsErrorResponse<'static>> {
18 if let Some(forwarded_host) = headers.get("X-Forwarded-Host") {
19 if let Ok(forwarded_host) = forwarded_host.to_str() {
20 if trusted.contains(forwarded_host) {
21 return Ok(true);
22 }
23 } else {
24 return Err(make_error_resp(
25 StatusCode::NOT_FOUND,
26 "Invalid X-Forwarded-Host header",
27 ));
28 }
29 }
30 Ok(false)
31}
32
33pub fn authorize_batch( 14pub fn authorize_batch(
34 conf: &AuthorizationConfig, 15 conf: &AuthorizationConfig,
35 repo_path: &str, 16 repo_path: &str,
36 public: bool, 17 public: bool,
37 operation: Operation, 18 operation: Operation,
38 headers: &HeaderMap, 19 headers: &http::HeaderMap,
39) -> Result<Trusted, GitLfsErrorResponse<'static>> { 20) -> Result<Trusted, GitLfsErrorResponse<'static>> {
40 // - No authentication required for downloading exported repos 21 // - No authentication required for downloading exported repos
41 // - When authenticated: 22 // - When authenticated:
@@ -57,7 +38,7 @@ fn authorize_batch_unauthenticated(
57 conf: &AuthorizationConfig, 38 conf: &AuthorizationConfig,
58 public: bool, 39 public: bool,
59 operation: Operation, 40 operation: Operation,
60 headers: &HeaderMap, 41 headers: &http::HeaderMap,
61) -> Result<Trusted, GitLfsErrorResponse<'static>> { 42) -> Result<Trusted, GitLfsErrorResponse<'static>> {
62 let trusted = forwarded_from_trusted_host(headers, &conf.trusted_forwarded_hosts)?; 43 let trusted = forwarded_from_trusted_host(headers, &conf.trusted_forwarded_hosts)?;
63 match operation { 44 match operation {
@@ -71,7 +52,7 @@ fn authorize_batch_unauthenticated(
71 return Err(REPO_NOT_FOUND); 52 return Err(REPO_NOT_FOUND);
72 } 53 }
73 Err(make_error_resp( 54 Err(make_error_resp(
74 StatusCode::FORBIDDEN, 55 http::StatusCode::FORBIDDEN,
75 "Authentication required to upload", 56 "Authentication required to upload",
76 )) 57 ))
77 } 58 }
@@ -94,7 +75,7 @@ pub fn authorize_get(
94 conf: &AuthorizationConfig, 75 conf: &AuthorizationConfig,
95 repo_path: &str, 76 repo_path: &str,
96 oid: Oid, 77 oid: Oid,
97 headers: &HeaderMap, 78 headers: &http::HeaderMap,
98) -> Result<(), GitLfsErrorResponse<'static>> { 79) -> Result<(), GitLfsErrorResponse<'static>> {
99 let claims = VerifyClaimsInput { 80 let claims = VerifyClaimsInput {
100 specific_claims: SpecificClaims::Download(oid), 81 specific_claims: SpecificClaims::Download(oid),
@@ -102,27 +83,48 @@ pub fn authorize_get(
102 }; 83 };
103 if !verify_claims(conf, &claims, headers)? { 84 if !verify_claims(conf, &claims, headers)? {
104 return Err(make_error_resp( 85 return Err(make_error_resp(
105 StatusCode::UNAUTHORIZED, 86 http::StatusCode::UNAUTHORIZED,
106 "Repository not found", 87 "Repository not found",
107 )); 88 ));
108 } 89 }
109 Ok(()) 90 Ok(())
110} 91}
111 92
112pub struct VerifyClaimsInput<'a> { 93fn forwarded_from_trusted_host(
113 pub specific_claims: SpecificClaims, 94 headers: &http::HeaderMap,
114 pub repo_path: &'a str, 95 trusted: &HashSet<String>,
96) -> Result<bool, GitLfsErrorResponse<'static>> {
97 if let Some(forwarded_host) = headers.get("X-Forwarded-Host") {
98 if let Ok(forwarded_host) = forwarded_host.to_str() {
99 if trusted.contains(forwarded_host) {
100 return Ok(true);
101 }
102 } else {
103 return Err(make_error_resp(
104 http::StatusCode::NOT_FOUND,
105 "Invalid X-Forwarded-Host header",
106 ));
107 }
108 }
109 Ok(false)
110}
111
112struct VerifyClaimsInput<'a> {
113 specific_claims: SpecificClaims,
114 repo_path: &'a str,
115} 115}
116 116
117fn verify_claims( 117fn verify_claims(
118 conf: &AuthorizationConfig, 118 conf: &AuthorizationConfig,
119 claims: &VerifyClaimsInput, 119 claims: &VerifyClaimsInput,
120 headers: &HeaderMap, 120 headers: &http::HeaderMap,
121) -> Result<bool, GitLfsErrorResponse<'static>> { 121) -> Result<bool, GitLfsErrorResponse<'static>> {
122 const INVALID_AUTHZ_HEADER: GitLfsErrorResponse = 122 const INVALID_AUTHZ_HEADER: GitLfsErrorResponse = make_error_resp(
123 make_error_resp(StatusCode::BAD_REQUEST, "Invalid authorization header"); 123 http::StatusCode::BAD_REQUEST,
124 "Invalid authorization header",
125 );
124 126
125 let Some(authz) = headers.get(header::AUTHORIZATION) else { 127 let Some(authz) = headers.get(http::header::AUTHORIZATION) else {
126 return Ok(false); 128 return Ok(false);
127 }; 129 };
128 let authz = authz.to_str().map_err(|_| INVALID_AUTHZ_HEADER)?; 130 let authz = authz.to_str().map_err(|_| INVALID_AUTHZ_HEADER)?;
@@ -141,7 +143,12 @@ fn verify_claims(
141 }, 143 },
142 &conf.key, 144 &conf.key,
143 ) 145 )
144 .ok_or_else(|| make_error_resp(StatusCode::INTERNAL_SERVER_ERROR, "Internal server error"))?; 146 .ok_or_else(|| {
147 make_error_resp(
148 http::StatusCode::INTERNAL_SERVER_ERROR,
149 "Internal server error",
150 )
151 })?;
145 if tag != expected_tag { 152 if tag != expected_tag {
146 return Err(INVALID_AUTHZ_HEADER); 153 return Err(INVALID_AUTHZ_HEADER);
147 } 154 }
@@ -175,8 +182,11 @@ fn test_validate_claims() {
175 repo_path: claims.repo_path, 182 repo_path: claims.repo_path,
176 specific_claims: claims.specific_claims, 183 specific_claims: claims.specific_claims,
177 }; 184 };
178 let mut headers = HeaderMap::new(); 185 let mut headers = http::HeaderMap::new();
179 headers.insert(header::AUTHORIZATION, header_value.try_into().unwrap()); 186 headers.insert(
187 http::header::AUTHORIZATION,
188 header_value.try_into().unwrap(),
189 );
180 190
181 assert!(verify_claims(&conf, &verification_claims, &headers).unwrap()); 191 assert!(verify_claims(&conf, &verification_claims, &headers).unwrap());
182} 192}
diff --git a/gitolfs3-server/src/config.rs b/gitolfs3-server/src/config.rs
index 75e84dc..7adc9f0 100644
--- a/gitolfs3-server/src/config.rs
+++ b/gitolfs3-server/src/config.rs
@@ -1,66 +1,6 @@
1use std::collections::HashSet; 1use std::collections::HashSet;
2 2
3use gitolfs3_common::{load_key, Key}; 3use gitolfs3_common::{Key, load_key};
4
5struct Env {
6 s3_access_key_id: String,
7 s3_secret_access_key: String,
8 s3_bucket: String,
9 s3_region: String,
10 s3_endpoint: String,
11 base_url: String,
12 key_path: String,
13 listen_host: String,
14 listen_port: String,
15 download_limit: String,
16 trusted_forwarded_hosts: String,
17}
18
19fn require_env(name: &str) -> Result<String, String> {
20 std::env::var(name)
21 .map_err(|_| format!("environment variable {name} should be defined and valid"))
22}
23
24impl Env {
25 fn load() -> Result<Env, String> {
26 Ok(Env {
27 s3_secret_access_key: require_env("GITOLFS3_S3_SECRET_ACCESS_KEY_FILE")?,
28 s3_access_key_id: require_env("GITOLFS3_S3_ACCESS_KEY_ID_FILE")?,
29 s3_region: require_env("GITOLFS3_S3_REGION")?,
30 s3_endpoint: require_env("GITOLFS3_S3_ENDPOINT")?,
31 s3_bucket: require_env("GITOLFS3_S3_BUCKET")?,
32 base_url: require_env("GITOLFS3_BASE_URL")?,
33 key_path: require_env("GITOLFS3_KEY_PATH")?,
34 listen_host: require_env("GITOLFS3_LISTEN_HOST")?,
35 listen_port: require_env("GITOLFS3_LISTEN_PORT")?,
36 download_limit: require_env("GITOLFS3_DOWNLOAD_LIMIT")?,
37 trusted_forwarded_hosts: std::env::var("GITOLFS3_TRUSTED_FORWARDED_HOSTS")
38 .unwrap_or_default(),
39 })
40 }
41}
42
43fn get_s3_client(env: &Env) -> Result<aws_sdk_s3::Client, std::io::Error> {
44 let access_key_id = std::fs::read_to_string(&env.s3_access_key_id)?;
45 let secret_access_key = std::fs::read_to_string(&env.s3_secret_access_key)?;
46
47 let credentials = aws_sdk_s3::config::Credentials::new(
48 access_key_id,
49 secret_access_key,
50 None,
51 None,
52 "gitolfs3-env",
53 );
54 let config = aws_config::SdkConfig::builder()
55 .behavior_version(aws_config::BehaviorVersion::latest())
56 .region(aws_config::Region::new(env.s3_region.clone()))
57 .endpoint_url(&env.s3_endpoint)
58 .credentials_provider(aws_sdk_s3::config::SharedCredentialsProvider::new(
59 credentials,
60 ))
61 .build();
62 Ok(aws_sdk_s3::Client::new(&config))
63}
64 4
65pub struct Config { 5pub struct Config {
66 pub listen_addr: (String, u16), 6 pub listen_addr: (String, u16),
@@ -83,7 +23,7 @@ impl Config {
83 Err(e) => return Err(format!("failed to load configuration: {e}")), 23 Err(e) => return Err(format!("failed to load configuration: {e}")),
84 }; 24 };
85 25
86 let s3_client = match get_s3_client(&env) { 26 let s3_client = match create_s3_client(&env) {
87 Ok(s3_client) => s3_client, 27 Ok(s3_client) => s3_client,
88 Err(e) => return Err(format!("failed to create S3 client: {e}")), 28 Err(e) => return Err(format!("failed to create S3 client: {e}")),
89 }; 29 };
@@ -120,3 +60,63 @@ impl Config {
120 }) 60 })
121 } 61 }
122} 62}
63
64fn create_s3_client(env: &Env) -> Result<aws_sdk_s3::Client, std::io::Error> {
65 let access_key_id = std::fs::read_to_string(&env.s3_access_key_id)?;
66 let secret_access_key = std::fs::read_to_string(&env.s3_secret_access_key)?;
67
68 let credentials = aws_sdk_s3::config::Credentials::new(
69 access_key_id,
70 secret_access_key,
71 None,
72 None,
73 "gitolfs3-env",
74 );
75 let config = aws_config::SdkConfig::builder()
76 .behavior_version(aws_config::BehaviorVersion::latest())
77 .region(aws_config::Region::new(env.s3_region.clone()))
78 .endpoint_url(&env.s3_endpoint)
79 .credentials_provider(aws_sdk_s3::config::SharedCredentialsProvider::new(
80 credentials,
81 ))
82 .build();
83 Ok(aws_sdk_s3::Client::new(&config))
84}
85
86struct Env {
87 s3_access_key_id: String,
88 s3_secret_access_key: String,
89 s3_bucket: String,
90 s3_region: String,
91 s3_endpoint: String,
92 base_url: String,
93 key_path: String,
94 listen_host: String,
95 listen_port: String,
96 download_limit: String,
97 trusted_forwarded_hosts: String,
98}
99
100impl Env {
101 fn load() -> Result<Env, String> {
102 Ok(Env {
103 s3_secret_access_key: require_env("GITOLFS3_S3_SECRET_ACCESS_KEY_FILE")?,
104 s3_access_key_id: require_env("GITOLFS3_S3_ACCESS_KEY_ID_FILE")?,
105 s3_region: require_env("GITOLFS3_S3_REGION")?,
106 s3_endpoint: require_env("GITOLFS3_S3_ENDPOINT")?,
107 s3_bucket: require_env("GITOLFS3_S3_BUCKET")?,
108 base_url: require_env("GITOLFS3_BASE_URL")?,
109 key_path: require_env("GITOLFS3_KEY_PATH")?,
110 listen_host: require_env("GITOLFS3_LISTEN_HOST")?,
111 listen_port: require_env("GITOLFS3_LISTEN_PORT")?,
112 download_limit: require_env("GITOLFS3_DOWNLOAD_LIMIT")?,
113 trusted_forwarded_hosts: std::env::var("GITOLFS3_TRUSTED_FORWARDED_HOSTS")
114 .unwrap_or_default(),
115 })
116 }
117}
118
119fn require_env(name: &str) -> Result<String, String> {
120 std::env::var(name)
121 .map_err(|_| format!("environment variable {name} should be defined and valid"))
122}
diff --git a/gitolfs3-server/src/dlimit.rs b/gitolfs3-server/src/dlimit.rs
index f68bec1..7a82a18 100644
--- a/gitolfs3-server/src/dlimit.rs
+++ b/gitolfs3-server/src/dlimit.rs
@@ -55,7 +55,7 @@ impl DownloadLimiter {
55 Ok(true) 55 Ok(true)
56 } 56 }
57 57
58 pub async fn reset(&mut self) { 58 async fn reset(&mut self) {
59 self.current = 0; 59 self.current = 0;
60 if let Err(e) = self.write_new_count().await { 60 if let Err(e) = self.write_new_count().await {
61 println!("Failed to reset download counter: {e}"); 61 println!("Failed to reset download counter: {e}");
diff --git a/gitolfs3-server/src/handler.rs b/gitolfs3-server/src/handler.rs
index 6516291..be39721 100644
--- a/gitolfs3-server/src/handler.rs
+++ b/gitolfs3-server/src/handler.rs
@@ -2,24 +2,24 @@ use std::{collections::HashMap, sync::Arc};
2 2
3use aws_sdk_s3::{error::SdkError, operation::head_object::HeadObjectOutput}; 3use aws_sdk_s3::{error::SdkError, operation::head_object::HeadObjectOutput};
4use axum::{ 4use axum::{
5 Json,
5 extract::{Path, State}, 6 extract::{Path, State},
6 http::{header, HeaderMap, StatusCode}, 7 http,
7 response::{IntoResponse, Response}, 8 response::{IntoResponse, Response},
8 Json,
9}; 9};
10use base64::{prelude::BASE64_STANDARD, Engine}; 10use base64::{Engine, prelude::BASE64_STANDARD};
11use chrono::Utc; 11use chrono::Utc;
12use gitolfs3_common::{generate_tag, Claims, HexByte, Oid, Operation, SpecificClaims}; 12use gitolfs3_common::{Claims, HexByte, Oid, Operation, SpecificClaims, generate_tag};
13use serde::{de, Deserialize}; 13use serde::{Deserialize, de};
14use tokio::sync::Mutex; 14use tokio::sync::Mutex;
15 15
16use crate::{ 16use crate::{
17 api::{ 17 api::{
18 is_git_lfs_json_mimetype, make_error_resp, BatchRequest, BatchRequestObject, BatchResponse, 18 BatchRequest, BatchRequestObject, BatchResponse, BatchResponseObject,
19 BatchResponseObject, BatchResponseObjectAction, BatchResponseObjectActions, GitLfsJson, 19 BatchResponseObjectAction, BatchResponseObjectActions, GitLfsJson, HashAlgo, LFS_MIME,
20 HashAlgo, RepositoryName, TransferAdapter, LFS_MIME, REPO_NOT_FOUND, 20 REPO_NOT_FOUND, RepositoryName, TransferAdapter, is_git_lfs_json_mimetype, make_error_resp,
21 }, 21 },
22 authz::{authorize_batch, authorize_get, Trusted}, 22 authz::{Trusted, authorize_batch, authorize_get},
23 config::AuthorizationConfig, 23 config::AuthorizationConfig,
24 dlimit::DownloadLimiter, 24 dlimit::DownloadLimiter,
25}; 25};
@@ -33,100 +33,44 @@ pub struct AppState {
33 pub dl_limiter: Arc<Mutex<DownloadLimiter>>, 33 pub dl_limiter: Arc<Mutex<DownloadLimiter>>,
34} 34}
35 35
36fn validate_checksum(oid: Oid, obj: &HeadObjectOutput) -> bool { 36enum ObjectStatus {
37 if let Some(checksum) = obj.checksum_sha256() { 37 ExistsOk { content_length: Option<i64> },
38 if let Ok(checksum) = BASE64_STANDARD.decode(checksum) { 38 ExistsInconsistent,
39 if let Ok(checksum32b) = TryInto::<[u8; 32]>::try_into(checksum) { 39 DoesNotExist,
40 return Oid::from(checksum32b) == oid;
41 }
42 }
43 }
44 true
45} 40}
46 41
47fn validate_size(expected: i64, obj: &HeadObjectOutput) -> bool { 42impl AppState {
48 if let Some(length) = obj.content_length() { 43 async fn check_object(&self, repo: &str, obj: &BatchRequestObject) -> Result<ObjectStatus, ()> {
49 return length == expected; 44 let (oid0, oid1) = (HexByte(obj.oid[0]), HexByte(obj.oid[1]));
50 } 45 let full_path = format!("{repo}/lfs/objects/{}/{}/{}", oid0, oid1, obj.oid);
51 true
52}
53 46
54async fn handle_upload_object( 47 let result = match self
55 state: &AppState, 48 .s3_client
56 repo: &str, 49 .head_object()
57 obj: &BatchRequestObject, 50 .bucket(&self.s3_bucket)
58) -> Option<BatchResponseObject> { 51 .key(full_path)
59 let (oid0, oid1) = (HexByte(obj.oid[0]), HexByte(obj.oid[1])); 52 .checksum_mode(aws_sdk_s3::types::ChecksumMode::Enabled)
60 let full_path = format!("{repo}/lfs/objects/{}/{}/{}", oid0, oid1, obj.oid); 53 .send()
61 54 .await
62 match state 55 {
63 .s3_client 56 Ok(result) => result,
64 .head_object() 57 Err(SdkError::ServiceError(e)) if e.err().is_not_found() => {
65 .bucket(&state.s3_bucket) 58 return Ok(ObjectStatus::DoesNotExist);
66 .key(full_path.clone())
67 .checksum_mode(aws_sdk_s3::types::ChecksumMode::Enabled)
68 .send()
69 .await
70 {
71 Ok(result) => {
72 if validate_size(obj.size, &result) && validate_checksum(obj.oid, &result) {
73 return None;
74 } 59 }
75 } 60 Err(e) => {
76 Err(SdkError::ServiceError(e)) if e.err().is_not_found() => {} 61 println!("Failed to HeadObject (repo {repo}, OID {}): {e}", obj.oid);
77 Err(e) => { 62 return Err(());
78 println!("Failed to HeadObject (repo {repo}, OID {}): {e}", obj.oid); 63 }
79 return Some(BatchResponseObject::error( 64 };
80 obj,
81 StatusCode::INTERNAL_SERVER_ERROR,
82 "Failed to query object information".to_string(),
83 ));
84 }
85 };
86
87 let expires_in = std::time::Duration::from_secs(5 * 60);
88 let expires_at = Utc::now() + expires_in;
89 65
90 let Ok(config) = aws_sdk_s3::presigning::PresigningConfig::expires_in(expires_in) else { 66 // Scaleway actually doesn't provide SHA256 support, but maybe in the future :)
91 return Some(BatchResponseObject::error( 67 if !s3_validate_checksum(obj.oid, &result) || !s3_validate_size(obj.size, &result) {
92 obj, 68 return Ok(ObjectStatus::ExistsInconsistent);
93 StatusCode::INTERNAL_SERVER_ERROR, 69 }
94 "Failed to generate upload URL".to_string(), 70 Ok(ObjectStatus::ExistsOk {
95 )); 71 content_length: result.content_length(),
96 }; 72 })
97 let Ok(presigned) = state 73 }
98 .s3_client
99 .put_object()
100 .bucket(&state.s3_bucket)
101 .key(full_path)
102 .checksum_sha256(obj.oid.to_string())
103 .content_length(obj.size)
104 .presigned(config)
105 .await
106 else {
107 return Some(BatchResponseObject::error(
108 obj,
109 StatusCode::INTERNAL_SERVER_ERROR,
110 "Failed to generate upload URL".to_string(),
111 ));
112 };
113 Some(BatchResponseObject {
114 oid: obj.oid,
115 size: obj.size,
116 authenticated: Some(true),
117 actions: BatchResponseObjectActions {
118 upload: Some(BatchResponseObjectAction {
119 header: presigned
120 .headers()
121 .map(|(k, v)| (k.to_owned(), v.to_owned()))
122 .collect(),
123 expires_at,
124 href: presigned.uri().to_string(),
125 }),
126 ..Default::default()
127 },
128 error: None,
129 })
130} 74}
131 75
132async fn handle_download_object( 76async fn handle_download_object(
@@ -138,42 +82,24 @@ async fn handle_download_object(
138 let (oid0, oid1) = (HexByte(obj.oid[0]), HexByte(obj.oid[1])); 82 let (oid0, oid1) = (HexByte(obj.oid[0]), HexByte(obj.oid[1]));
139 let full_path = format!("{repo}/lfs/objects/{}/{}/{}", oid0, oid1, obj.oid); 83 let full_path = format!("{repo}/lfs/objects/{}/{}/{}", oid0, oid1, obj.oid);
140 84
141 let result = match state 85 let content_length = match state.check_object(repo, obj).await {
142 .s3_client 86 Ok(ObjectStatus::ExistsOk { content_length }) => content_length,
143 .head_object() 87 Ok(_) => {
144 .bucket(&state.s3_bucket)
145 .key(&full_path)
146 .checksum_mode(aws_sdk_s3::types::ChecksumMode::Enabled)
147 .send()
148 .await
149 {
150 Ok(result) => result,
151 Err(e) => {
152 println!("Failed to HeadObject (repo {repo}, OID {}): {e}", obj.oid);
153 return BatchResponseObject::error( 88 return BatchResponseObject::error(
154 obj, 89 obj,
155 StatusCode::INTERNAL_SERVER_ERROR, 90 http::StatusCode::UNPROCESSABLE_ENTITY,
91 "Object corrupted".to_string(),
92 );
93 }
94 Err(_) => {
95 return BatchResponseObject::error(
96 obj,
97 http::StatusCode::INTERNAL_SERVER_ERROR,
156 "Failed to query object information".to_string(), 98 "Failed to query object information".to_string(),
157 ); 99 );
158 } 100 }
159 }; 101 };
160 102
161 // Scaleway actually doesn't provide SHA256 suport, but maybe in the future :)
162 if !validate_checksum(obj.oid, &result) {
163 return BatchResponseObject::error(
164 obj,
165 StatusCode::UNPROCESSABLE_ENTITY,
166 "Object corrupted".to_string(),
167 );
168 }
169 if !validate_size(obj.size, &result) {
170 return BatchResponseObject::error(
171 obj,
172 StatusCode::UNPROCESSABLE_ENTITY,
173 "Incorrect size specified (or object corrupted)".to_string(),
174 );
175 }
176
177 let expires_in = std::time::Duration::from_secs(5 * 60); 103 let expires_in = std::time::Duration::from_secs(5 * 60);
178 let expires_at = Utc::now() + expires_in; 104 let expires_at = Utc::now() + expires_in;
179 105
@@ -181,7 +107,7 @@ async fn handle_download_object(
181 let Ok(config) = aws_sdk_s3::presigning::PresigningConfig::expires_in(expires_in) else { 107 let Ok(config) = aws_sdk_s3::presigning::PresigningConfig::expires_in(expires_in) else {
182 return BatchResponseObject::error( 108 return BatchResponseObject::error(
183 obj, 109 obj,
184 StatusCode::INTERNAL_SERVER_ERROR, 110 http::StatusCode::INTERNAL_SERVER_ERROR,
185 "Failed to generate upload URL".to_string(), 111 "Failed to generate upload URL".to_string(),
186 ); 112 );
187 }; 113 };
@@ -195,7 +121,7 @@ async fn handle_download_object(
195 else { 121 else {
196 return BatchResponseObject::error( 122 return BatchResponseObject::error(
197 obj, 123 obj,
198 StatusCode::INTERNAL_SERVER_ERROR, 124 http::StatusCode::INTERNAL_SERVER_ERROR,
199 "Failed to generate upload URL".to_string(), 125 "Failed to generate upload URL".to_string(),
200 ); 126 );
201 }; 127 };
@@ -218,7 +144,7 @@ async fn handle_download_object(
218 }; 144 };
219 } 145 }
220 146
221 if let Some(content_length) = result.content_length() { 147 if let Some(content_length) = content_length {
222 if content_length > 0 { 148 if content_length > 0 {
223 match state 149 match state
224 .dl_limiter 150 .dl_limiter
@@ -231,7 +157,7 @@ async fn handle_download_object(
231 Ok(false) => { 157 Ok(false) => {
232 return BatchResponseObject::error( 158 return BatchResponseObject::error(
233 obj, 159 obj,
234 StatusCode::SERVICE_UNAVAILABLE, 160 http::StatusCode::SERVICE_UNAVAILABLE,
235 "Public LFS downloads temporarily unavailable".to_string(), 161 "Public LFS downloads temporarily unavailable".to_string(),
236 ); 162 );
237 } 163 }
@@ -239,7 +165,7 @@ async fn handle_download_object(
239 println!("Failed to request {content_length} bytes from download limiter: {e}"); 165 println!("Failed to request {content_length} bytes from download limiter: {e}");
240 return BatchResponseObject::error( 166 return BatchResponseObject::error(
241 obj, 167 obj,
242 StatusCode::INTERNAL_SERVER_ERROR, 168 http::StatusCode::INTERNAL_SERVER_ERROR,
243 "Internal server error".to_string(), 169 "Internal server error".to_string(),
244 ); 170 );
245 } 171 }
@@ -257,18 +183,11 @@ async fn handle_download_object(
257 ) else { 183 ) else {
258 return BatchResponseObject::error( 184 return BatchResponseObject::error(
259 obj, 185 obj,
260 StatusCode::INTERNAL_SERVER_ERROR, 186 http::StatusCode::INTERNAL_SERVER_ERROR,
261 "Internal server error".to_string(), 187 "Internal server error".to_string(),
262 ); 188 );
263 }; 189 };
264 190
265 let upload_path = format!(
266 "{repo}/info/lfs/objects/{}/{}/{}",
267 HexByte(obj.oid[0]),
268 HexByte(obj.oid[1]),
269 obj.oid,
270 );
271
272 BatchResponseObject { 191 BatchResponseObject {
273 oid: obj.oid, 192 oid: obj.oid,
274 size: obj.size, 193 size: obj.size,
@@ -284,7 +203,13 @@ async fn handle_download_object(
284 map 203 map
285 }, 204 },
286 expires_at, 205 expires_at,
287 href: format!("{}/{upload_path}", state.base_url), 206 href: format!(
207 "{}/{repo}/info/lfs/objects/{}/{}/{}",
208 state.base_url,
209 HexByte(obj.oid[0]),
210 HexByte(obj.oid[1]),
211 obj.oid
212 ),
288 }), 213 }),
289 ..Default::default() 214 ..Default::default()
290 }, 215 },
@@ -292,83 +217,6 @@ async fn handle_download_object(
292 } 217 }
293} 218}
294 219
295fn repo_exists(name: &str) -> bool {
296 let Ok(metadata) = std::fs::metadata(name) else {
297 return false;
298 };
299 metadata.is_dir()
300}
301
302fn is_repo_public(name: &str) -> Option<bool> {
303 if !repo_exists(name) {
304 return None;
305 }
306 match std::fs::metadata(format!("{name}/git-daemon-export-ok")) {
307 Ok(metadata) if metadata.is_file() => Some(true),
308 Err(e) if e.kind() == std::io::ErrorKind::NotFound => Some(false),
309 _ => None,
310 }
311}
312
313pub async fn batch(
314 State(state): State<Arc<AppState>>,
315 headers: HeaderMap,
316 RepositoryName(repo): RepositoryName,
317 GitLfsJson(Json(payload)): GitLfsJson<BatchRequest>,
318) -> Response {
319 let Some(public) = is_repo_public(&repo) else {
320 return REPO_NOT_FOUND.into_response();
321 };
322 let Trusted(trusted) = match authorize_batch(
323 &state.authz_conf,
324 &repo,
325 public,
326 payload.operation,
327 &headers,
328 ) {
329 Ok(authn) => authn,
330 Err(e) => return e.into_response(),
331 };
332
333 if !headers
334 .get_all("Accept")
335 .iter()
336 .filter_map(|v| v.to_str().ok())
337 .any(is_git_lfs_json_mimetype)
338 {
339 let message = format!("Expected `{LFS_MIME}` in list of acceptable response media types");
340 return make_error_resp(StatusCode::NOT_ACCEPTABLE, &message).into_response();
341 }
342
343 if payload.hash_algo != HashAlgo::Sha256 {
344 let message = "Unsupported hashing algorithm specified";
345 return make_error_resp(StatusCode::CONFLICT, message).into_response();
346 }
347 if !payload.transfers.is_empty() && !payload.transfers.contains(&TransferAdapter::Basic) {
348 let message = "Unsupported transfer adapter specified (supported: basic)";
349 return make_error_resp(StatusCode::CONFLICT, message).into_response();
350 }
351
352 let mut resp = BatchResponse {
353 transfer: TransferAdapter::Basic,
354 objects: vec![],
355 hash_algo: HashAlgo::Sha256,
356 };
357 for obj in payload.objects {
358 match payload.operation {
359 Operation::Download => resp
360 .objects
361 .push(handle_download_object(&state, &repo, &obj, trusted).await),
362 Operation::Upload => {
363 if let Some(obj_resp) = handle_upload_object(&state, &repo, &obj).await {
364 resp.objects.push(obj_resp);
365 }
366 }
367 };
368 }
369 GitLfsJson(Json(resp)).into_response()
370}
371
372#[derive(Deserialize, Copy, Clone)] 220#[derive(Deserialize, Copy, Clone)]
373#[serde(remote = "Self")] 221#[serde(remote = "Self")]
374pub struct FileParams { 222pub struct FileParams {
@@ -382,11 +230,11 @@ impl<'de> Deserialize<'de> for FileParams {
382 where 230 where
383 D: serde::Deserializer<'de>, 231 D: serde::Deserializer<'de>,
384 { 232 {
385 let unchecked @ FileParams { 233 let unchecked @ Self {
386 oid0: HexByte(oid0), 234 oid0: HexByte(oid0),
387 oid1: HexByte(oid1), 235 oid1: HexByte(oid1),
388 oid, 236 oid,
389 } = FileParams::deserialize(deserializer)?; 237 } = Self::deserialize(deserializer)?;
390 if oid0 != oid.as_bytes()[0] { 238 if oid0 != oid.as_bytes()[0] {
391 return Err(de::Error::custom( 239 return Err(de::Error::custom(
392 "first OID path part does not match first byte of full OID", 240 "first OID path part does not match first byte of full OID",
@@ -401,9 +249,9 @@ impl<'de> Deserialize<'de> for FileParams {
401 } 249 }
402} 250}
403 251
404pub async fn obj_download( 252pub async fn handle_obj_download(
405 State(state): State<Arc<AppState>>, 253 State(state): State<Arc<AppState>>,
406 headers: HeaderMap, 254 headers: http::HeaderMap,
407 RepositoryName(repo): RepositoryName, 255 RepositoryName(repo): RepositoryName,
408 Path(FileParams { oid0, oid1, oid }): Path<FileParams>, 256 Path(FileParams { oid0, oid1, oid }): Path<FileParams>,
409) -> Response { 257) -> Response {
@@ -425,26 +273,26 @@ pub async fn obj_download(
425 Err(e) => { 273 Err(e) => {
426 println!("Failed to GetObject (repo {repo}, OID {oid}): {e}"); 274 println!("Failed to GetObject (repo {repo}, OID {oid}): {e}");
427 return ( 275 return (
428 StatusCode::INTERNAL_SERVER_ERROR, 276 http::StatusCode::INTERNAL_SERVER_ERROR,
429 "Failed to query object information", 277 "Failed to query object information",
430 ) 278 )
431 .into_response(); 279 .into_response();
432 } 280 }
433 }; 281 };
434 282
435 let mut headers = header::HeaderMap::new(); 283 let mut headers = http::header::HeaderMap::new();
436 if let Some(content_type) = result.content_type { 284 if let Some(content_type) = result.content_type {
437 let Ok(header_value) = content_type.try_into() else { 285 let Ok(header_value) = content_type.try_into() else {
438 return ( 286 return (
439 StatusCode::INTERNAL_SERVER_ERROR, 287 http::StatusCode::INTERNAL_SERVER_ERROR,
440 "Object has invalid content type", 288 "Object has invalid content type",
441 ) 289 )
442 .into_response(); 290 .into_response();
443 }; 291 };
444 headers.insert(header::CONTENT_TYPE, header_value); 292 headers.insert(http::header::CONTENT_TYPE, header_value);
445 } 293 }
446 if let Some(content_length) = result.content_length { 294 if let Some(content_length) = result.content_length {
447 headers.insert(header::CONTENT_LENGTH, content_length.into()); 295 headers.insert(http::header::CONTENT_LENGTH, content_length.into());
448 } 296 }
449 297
450 let async_read = result.body.into_async_read(); 298 let async_read = result.body.into_async_read();
@@ -453,3 +301,169 @@ pub async fn obj_download(
453 301
454 (headers, body).into_response() 302 (headers, body).into_response()
455} 303}
304
305async fn handle_upload_object(
306 state: &AppState,
307 repo: &str,
308 obj: &BatchRequestObject,
309) -> Option<BatchResponseObject> {
310 let (oid0, oid1) = (HexByte(obj.oid[0]), HexByte(obj.oid[1]));
311 let full_path = format!("{repo}/lfs/objects/{}/{}/{}", oid0, oid1, obj.oid);
312
313 match state.check_object(repo, obj).await {
314 Ok(ObjectStatus::ExistsOk { .. }) => {
315 return None;
316 }
317 Ok(_) => {}
318 Err(_) => {
319 return Some(BatchResponseObject::error(
320 obj,
321 http::StatusCode::INTERNAL_SERVER_ERROR,
322 "Failed to query object information".to_string(),
323 ));
324 }
325 };
326
327 let expires_in = std::time::Duration::from_secs(5 * 60);
328 let expires_at = Utc::now() + expires_in;
329
330 let Ok(config) = aws_sdk_s3::presigning::PresigningConfig::expires_in(expires_in) else {
331 return Some(BatchResponseObject::error(
332 obj,
333 http::StatusCode::INTERNAL_SERVER_ERROR,
334 "Failed to generate upload URL".to_string(),
335 ));
336 };
337 let Ok(presigned) = state
338 .s3_client
339 .put_object()
340 .bucket(&state.s3_bucket)
341 .key(full_path)
342 .checksum_sha256(s3_encode_checksum(obj.oid))
343 .content_length(obj.size)
344 .presigned(config)
345 .await
346 else {
347 return Some(BatchResponseObject::error(
348 obj,
349 http::StatusCode::INTERNAL_SERVER_ERROR,
350 "Failed to generate upload URL".to_string(),
351 ));
352 };
353 Some(BatchResponseObject {
354 oid: obj.oid,
355 size: obj.size,
356 authenticated: Some(true),
357 actions: BatchResponseObjectActions {
358 upload: Some(BatchResponseObjectAction {
359 header: presigned
360 .headers()
361 .map(|(k, v)| (k.to_owned(), v.to_owned()))
362 .collect(),
363 expires_at,
364 href: presigned.uri().to_string(),
365 }),
366 ..Default::default()
367 },
368 error: None,
369 })
370}
371
372pub async fn handle_batch(
373 State(state): State<Arc<AppState>>,
374 headers: http::HeaderMap,
375 RepositoryName(repo): RepositoryName,
376 GitLfsJson(Json(payload)): GitLfsJson<BatchRequest>,
377) -> Response {
378 let Some(public) = is_repo_public(&repo) else {
379 return REPO_NOT_FOUND.into_response();
380 };
381 let Trusted(trusted) = match authorize_batch(
382 &state.authz_conf,
383 &repo,
384 public,
385 payload.operation,
386 &headers,
387 ) {
388 Ok(authn) => authn,
389 Err(e) => return e.into_response(),
390 };
391
392 if !headers
393 .get_all("Accept")
394 .iter()
395 .filter_map(|v| v.to_str().ok())
396 .any(is_git_lfs_json_mimetype)
397 {
398 let message = format!("Expected `{LFS_MIME}` in list of acceptable response media types");
399 return make_error_resp(http::StatusCode::NOT_ACCEPTABLE, &message).into_response();
400 }
401
402 if payload.hash_algo != HashAlgo::Sha256 {
403 let message = "Unsupported hashing algorithm specified";
404 return make_error_resp(http::StatusCode::CONFLICT, message).into_response();
405 }
406 if !payload.transfers.is_empty() && !payload.transfers.contains(&TransferAdapter::Basic) {
407 let message = "Unsupported transfer adapter specified (supported: basic)";
408 return make_error_resp(http::StatusCode::CONFLICT, message).into_response();
409 }
410
411 let mut resp = BatchResponse {
412 transfer: TransferAdapter::Basic,
413 objects: vec![],
414 hash_algo: HashAlgo::Sha256,
415 };
416 for obj in payload.objects {
417 match payload.operation {
418 Operation::Download => resp
419 .objects
420 .push(handle_download_object(&state, &repo, &obj, trusted).await),
421 Operation::Upload => {
422 if let Some(obj_resp) = handle_upload_object(&state, &repo, &obj).await {
423 resp.objects.push(obj_resp);
424 }
425 }
426 };
427 }
428 GitLfsJson(Json(resp)).into_response()
429}
430
431fn s3_encode_checksum(oid: Oid) -> String {
432 BASE64_STANDARD.encode(oid.as_bytes())
433}
434
435fn s3_validate_checksum(oid: Oid, obj: &HeadObjectOutput) -> bool {
436 if let Some(checksum) = obj.checksum_sha256() {
437 if let Ok(checksum) = BASE64_STANDARD.decode(checksum) {
438 if let Ok(checksum32b) = TryInto::<[u8; 32]>::try_into(checksum) {
439 return Oid::from(checksum32b) == oid;
440 }
441 }
442 }
443 true
444}
445
446fn s3_validate_size(expected: i64, obj: &HeadObjectOutput) -> bool {
447 if let Some(length) = obj.content_length() {
448 return length == expected;
449 }
450 true
451}
452
453fn repo_exists(name: &str) -> bool {
454 let Ok(metadata) = std::fs::metadata(name) else {
455 return false;
456 };
457 metadata.is_dir()
458}
459
460fn is_repo_public(name: &str) -> Option<bool> {
461 if !repo_exists(name) {
462 return None;
463 }
464 match std::fs::metadata(format!("{name}/git-daemon-export-ok")) {
465 Ok(metadata) if metadata.is_file() => Some(true),
466 Err(e) if e.kind() == std::io::ErrorKind::NotFound => Some(false),
467 _ => None,
468 }
469}
diff --git a/gitolfs3-server/src/main.rs b/gitolfs3-server/src/main.rs
index c9911ed..c88de76 100644
--- a/gitolfs3-server/src/main.rs
+++ b/gitolfs3-server/src/main.rs
@@ -9,13 +9,14 @@ use config::Config;
9use dlimit::DownloadLimiter; 9use dlimit::DownloadLimiter;
10 10
11use axum::{ 11use axum::{
12 Router, ServiceExt,
12 extract::OriginalUri, 13 extract::OriginalUri,
13 http::{StatusCode, Uri}, 14 http::{self, Uri},
14 routing::{get, post}, 15 routing::{get, post},
15 Router, ServiceExt,
16}; 16};
17use handler::AppState; 17use handler::{AppState, handle_batch, handle_obj_download};
18use std::{process::ExitCode, sync::Arc}; 18use std::{process::ExitCode, sync::Arc};
19use tokio::net::TcpListener;
19use tower::Layer; 20use tower::Layer;
20 21
21#[tokio::main] 22#[tokio::main]
@@ -39,14 +40,14 @@ async fn main() -> ExitCode {
39 dl_limiter, 40 dl_limiter,
40 }); 41 });
41 let app = Router::new() 42 let app = Router::new()
42 .route("/batch", post(handler::batch)) 43 .route("/batch", post(handle_batch))
43 .route("/:oid0/:oid1/:oid", get(handler::obj_download)) 44 .route("/{oid0}/{oid1}/{oid}", get(handle_obj_download))
44 .with_state(shared_state); 45 .with_state(shared_state);
45 46
46 let middleware = axum::middleware::map_request(rewrite_url); 47 let middleware = axum::middleware::map_request(rewrite_url);
47 let app_with_middleware = middleware.layer(app); 48 let app_with_middleware = middleware.layer(app);
48 49
49 let listener = match tokio::net::TcpListener::bind(conf.listen_addr).await { 50 let listener = match TcpListener::bind(conf.listen_addr).await {
50 Ok(listener) => listener, 51 Ok(listener) => listener,
51 Err(e) => { 52 Err(e) => {
52 println!("Failed to listen: {e}"); 53 println!("Failed to listen: {e}");
@@ -63,25 +64,23 @@ async fn main() -> ExitCode {
63 } 64 }
64} 65}
65 66
66async fn rewrite_url<B>( 67async fn rewrite_url<B>(mut req: http::Request<B>) -> Result<http::Request<B>, http::StatusCode> {
67 mut req: axum::http::Request<B>,
68) -> Result<axum::http::Request<B>, StatusCode> {
69 let uri = req.uri(); 68 let uri = req.uri();
70 let original_uri = OriginalUri(uri.clone()); 69 let original_uri = OriginalUri(uri.clone());
71 70
72 let Some(path_and_query) = uri.path_and_query() else { 71 let Some(path_and_query) = uri.path_and_query() else {
73 // L @ no path & query 72 // L @ no path & query
74 return Err(StatusCode::BAD_REQUEST); 73 return Err(http::StatusCode::BAD_REQUEST);
75 }; 74 };
76 let Some((repo, path)) = path_and_query.path().split_once("/info/lfs/objects") else { 75 let Some((repo, path)) = path_and_query.path().split_once("/info/lfs/objects") else {
77 return Err(StatusCode::NOT_FOUND); 76 return Err(http::StatusCode::NOT_FOUND);
78 }; 77 };
79 let repo = repo 78 let repo = repo
80 .trim_start_matches('/') 79 .trim_start_matches('/')
81 .trim_end_matches('/') 80 .trim_end_matches('/')
82 .to_string(); 81 .to_string();
83 if !path.starts_with('/') || !repo.ends_with(".git") { 82 if !path.starts_with('/') || !repo.ends_with(".git") {
84 return Err(StatusCode::NOT_FOUND); 83 return Err(http::StatusCode::NOT_FOUND);
85 } 84 }
86 85
87 let mut parts = uri.clone().into_parts(); 86 let mut parts = uri.clone().into_parts();
@@ -90,7 +89,7 @@ async fn rewrite_url<B>(
90 Some(q) => format!("{path}?{q}").try_into().ok(), 89 Some(q) => format!("{path}?{q}").try_into().ok(),
91 }; 90 };
92 let Ok(new_uri) = Uri::from_parts(parts) else { 91 let Ok(new_uri) = Uri::from_parts(parts) else {
93 return Err(StatusCode::INTERNAL_SERVER_ERROR); 92 return Err(http::StatusCode::INTERNAL_SERVER_ERROR);
94 }; 93 };
95 94
96 *req.uri_mut() = new_uri; 95 *req.uri_mut() = new_uri;
diff --git a/gitolfs3-shell/Cargo.toml b/gitolfs3-shell/Cargo.toml
index dd348ce..3442081 100644
--- a/gitolfs3-shell/Cargo.toml
+++ b/gitolfs3-shell/Cargo.toml
@@ -1,7 +1,7 @@
1[package] 1[package]
2name = "gitolfs3-shell" 2name = "gitolfs3-shell"
3version = "0.1.0" 3version = "0.1.0"
4edition = "2021" 4edition = "2024"
5license = "MIT" 5license = "MIT"
6 6
7[dependencies] 7[dependencies]