aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1801
-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.rs16
-rw-r--r--gitolfs3-server/Cargo.toml14
-rw-r--r--gitolfs3-server/src/api.rs223
-rw-r--r--gitolfs3-server/src/authz.rs84
-rw-r--r--gitolfs3-server/src/config.rs140
-rw-r--r--gitolfs3-server/src/dlimit.rs2
-rw-r--r--gitolfs3-server/src/handler.rs511
-rw-r--r--gitolfs3-server/src/main.rs25
-rw-r--r--gitolfs3-shell/Cargo.toml2
16 files changed, 1814 insertions, 1118 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 00f856e..3f2abe7 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.1"
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 = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
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.99"
65source = "registry+https://github.com/rust-lang/crates.io-index" 53source = "registry+https://github.com/rust-lang/crates.io-index"
66checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" 54checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100"
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.5.0"
82source = "registry+https://github.com/rust-lang/crates.io-index" 65source = "registry+https://github.com/rust-lang/crates.io-index"
83checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" 66checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
84 67
85[[package]] 68[[package]]
86name = "aws-config" 69name = "aws-config"
87version = "1.2.1" 70version = "1.8.6"
88source = "registry+https://github.com/rust-lang/crates.io-index" 71source = "registry+https://github.com/rust-lang/crates.io-index"
89checksum = "b2a4707646259764ab59fd9a50e9de2e92c637b28b36285d6f6fa030e915fbd9" 72checksum = "8bc1b40fb26027769f16960d2f4a6bc20c4bb755d403e552c8c1a73af433c246"
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.6"
119source = "registry+https://github.com/rust-lang/crates.io-index" 101source = "registry+https://github.com/rust-lang/crates.io-index"
120checksum = "e16838e6c9e12125face1c1eff1343c75e3ff540de98ff7ebd61874a89bcfeb9" 102checksum = "d025db5d9f52cbc413b167136afb3d8aeea708c0d8884783cf6253be5e22f6f2"
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.3"
113source = "registry+https://github.com/rust-lang/crates.io-index"
114checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba"
115dependencies = [
116 "aws-lc-sys",
117 "zeroize",
118]
119
120[[package]]
121name = "aws-lc-sys"
122version = "0.30.0"
123source = "registry+https://github.com/rust-lang/crates.io-index"
124checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff"
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.10"
131source = "registry+https://github.com/rust-lang/crates.io-index" 136source = "registry+https://github.com/rust-lang/crates.io-index"
132checksum = "f4963ac9ff2d33a4231b3806c1c69f578f221a9cabb89ad2bde62ce2b442c8a7" 137checksum = "c034a1bc1d70e16e7f4e4caf7e9f7693e4c9c24cd91cf17c2a0b21abaebc7c8b"
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",
@@ -151,11 +157,10 @@ dependencies = [
151 157
152[[package]] 158[[package]]
153name = "aws-sdk-s3" 159name = "aws-sdk-s3"
154version = "1.24.0" 160version = "1.104.0"
155source = "registry+https://github.com/rust-lang/crates.io-index" 161source = "registry+https://github.com/rust-lang/crates.io-index"
156checksum = "7f522b68eb0294c59f7beb0defa30e84fed24ebc50ee219e111d6c33eaea96a8" 162checksum = "38c488cd6abb0ec9811c401894191932e941c5f91dc226043edacd0afa1634bc"
157dependencies = [ 163dependencies = [
158 "ahash",
159 "aws-credential-types", 164 "aws-credential-types",
160 "aws-runtime", 165 "aws-runtime",
161 "aws-sigv4", 166 "aws-sigv4",
@@ -174,9 +179,9 @@ dependencies = [
174 "hex", 179 "hex",
175 "hmac", 180 "hmac",
176 "http 0.2.12", 181 "http 0.2.12",
182 "http 1.3.1",
177 "http-body 0.4.6", 183 "http-body 0.4.6",
178 "lru", 184 "lru",
179 "once_cell",
180 "percent-encoding", 185 "percent-encoding",
181 "regex-lite", 186 "regex-lite",
182 "sha2", 187 "sha2",
@@ -186,9 +191,9 @@ dependencies = [
186 191
187[[package]] 192[[package]]
188name = "aws-sdk-sso" 193name = "aws-sdk-sso"
189version = "1.21.0" 194version = "1.83.0"
190source = "registry+https://github.com/rust-lang/crates.io-index" 195source = "registry+https://github.com/rust-lang/crates.io-index"
191checksum = "3d70fb493f4183f5102d8a8d0cc9b57aec29a762f55c0e7bf527e0f7177bb408" 196checksum = "643cd43af212d2a1c4dedff6f044d7e1961e5d9e7cfe773d70f31d9842413886"
192dependencies = [ 197dependencies = [
193 "aws-credential-types", 198 "aws-credential-types",
194 "aws-runtime", 199 "aws-runtime",
@@ -200,17 +205,17 @@ dependencies = [
200 "aws-smithy-types", 205 "aws-smithy-types",
201 "aws-types", 206 "aws-types",
202 "bytes", 207 "bytes",
208 "fastrand",
203 "http 0.2.12", 209 "http 0.2.12",
204 "once_cell",
205 "regex-lite", 210 "regex-lite",
206 "tracing", 211 "tracing",
207] 212]
208 213
209[[package]] 214[[package]]
210name = "aws-sdk-ssooidc" 215name = "aws-sdk-ssooidc"
211version = "1.21.0" 216version = "1.84.0"
212source = "registry+https://github.com/rust-lang/crates.io-index" 217source = "registry+https://github.com/rust-lang/crates.io-index"
213checksum = "de3f37549b3e38b7ea5efd419d4d7add6ea1e55223506eb0b4fef9d25e7cc90d" 218checksum = "20ec4a95bd48e0db7a424356a161f8d87bd6a4f0af37204775f0da03d9e39fc3"
214dependencies = [ 219dependencies = [
215 "aws-credential-types", 220 "aws-credential-types",
216 "aws-runtime", 221 "aws-runtime",
@@ -222,17 +227,17 @@ dependencies = [
222 "aws-smithy-types", 227 "aws-smithy-types",
223 "aws-types", 228 "aws-types",
224 "bytes", 229 "bytes",
230 "fastrand",
225 "http 0.2.12", 231 "http 0.2.12",
226 "once_cell",
227 "regex-lite", 232 "regex-lite",
228 "tracing", 233 "tracing",
229] 234]
230 235
231[[package]] 236[[package]]
232name = "aws-sdk-sts" 237name = "aws-sdk-sts"
233version = "1.21.0" 238version = "1.85.0"
234source = "registry+https://github.com/rust-lang/crates.io-index" 239source = "registry+https://github.com/rust-lang/crates.io-index"
235checksum = "3b2ff219a5d4b795cd33251c19dbe9c4b401f2b2cbe513e07c76ada644eaf34e" 240checksum = "410309ad0df4606bc721aff0d89c3407682845453247213a0ccc5ff8801ee107"
236dependencies = [ 241dependencies = [
237 "aws-credential-types", 242 "aws-credential-types",
238 "aws-runtime", 243 "aws-runtime",
@@ -245,17 +250,17 @@ dependencies = [
245 "aws-smithy-types", 250 "aws-smithy-types",
246 "aws-smithy-xml", 251 "aws-smithy-xml",
247 "aws-types", 252 "aws-types",
253 "fastrand",
248 "http 0.2.12", 254 "http 0.2.12",
249 "once_cell",
250 "regex-lite", 255 "regex-lite",
251 "tracing", 256 "tracing",
252] 257]
253 258
254[[package]] 259[[package]]
255name = "aws-sigv4" 260name = "aws-sigv4"
256version = "1.2.1" 261version = "1.3.4"
257source = "registry+https://github.com/rust-lang/crates.io-index" 262source = "registry+https://github.com/rust-lang/crates.io-index"
258checksum = "58b56f1cbe6fd4d0c2573df72868f20ab1c125ca9c9dbce17927a463433a2e57" 263checksum = "084c34162187d39e3740cb635acd73c4e3a551a36146ad6fe8883c929c9f876c"
259dependencies = [ 264dependencies = [
260 "aws-credential-types", 265 "aws-credential-types",
261 "aws-smithy-eventstream", 266 "aws-smithy-eventstream",
@@ -268,8 +273,7 @@ dependencies = [
268 "hex", 273 "hex",
269 "hmac", 274 "hmac",
270 "http 0.2.12", 275 "http 0.2.12",
271 "http 1.1.0", 276 "http 1.3.1",
272 "once_cell",
273 "p256", 277 "p256",
274 "percent-encoding", 278 "percent-encoding",
275 "ring", 279 "ring",
@@ -282,9 +286,9 @@ dependencies = [
282 286
283[[package]] 287[[package]]
284name = "aws-smithy-async" 288name = "aws-smithy-async"
285version = "1.2.1" 289version = "1.2.5"
286source = "registry+https://github.com/rust-lang/crates.io-index" 290source = "registry+https://github.com/rust-lang/crates.io-index"
287checksum = "62220bc6e97f946ddd51b5f1361f78996e704677afc518a4ff66b7a72ea1378c" 291checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c"
288dependencies = [ 292dependencies = [
289 "futures-util", 293 "futures-util",
290 "pin-project-lite", 294 "pin-project-lite",
@@ -293,15 +297,14 @@ dependencies = [
293 297
294[[package]] 298[[package]]
295name = "aws-smithy-checksums" 299name = "aws-smithy-checksums"
296version = "0.60.7" 300version = "0.63.8"
297source = "registry+https://github.com/rust-lang/crates.io-index" 301source = "registry+https://github.com/rust-lang/crates.io-index"
298checksum = "83fa43bc04a6b2441968faeab56e68da3812f978a670a5db32accbdcafddd12f" 302checksum = "56d2df0314b8e307995a3b86d44565dfe9de41f876901a7d71886c756a25979f"
299dependencies = [ 303dependencies = [
300 "aws-smithy-http", 304 "aws-smithy-http",
301 "aws-smithy-types", 305 "aws-smithy-types",
302 "bytes", 306 "bytes",
303 "crc32c", 307 "crc-fast",
304 "crc32fast",
305 "hex", 308 "hex",
306 "http 0.2.12", 309 "http 0.2.12",
307 "http-body 0.4.6", 310 "http-body 0.4.6",
@@ -314,9 +317,9 @@ dependencies = [
314 317
315[[package]] 318[[package]]
316name = "aws-smithy-eventstream" 319name = "aws-smithy-eventstream"
317version = "0.60.4" 320version = "0.60.11"
318source = "registry+https://github.com/rust-lang/crates.io-index" 321source = "registry+https://github.com/rust-lang/crates.io-index"
319checksum = "e6363078f927f612b970edf9d1903ef5cef9a64d1e8423525ebb1f0a1633c858" 322checksum = "182b03393e8c677347fb5705a04a9392695d47d20ef0a2f8cfe28c8e6b9b9778"
320dependencies = [ 323dependencies = [
321 "aws-smithy-types", 324 "aws-smithy-types",
322 "bytes", 325 "bytes",
@@ -325,9 +328,9 @@ dependencies = [
325 328
326[[package]] 329[[package]]
327name = "aws-smithy-http" 330name = "aws-smithy-http"
328version = "0.60.8" 331version = "0.62.3"
329source = "registry+https://github.com/rust-lang/crates.io-index" 332source = "registry+https://github.com/rust-lang/crates.io-index"
330checksum = "4a7de001a1b9a25601016d8057ea16e31a45fdca3751304c8edf4ad72e706c08" 333checksum = "7c4dacf2d38996cf729f55e7a762b30918229917eca115de45dfa8dfb97796c9"
331dependencies = [ 334dependencies = [
332 "aws-smithy-eventstream", 335 "aws-smithy-eventstream",
333 "aws-smithy-runtime-api", 336 "aws-smithy-runtime-api",
@@ -336,8 +339,8 @@ dependencies = [
336 "bytes-utils", 339 "bytes-utils",
337 "futures-core", 340 "futures-core",
338 "http 0.2.12", 341 "http 0.2.12",
342 "http 1.3.1",
339 "http-body 0.4.6", 343 "http-body 0.4.6",
340 "once_cell",
341 "percent-encoding", 344 "percent-encoding",
342 "pin-project-lite", 345 "pin-project-lite",
343 "pin-utils", 346 "pin-utils",
@@ -345,15 +348,54 @@ dependencies = [
345] 348]
346 349
347[[package]] 350[[package]]
351name = "aws-smithy-http-client"
352version = "1.1.1"
353source = "registry+https://github.com/rust-lang/crates.io-index"
354checksum = "147e8eea63a40315d704b97bf9bc9b8c1402ae94f89d5ad6f7550d963309da1b"
355dependencies = [
356 "aws-smithy-async",
357 "aws-smithy-runtime-api",
358 "aws-smithy-types",
359 "h2 0.3.27",
360 "h2 0.4.12",
361 "http 0.2.12",
362 "http 1.3.1",
363 "http-body 0.4.6",
364 "hyper 0.14.32",
365 "hyper 1.7.0",
366 "hyper-rustls 0.24.2",
367 "hyper-rustls 0.27.7",
368 "hyper-util",
369 "pin-project-lite",
370 "rustls 0.21.12",
371 "rustls 0.23.31",
372 "rustls-native-certs 0.8.1",
373 "rustls-pki-types",
374 "tokio",
375 "tokio-rustls 0.26.2",
376 "tower",
377 "tracing",
378]
379
380[[package]]
348name = "aws-smithy-json" 381name = "aws-smithy-json"
349version = "0.60.7" 382version = "0.61.5"
350source = "registry+https://github.com/rust-lang/crates.io-index" 383source = "registry+https://github.com/rust-lang/crates.io-index"
351checksum = "4683df9469ef09468dad3473d129960119a0d3593617542b7d52086c8486f2d6" 384checksum = "eaa31b350998e703e9826b2104dd6f63be0508666e1aba88137af060e8944047"
352dependencies = [ 385dependencies = [
353 "aws-smithy-types", 386 "aws-smithy-types",
354] 387]
355 388
356[[package]] 389[[package]]
390name = "aws-smithy-observability"
391version = "0.1.3"
392source = "registry+https://github.com/rust-lang/crates.io-index"
393checksum = "9364d5989ac4dd918e5cc4c4bdcc61c9be17dcd2586ea7f69e348fc7c6cab393"
394dependencies = [
395 "aws-smithy-runtime-api",
396]
397
398[[package]]
357name = "aws-smithy-query" 399name = "aws-smithy-query"
358version = "0.60.7" 400version = "0.60.7"
359source = "registry+https://github.com/rust-lang/crates.io-index" 401source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -365,41 +407,39 @@ dependencies = [
365 407
366[[package]] 408[[package]]
367name = "aws-smithy-runtime" 409name = "aws-smithy-runtime"
368version = "1.3.1" 410version = "1.9.1"
369source = "registry+https://github.com/rust-lang/crates.io-index" 411source = "registry+https://github.com/rust-lang/crates.io-index"
370checksum = "44e7945379821074549168917e89e60630647e186a69243248f08c6d168b975a" 412checksum = "d3946acbe1ead1301ba6862e712c7903ca9bb230bdf1fbd1b5ac54158ef2ab1f"
371dependencies = [ 413dependencies = [
372 "aws-smithy-async", 414 "aws-smithy-async",
373 "aws-smithy-http", 415 "aws-smithy-http",
416 "aws-smithy-http-client",
417 "aws-smithy-observability",
374 "aws-smithy-runtime-api", 418 "aws-smithy-runtime-api",
375 "aws-smithy-types", 419 "aws-smithy-types",
376 "bytes", 420 "bytes",
377 "fastrand", 421 "fastrand",
378 "h2",
379 "http 0.2.12", 422 "http 0.2.12",
423 "http 1.3.1",
380 "http-body 0.4.6", 424 "http-body 0.4.6",
381 "http-body 1.0.0", 425 "http-body 1.0.1",
382 "hyper 0.14.28",
383 "hyper-rustls",
384 "once_cell",
385 "pin-project-lite", 426 "pin-project-lite",
386 "pin-utils", 427 "pin-utils",
387 "rustls",
388 "tokio", 428 "tokio",
389 "tracing", 429 "tracing",
390] 430]
391 431
392[[package]] 432[[package]]
393name = "aws-smithy-runtime-api" 433name = "aws-smithy-runtime-api"
394version = "1.4.0" 434version = "1.9.0"
395source = "registry+https://github.com/rust-lang/crates.io-index" 435source = "registry+https://github.com/rust-lang/crates.io-index"
396checksum = "4cc56a5c96ec741de6c5e6bf1ce6948be969d6506dfa9c39cffc284e31e4979b" 436checksum = "07f5e0fc8a6b3f2303f331b94504bbf754d85488f402d6f1dd7a6080f99afe56"
397dependencies = [ 437dependencies = [
398 "aws-smithy-async", 438 "aws-smithy-async",
399 "aws-smithy-types", 439 "aws-smithy-types",
400 "bytes", 440 "bytes",
401 "http 0.2.12", 441 "http 0.2.12",
402 "http 1.1.0", 442 "http 1.3.1",
403 "pin-project-lite", 443 "pin-project-lite",
404 "tokio", 444 "tokio",
405 "tracing", 445 "tracing",
@@ -408,18 +448,18 @@ dependencies = [
408 448
409[[package]] 449[[package]]
410name = "aws-smithy-types" 450name = "aws-smithy-types"
411version = "1.1.8" 451version = "1.3.2"
412source = "registry+https://github.com/rust-lang/crates.io-index" 452source = "registry+https://github.com/rust-lang/crates.io-index"
413checksum = "abe14dceea1e70101d38fbf2a99e6a34159477c0fb95e68e05c66bd7ae4c3729" 453checksum = "d498595448e43de7f4296b7b7a18a8a02c61ec9349128c80a368f7c3b4ab11a8"
414dependencies = [ 454dependencies = [
415 "base64-simd", 455 "base64-simd",
416 "bytes", 456 "bytes",
417 "bytes-utils", 457 "bytes-utils",
418 "futures-core", 458 "futures-core",
419 "http 0.2.12", 459 "http 0.2.12",
420 "http 1.1.0", 460 "http 1.3.1",
421 "http-body 0.4.6", 461 "http-body 0.4.6",
422 "http-body 1.0.0", 462 "http-body 1.0.1",
423 "http-body-util", 463 "http-body-util",
424 "itoa", 464 "itoa",
425 "num-integer", 465 "num-integer",
@@ -434,42 +474,41 @@ dependencies = [
434 474
435[[package]] 475[[package]]
436name = "aws-smithy-xml" 476name = "aws-smithy-xml"
437version = "0.60.8" 477version = "0.60.10"
438source = "registry+https://github.com/rust-lang/crates.io-index" 478source = "registry+https://github.com/rust-lang/crates.io-index"
439checksum = "d123fbc2a4adc3c301652ba8e149bf4bc1d1725affb9784eb20c953ace06bf55" 479checksum = "3db87b96cb1b16c024980f133968d52882ca0daaee3a086c6decc500f6c99728"
440dependencies = [ 480dependencies = [
441 "xmlparser", 481 "xmlparser",
442] 482]
443 483
444[[package]] 484[[package]]
445name = "aws-types" 485name = "aws-types"
446version = "1.2.0" 486version = "1.3.8"
447source = "registry+https://github.com/rust-lang/crates.io-index" 487source = "registry+https://github.com/rust-lang/crates.io-index"
448checksum = "5a43b56df2c529fe44cb4d92bd64d0479883fb9608ff62daede4df5405381814" 488checksum = "b069d19bf01e46298eaedd7c6f283fe565a59263e53eebec945f3e6398f42390"
449dependencies = [ 489dependencies = [
450 "aws-credential-types", 490 "aws-credential-types",
451 "aws-smithy-async", 491 "aws-smithy-async",
452 "aws-smithy-runtime-api", 492 "aws-smithy-runtime-api",
453 "aws-smithy-types", 493 "aws-smithy-types",
454 "http 0.2.12",
455 "rustc_version", 494 "rustc_version",
456 "tracing", 495 "tracing",
457] 496]
458 497
459[[package]] 498[[package]]
460name = "axum" 499name = "axum"
461version = "0.7.5" 500version = "0.8.4"
462source = "registry+https://github.com/rust-lang/crates.io-index" 501source = "registry+https://github.com/rust-lang/crates.io-index"
463checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" 502checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5"
464dependencies = [ 503dependencies = [
465 "async-trait",
466 "axum-core", 504 "axum-core",
467 "bytes", 505 "bytes",
506 "form_urlencoded",
468 "futures-util", 507 "futures-util",
469 "http 1.1.0", 508 "http 1.3.1",
470 "http-body 1.0.0", 509 "http-body 1.0.1",
471 "http-body-util", 510 "http-body-util",
472 "hyper 1.3.1", 511 "hyper 1.7.0",
473 "hyper-util", 512 "hyper-util",
474 "itoa", 513 "itoa",
475 "matchit", 514 "matchit",
@@ -482,7 +521,7 @@ dependencies = [
482 "serde_json", 521 "serde_json",
483 "serde_path_to_error", 522 "serde_path_to_error",
484 "serde_urlencoded", 523 "serde_urlencoded",
485 "sync_wrapper 1.0.1", 524 "sync_wrapper",
486 "tokio", 525 "tokio",
487 "tower", 526 "tower",
488 "tower-layer", 527 "tower-layer",
@@ -492,20 +531,19 @@ dependencies = [
492 531
493[[package]] 532[[package]]
494name = "axum-core" 533name = "axum-core"
495version = "0.4.3" 534version = "0.5.2"
496source = "registry+https://github.com/rust-lang/crates.io-index" 535source = "registry+https://github.com/rust-lang/crates.io-index"
497checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" 536checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6"
498dependencies = [ 537dependencies = [
499 "async-trait",
500 "bytes", 538 "bytes",
501 "futures-util", 539 "futures-core",
502 "http 1.1.0", 540 "http 1.3.1",
503 "http-body 1.0.0", 541 "http-body 1.0.1",
504 "http-body-util", 542 "http-body-util",
505 "mime", 543 "mime",
506 "pin-project-lite", 544 "pin-project-lite",
507 "rustversion", 545 "rustversion",
508 "sync_wrapper 0.1.2", 546 "sync_wrapper",
509 "tower-layer", 547 "tower-layer",
510 "tower-service", 548 "tower-service",
511 "tracing", 549 "tracing",
@@ -513,17 +551,17 @@ dependencies = [
513 551
514[[package]] 552[[package]]
515name = "backtrace" 553name = "backtrace"
516version = "0.3.71" 554version = "0.3.75"
517source = "registry+https://github.com/rust-lang/crates.io-index" 555source = "registry+https://github.com/rust-lang/crates.io-index"
518checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" 556checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
519dependencies = [ 557dependencies = [
520 "addr2line", 558 "addr2line",
521 "cc",
522 "cfg-if", 559 "cfg-if",
523 "libc", 560 "libc",
524 "miniz_oxide", 561 "miniz_oxide",
525 "object", 562 "object",
526 "rustc-demangle", 563 "rustc-demangle",
564 "windows-targets 0.52.6",
527] 565]
528 566
529[[package]] 567[[package]]
@@ -539,6 +577,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
539checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 577checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
540 578
541[[package]] 579[[package]]
580name = "base64"
581version = "0.22.1"
582source = "registry+https://github.com/rust-lang/crates.io-index"
583checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
584
585[[package]]
542name = "base64-simd" 586name = "base64-simd"
543version = "0.8.0" 587version = "0.8.0"
544source = "registry+https://github.com/rust-lang/crates.io-index" 588source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -550,21 +594,38 @@ dependencies = [
550 594
551[[package]] 595[[package]]
552name = "base64ct" 596name = "base64ct"
553version = "1.6.0" 597version = "1.8.0"
554source = "registry+https://github.com/rust-lang/crates.io-index" 598source = "registry+https://github.com/rust-lang/crates.io-index"
555checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 599checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba"
556 600
557[[package]] 601[[package]]
558name = "bitflags" 602name = "bindgen"
559version = "1.3.2" 603version = "0.69.5"
560source = "registry+https://github.com/rust-lang/crates.io-index" 604source = "registry+https://github.com/rust-lang/crates.io-index"
561checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 605checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088"
606dependencies = [
607 "bitflags",
608 "cexpr",
609 "clang-sys",
610 "itertools",
611 "lazy_static",
612 "lazycell",
613 "log",
614 "prettyplease",
615 "proc-macro2",
616 "quote",
617 "regex",
618 "rustc-hash",
619 "shlex",
620 "syn",
621 "which",
622]
562 623
563[[package]] 624[[package]]
564name = "bitflags" 625name = "bitflags"
565version = "2.5.0" 626version = "2.9.3"
566source = "registry+https://github.com/rust-lang/crates.io-index" 627source = "registry+https://github.com/rust-lang/crates.io-index"
567checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" 628checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d"
568 629
569[[package]] 630[[package]]
570name = "block-buffer" 631name = "block-buffer"
@@ -577,15 +638,15 @@ dependencies = [
577 638
578[[package]] 639[[package]]
579name = "bumpalo" 640name = "bumpalo"
580version = "3.16.0" 641version = "3.19.0"
581source = "registry+https://github.com/rust-lang/crates.io-index" 642source = "registry+https://github.com/rust-lang/crates.io-index"
582checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 643checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
583 644
584[[package]] 645[[package]]
585name = "bytes" 646name = "bytes"
586version = "1.6.0" 647version = "1.10.1"
587source = "registry+https://github.com/rust-lang/crates.io-index" 648source = "registry+https://github.com/rust-lang/crates.io-index"
588checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" 649checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
589 650
590[[package]] 651[[package]]
591name = "bytes-utils" 652name = "bytes-utils"
@@ -599,21 +660,36 @@ dependencies = [
599 660
600[[package]] 661[[package]]
601name = "cc" 662name = "cc"
602version = "1.0.95" 663version = "1.2.35"
603source = "registry+https://github.com/rust-lang/crates.io-index" 664source = "registry+https://github.com/rust-lang/crates.io-index"
604checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" 665checksum = "590f9024a68a8c40351881787f1934dc11afd69090f5edb6831464694d836ea3"
666dependencies = [
667 "find-msvc-tools",
668 "jobserver",
669 "libc",
670 "shlex",
671]
672
673[[package]]
674name = "cexpr"
675version = "0.6.0"
676source = "registry+https://github.com/rust-lang/crates.io-index"
677checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
678dependencies = [
679 "nom",
680]
605 681
606[[package]] 682[[package]]
607name = "cfg-if" 683name = "cfg-if"
608version = "1.0.0" 684version = "1.0.3"
609source = "registry+https://github.com/rust-lang/crates.io-index" 685source = "registry+https://github.com/rust-lang/crates.io-index"
610checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 686checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9"
611 687
612[[package]] 688[[package]]
613name = "chrono" 689name = "chrono"
614version = "0.4.38" 690version = "0.4.41"
615source = "registry+https://github.com/rust-lang/crates.io-index" 691source = "registry+https://github.com/rust-lang/crates.io-index"
616checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" 692checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
617dependencies = [ 693dependencies = [
618 "android-tzdata", 694 "android-tzdata",
619 "iana-time-zone", 695 "iana-time-zone",
@@ -621,7 +697,27 @@ dependencies = [
621 "num-traits", 697 "num-traits",
622 "serde", 698 "serde",
623 "wasm-bindgen", 699 "wasm-bindgen",
624 "windows-targets 0.52.5", 700 "windows-link",
701]
702
703[[package]]
704name = "clang-sys"
705version = "1.8.1"
706source = "registry+https://github.com/rust-lang/crates.io-index"
707checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
708dependencies = [
709 "glob",
710 "libc",
711 "libloading",
712]
713
714[[package]]
715name = "cmake"
716version = "0.1.54"
717source = "registry+https://github.com/rust-lang/crates.io-index"
718checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0"
719dependencies = [
720 "cc",
625] 721]
626 722
627[[package]] 723[[package]]
@@ -641,34 +737,63 @@ dependencies = [
641] 737]
642 738
643[[package]] 739[[package]]
740name = "core-foundation"
741version = "0.10.1"
742source = "registry+https://github.com/rust-lang/crates.io-index"
743checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
744dependencies = [
745 "core-foundation-sys",
746 "libc",
747]
748
749[[package]]
644name = "core-foundation-sys" 750name = "core-foundation-sys"
645version = "0.8.6" 751version = "0.8.7"
646source = "registry+https://github.com/rust-lang/crates.io-index" 752source = "registry+https://github.com/rust-lang/crates.io-index"
647checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 753checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
648 754
649[[package]] 755[[package]]
650name = "cpufeatures" 756name = "cpufeatures"
651version = "0.2.12" 757version = "0.2.17"
652source = "registry+https://github.com/rust-lang/crates.io-index" 758source = "registry+https://github.com/rust-lang/crates.io-index"
653checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 759checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
654dependencies = [ 760dependencies = [
655 "libc", 761 "libc",
656] 762]
657 763
658[[package]] 764[[package]]
659name = "crc32c" 765name = "crc"
660version = "0.6.5" 766version = "3.3.0"
661source = "registry+https://github.com/rust-lang/crates.io-index" 767source = "registry+https://github.com/rust-lang/crates.io-index"
662checksum = "89254598aa9b9fa608de44b3ae54c810f0f06d755e24c50177f1f8f31ff50ce2" 768checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675"
663dependencies = [ 769dependencies = [
664 "rustc_version", 770 "crc-catalog",
771]
772
773[[package]]
774name = "crc-catalog"
775version = "2.4.0"
776source = "registry+https://github.com/rust-lang/crates.io-index"
777checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
778
779[[package]]
780name = "crc-fast"
781version = "1.3.0"
782source = "registry+https://github.com/rust-lang/crates.io-index"
783checksum = "6bf62af4cc77d8fe1c22dde4e721d87f2f54056139d8c412e1366b740305f56f"
784dependencies = [
785 "crc",
786 "digest",
787 "libc",
788 "rand",
789 "regex",
665] 790]
666 791
667[[package]] 792[[package]]
668name = "crc32fast" 793name = "crc32fast"
669version = "1.4.0" 794version = "1.5.0"
670source = "registry+https://github.com/rust-lang/crates.io-index" 795source = "registry+https://github.com/rust-lang/crates.io-index"
671checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" 796checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
672dependencies = [ 797dependencies = [
673 "cfg-if", 798 "cfg-if",
674] 799]
@@ -680,7 +805,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
680checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" 805checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef"
681dependencies = [ 806dependencies = [
682 "generic-array", 807 "generic-array",
683 "rand_core", 808 "rand_core 0.6.4",
684 "subtle", 809 "subtle",
685 "zeroize", 810 "zeroize",
686] 811]
@@ -691,7 +816,7 @@ version = "0.5.5"
691source = "registry+https://github.com/rust-lang/crates.io-index" 816source = "registry+https://github.com/rust-lang/crates.io-index"
692checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" 817checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76"
693dependencies = [ 818dependencies = [
694 "rand_core", 819 "rand_core 0.6.4",
695 "subtle", 820 "subtle",
696] 821]
697 822
@@ -717,9 +842,9 @@ dependencies = [
717 842
718[[package]] 843[[package]]
719name = "deranged" 844name = "deranged"
720version = "0.3.11" 845version = "0.5.3"
721source = "registry+https://github.com/rust-lang/crates.io-index" 846source = "registry+https://github.com/rust-lang/crates.io-index"
722checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 847checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc"
723dependencies = [ 848dependencies = [
724 "powerfmt", 849 "powerfmt",
725] 850]
@@ -736,6 +861,23 @@ dependencies = [
736] 861]
737 862
738[[package]] 863[[package]]
864name = "displaydoc"
865version = "0.2.5"
866source = "registry+https://github.com/rust-lang/crates.io-index"
867checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
868dependencies = [
869 "proc-macro2",
870 "quote",
871 "syn",
872]
873
874[[package]]
875name = "dunce"
876version = "1.0.5"
877source = "registry+https://github.com/rust-lang/crates.io-index"
878checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
879
880[[package]]
739name = "ecdsa" 881name = "ecdsa"
740version = "0.14.8" 882version = "0.14.8"
741source = "registry+https://github.com/rust-lang/crates.io-index" 883source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -749,9 +891,9 @@ dependencies = [
749 891
750[[package]] 892[[package]]
751name = "either" 893name = "either"
752version = "1.11.0" 894version = "1.15.0"
753source = "registry+https://github.com/rust-lang/crates.io-index" 895source = "registry+https://github.com/rust-lang/crates.io-index"
754checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" 896checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
755 897
756[[package]] 898[[package]]
757name = "elliptic-curve" 899name = "elliptic-curve"
@@ -767,7 +909,7 @@ dependencies = [
767 "generic-array", 909 "generic-array",
768 "group", 910 "group",
769 "pkcs8", 911 "pkcs8",
770 "rand_core", 912 "rand_core 0.6.4",
771 "sec1", 913 "sec1",
772 "subtle", 914 "subtle",
773 "zeroize", 915 "zeroize",
@@ -775,15 +917,25 @@ dependencies = [
775 917
776[[package]] 918[[package]]
777name = "equivalent" 919name = "equivalent"
778version = "1.0.1" 920version = "1.0.2"
921source = "registry+https://github.com/rust-lang/crates.io-index"
922checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
923
924[[package]]
925name = "errno"
926version = "0.3.13"
779source = "registry+https://github.com/rust-lang/crates.io-index" 927source = "registry+https://github.com/rust-lang/crates.io-index"
780checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 928checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
929dependencies = [
930 "libc",
931 "windows-sys 0.60.2",
932]
781 933
782[[package]] 934[[package]]
783name = "fastrand" 935name = "fastrand"
784version = "2.1.0" 936version = "2.3.0"
785source = "registry+https://github.com/rust-lang/crates.io-index" 937source = "registry+https://github.com/rust-lang/crates.io-index"
786checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" 938checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
787 939
788[[package]] 940[[package]]
789name = "ff" 941name = "ff"
@@ -791,57 +943,75 @@ version = "0.12.1"
791source = "registry+https://github.com/rust-lang/crates.io-index" 943source = "registry+https://github.com/rust-lang/crates.io-index"
792checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" 944checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160"
793dependencies = [ 945dependencies = [
794 "rand_core", 946 "rand_core 0.6.4",
795 "subtle", 947 "subtle",
796] 948]
797 949
798[[package]] 950[[package]]
951name = "find-msvc-tools"
952version = "0.1.0"
953source = "registry+https://github.com/rust-lang/crates.io-index"
954checksum = "e178e4fba8a2726903f6ba98a6d221e76f9c12c650d5dc0e6afdc50677b49650"
955
956[[package]]
799name = "fnv" 957name = "fnv"
800version = "1.0.7" 958version = "1.0.7"
801source = "registry+https://github.com/rust-lang/crates.io-index" 959source = "registry+https://github.com/rust-lang/crates.io-index"
802checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 960checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
803 961
804[[package]] 962[[package]]
963name = "foldhash"
964version = "0.1.5"
965source = "registry+https://github.com/rust-lang/crates.io-index"
966checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
967
968[[package]]
805name = "form_urlencoded" 969name = "form_urlencoded"
806version = "1.2.1" 970version = "1.2.2"
807source = "registry+https://github.com/rust-lang/crates.io-index" 971source = "registry+https://github.com/rust-lang/crates.io-index"
808checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 972checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
809dependencies = [ 973dependencies = [
810 "percent-encoding", 974 "percent-encoding",
811] 975]
812 976
813[[package]] 977[[package]]
978name = "fs_extra"
979version = "1.3.0"
980source = "registry+https://github.com/rust-lang/crates.io-index"
981checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
982
983[[package]]
814name = "futures-channel" 984name = "futures-channel"
815version = "0.3.30" 985version = "0.3.31"
816source = "registry+https://github.com/rust-lang/crates.io-index" 986source = "registry+https://github.com/rust-lang/crates.io-index"
817checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 987checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
818dependencies = [ 988dependencies = [
819 "futures-core", 989 "futures-core",
820] 990]
821 991
822[[package]] 992[[package]]
823name = "futures-core" 993name = "futures-core"
824version = "0.3.30" 994version = "0.3.31"
825source = "registry+https://github.com/rust-lang/crates.io-index" 995source = "registry+https://github.com/rust-lang/crates.io-index"
826checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 996checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
827 997
828[[package]] 998[[package]]
829name = "futures-sink" 999name = "futures-sink"
830version = "0.3.30" 1000version = "0.3.31"
831source = "registry+https://github.com/rust-lang/crates.io-index" 1001source = "registry+https://github.com/rust-lang/crates.io-index"
832checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 1002checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
833 1003
834[[package]] 1004[[package]]
835name = "futures-task" 1005name = "futures-task"
836version = "0.3.30" 1006version = "0.3.31"
837source = "registry+https://github.com/rust-lang/crates.io-index" 1007source = "registry+https://github.com/rust-lang/crates.io-index"
838checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 1008checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
839 1009
840[[package]] 1010[[package]]
841name = "futures-util" 1011name = "futures-util"
842version = "0.3.30" 1012version = "0.3.31"
843source = "registry+https://github.com/rust-lang/crates.io-index" 1013source = "registry+https://github.com/rust-lang/crates.io-index"
844checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 1014checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
845dependencies = [ 1015dependencies = [
846 "futures-core", 1016 "futures-core",
847 "futures-task", 1017 "futures-task",
@@ -861,20 +1031,32 @@ dependencies = [
861 1031
862[[package]] 1032[[package]]
863name = "getrandom" 1033name = "getrandom"
864version = "0.2.14" 1034version = "0.2.16"
865source = "registry+https://github.com/rust-lang/crates.io-index" 1035source = "registry+https://github.com/rust-lang/crates.io-index"
866checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" 1036checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
867dependencies = [ 1037dependencies = [
868 "cfg-if", 1038 "cfg-if",
869 "libc", 1039 "libc",
870 "wasi", 1040 "wasi 0.11.1+wasi-snapshot-preview1",
1041]
1042
1043[[package]]
1044name = "getrandom"
1045version = "0.3.3"
1046source = "registry+https://github.com/rust-lang/crates.io-index"
1047checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
1048dependencies = [
1049 "cfg-if",
1050 "libc",
1051 "r-efi",
1052 "wasi 0.14.3+wasi-0.2.4",
871] 1053]
872 1054
873[[package]] 1055[[package]]
874name = "gimli" 1056name = "gimli"
875version = "0.28.1" 1057version = "0.31.1"
876source = "registry+https://github.com/rust-lang/crates.io-index" 1058source = "registry+https://github.com/rust-lang/crates.io-index"
877checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 1059checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
878 1060
879[[package]] 1061[[package]]
880name = "gitolfs3-authenticate" 1062name = "gitolfs3-authenticate"
@@ -903,7 +1085,7 @@ dependencies = [
903 "aws-config", 1085 "aws-config",
904 "aws-sdk-s3", 1086 "aws-sdk-s3",
905 "axum", 1087 "axum",
906 "base64", 1088 "base64 0.22.1",
907 "chrono", 1089 "chrono",
908 "gitolfs3-common", 1090 "gitolfs3-common",
909 "mime", 1091 "mime",
@@ -920,21 +1102,27 @@ name = "gitolfs3-shell"
920version = "0.1.0" 1102version = "0.1.0"
921 1103
922[[package]] 1104[[package]]
1105name = "glob"
1106version = "0.3.3"
1107source = "registry+https://github.com/rust-lang/crates.io-index"
1108checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
1109
1110[[package]]
923name = "group" 1111name = "group"
924version = "0.12.1" 1112version = "0.12.1"
925source = "registry+https://github.com/rust-lang/crates.io-index" 1113source = "registry+https://github.com/rust-lang/crates.io-index"
926checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" 1114checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7"
927dependencies = [ 1115dependencies = [
928 "ff", 1116 "ff",
929 "rand_core", 1117 "rand_core 0.6.4",
930 "subtle", 1118 "subtle",
931] 1119]
932 1120
933[[package]] 1121[[package]]
934name = "h2" 1122name = "h2"
935version = "0.3.26" 1123version = "0.3.27"
936source = "registry+https://github.com/rust-lang/crates.io-index" 1124source = "registry+https://github.com/rust-lang/crates.io-index"
937checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 1125checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d"
938dependencies = [ 1126dependencies = [
939 "bytes", 1127 "bytes",
940 "fnv", 1128 "fnv",
@@ -950,20 +1138,34 @@ dependencies = [
950] 1138]
951 1139
952[[package]] 1140[[package]]
953name = "hashbrown" 1141name = "h2"
954version = "0.14.5" 1142version = "0.4.12"
955source = "registry+https://github.com/rust-lang/crates.io-index" 1143source = "registry+https://github.com/rust-lang/crates.io-index"
956checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1144checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386"
957dependencies = [ 1145dependencies = [
958 "ahash", 1146 "atomic-waker",
959 "allocator-api2", 1147 "bytes",
1148 "fnv",
1149 "futures-core",
1150 "futures-sink",
1151 "http 1.3.1",
1152 "indexmap",
1153 "slab",
1154 "tokio",
1155 "tokio-util",
1156 "tracing",
960] 1157]
961 1158
962[[package]] 1159[[package]]
963name = "hermit-abi" 1160name = "hashbrown"
964version = "0.3.9" 1161version = "0.15.5"
965source = "registry+https://github.com/rust-lang/crates.io-index" 1162source = "registry+https://github.com/rust-lang/crates.io-index"
966checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 1163checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
1164dependencies = [
1165 "allocator-api2",
1166 "equivalent",
1167 "foldhash",
1168]
967 1169
968[[package]] 1170[[package]]
969name = "hex" 1171name = "hex"
@@ -982,9 +1184,18 @@ dependencies = [
982 1184
983[[package]] 1185[[package]]
984name = "hmac-sha256" 1186name = "hmac-sha256"
985version = "1.1.7" 1187version = "1.1.12"
986source = "registry+https://github.com/rust-lang/crates.io-index" 1188source = "registry+https://github.com/rust-lang/crates.io-index"
987checksum = "3688e69b38018fec1557254f64c8dc2cc8ec502890182f395dbb0aa997aa5735" 1189checksum = "ad6880c8d4a9ebf39c6e8b77007ce223f646a4d21ce29d99f70cb16420545425"
1190
1191[[package]]
1192name = "home"
1193version = "0.5.11"
1194source = "registry+https://github.com/rust-lang/crates.io-index"
1195checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf"
1196dependencies = [
1197 "windows-sys 0.59.0",
1198]
988 1199
989[[package]] 1200[[package]]
990name = "http" 1201name = "http"
@@ -999,9 +1210,9 @@ dependencies = [
999 1210
1000[[package]] 1211[[package]]
1001name = "http" 1212name = "http"
1002version = "1.1.0" 1213version = "1.3.1"
1003source = "registry+https://github.com/rust-lang/crates.io-index" 1214source = "registry+https://github.com/rust-lang/crates.io-index"
1004checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 1215checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
1005dependencies = [ 1216dependencies = [
1006 "bytes", 1217 "bytes",
1007 "fnv", 1218 "fnv",
@@ -1021,32 +1232,32 @@ dependencies = [
1021 1232
1022[[package]] 1233[[package]]
1023name = "http-body" 1234name = "http-body"
1024version = "1.0.0" 1235version = "1.0.1"
1025source = "registry+https://github.com/rust-lang/crates.io-index" 1236source = "registry+https://github.com/rust-lang/crates.io-index"
1026checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" 1237checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
1027dependencies = [ 1238dependencies = [
1028 "bytes", 1239 "bytes",
1029 "http 1.1.0", 1240 "http 1.3.1",
1030] 1241]
1031 1242
1032[[package]] 1243[[package]]
1033name = "http-body-util" 1244name = "http-body-util"
1034version = "0.1.1" 1245version = "0.1.3"
1035source = "registry+https://github.com/rust-lang/crates.io-index" 1246source = "registry+https://github.com/rust-lang/crates.io-index"
1036checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" 1247checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
1037dependencies = [ 1248dependencies = [
1038 "bytes", 1249 "bytes",
1039 "futures-core", 1250 "futures-core",
1040 "http 1.1.0", 1251 "http 1.3.1",
1041 "http-body 1.0.0", 1252 "http-body 1.0.1",
1042 "pin-project-lite", 1253 "pin-project-lite",
1043] 1254]
1044 1255
1045[[package]] 1256[[package]]
1046name = "httparse" 1257name = "httparse"
1047version = "1.8.0" 1258version = "1.10.1"
1048source = "registry+https://github.com/rust-lang/crates.io-index" 1259source = "registry+https://github.com/rust-lang/crates.io-index"
1049checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1260checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
1050 1261
1051[[package]] 1262[[package]]
1052name = "httpdate" 1263name = "httpdate"
@@ -1056,22 +1267,22 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
1056 1267
1057[[package]] 1268[[package]]
1058name = "hyper" 1269name = "hyper"
1059version = "0.14.28" 1270version = "0.14.32"
1060source = "registry+https://github.com/rust-lang/crates.io-index" 1271source = "registry+https://github.com/rust-lang/crates.io-index"
1061checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" 1272checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7"
1062dependencies = [ 1273dependencies = [
1063 "bytes", 1274 "bytes",
1064 "futures-channel", 1275 "futures-channel",
1065 "futures-core", 1276 "futures-core",
1066 "futures-util", 1277 "futures-util",
1067 "h2", 1278 "h2 0.3.27",
1068 "http 0.2.12", 1279 "http 0.2.12",
1069 "http-body 0.4.6", 1280 "http-body 0.4.6",
1070 "httparse", 1281 "httparse",
1071 "httpdate", 1282 "httpdate",
1072 "itoa", 1283 "itoa",
1073 "pin-project-lite", 1284 "pin-project-lite",
1074 "socket2", 1285 "socket2 0.5.10",
1075 "tokio", 1286 "tokio",
1076 "tower-service", 1287 "tower-service",
1077 "tracing", 1288 "tracing",
@@ -1080,21 +1291,25 @@ dependencies = [
1080 1291
1081[[package]] 1292[[package]]
1082name = "hyper" 1293name = "hyper"
1083version = "1.3.1" 1294version = "1.7.0"
1084source = "registry+https://github.com/rust-lang/crates.io-index" 1295source = "registry+https://github.com/rust-lang/crates.io-index"
1085checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" 1296checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e"
1086dependencies = [ 1297dependencies = [
1298 "atomic-waker",
1087 "bytes", 1299 "bytes",
1088 "futures-channel", 1300 "futures-channel",
1089 "futures-util", 1301 "futures-core",
1090 "http 1.1.0", 1302 "h2 0.4.12",
1091 "http-body 1.0.0", 1303 "http 1.3.1",
1304 "http-body 1.0.1",
1092 "httparse", 1305 "httparse",
1093 "httpdate", 1306 "httpdate",
1094 "itoa", 1307 "itoa",
1095 "pin-project-lite", 1308 "pin-project-lite",
1309 "pin-utils",
1096 "smallvec", 1310 "smallvec",
1097 "tokio", 1311 "tokio",
1312 "want",
1098] 1313]
1099 1314
1100[[package]] 1315[[package]]
@@ -1105,40 +1320,66 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
1105dependencies = [ 1320dependencies = [
1106 "futures-util", 1321 "futures-util",
1107 "http 0.2.12", 1322 "http 0.2.12",
1108 "hyper 0.14.28", 1323 "hyper 0.14.32",
1109 "log", 1324 "log",
1110 "rustls", 1325 "rustls 0.21.12",
1111 "rustls-native-certs", 1326 "rustls-native-certs 0.6.3",
1327 "tokio",
1328 "tokio-rustls 0.24.1",
1329]
1330
1331[[package]]
1332name = "hyper-rustls"
1333version = "0.27.7"
1334source = "registry+https://github.com/rust-lang/crates.io-index"
1335checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
1336dependencies = [
1337 "http 1.3.1",
1338 "hyper 1.7.0",
1339 "hyper-util",
1340 "rustls 0.23.31",
1341 "rustls-native-certs 0.8.1",
1342 "rustls-pki-types",
1112 "tokio", 1343 "tokio",
1113 "tokio-rustls", 1344 "tokio-rustls 0.26.2",
1345 "tower-service",
1114] 1346]
1115 1347
1116[[package]] 1348[[package]]
1117name = "hyper-util" 1349name = "hyper-util"
1118version = "0.1.3" 1350version = "0.1.16"
1119source = "registry+https://github.com/rust-lang/crates.io-index" 1351source = "registry+https://github.com/rust-lang/crates.io-index"
1120checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" 1352checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e"
1121dependencies = [ 1353dependencies = [
1354 "base64 0.22.1",
1122 "bytes", 1355 "bytes",
1356 "futures-channel",
1357 "futures-core",
1123 "futures-util", 1358 "futures-util",
1124 "http 1.1.0", 1359 "http 1.3.1",
1125 "http-body 1.0.0", 1360 "http-body 1.0.1",
1126 "hyper 1.3.1", 1361 "hyper 1.7.0",
1362 "ipnet",
1363 "libc",
1364 "percent-encoding",
1127 "pin-project-lite", 1365 "pin-project-lite",
1128 "socket2", 1366 "socket2 0.6.0",
1129 "tokio", 1367 "tokio",
1368 "tower-service",
1369 "tracing",
1130] 1370]
1131 1371
1132[[package]] 1372[[package]]
1133name = "iana-time-zone" 1373name = "iana-time-zone"
1134version = "0.1.60" 1374version = "0.1.63"
1135source = "registry+https://github.com/rust-lang/crates.io-index" 1375source = "registry+https://github.com/rust-lang/crates.io-index"
1136checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" 1376checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
1137dependencies = [ 1377dependencies = [
1138 "android_system_properties", 1378 "android_system_properties",
1139 "core-foundation-sys", 1379 "core-foundation-sys",
1140 "iana-time-zone-haiku", 1380 "iana-time-zone-haiku",
1141 "js-sys", 1381 "js-sys",
1382 "log",
1142 "wasm-bindgen", 1383 "wasm-bindgen",
1143 "windows-core", 1384 "windows-core",
1144] 1385]
@@ -1153,57 +1394,219 @@ dependencies = [
1153] 1394]
1154 1395
1155[[package]] 1396[[package]]
1397name = "icu_collections"
1398version = "2.0.0"
1399source = "registry+https://github.com/rust-lang/crates.io-index"
1400checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
1401dependencies = [
1402 "displaydoc",
1403 "potential_utf",
1404 "yoke",
1405 "zerofrom",
1406 "zerovec",
1407]
1408
1409[[package]]
1410name = "icu_locale_core"
1411version = "2.0.0"
1412source = "registry+https://github.com/rust-lang/crates.io-index"
1413checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
1414dependencies = [
1415 "displaydoc",
1416 "litemap",
1417 "tinystr",
1418 "writeable",
1419 "zerovec",
1420]
1421
1422[[package]]
1423name = "icu_normalizer"
1424version = "2.0.0"
1425source = "registry+https://github.com/rust-lang/crates.io-index"
1426checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
1427dependencies = [
1428 "displaydoc",
1429 "icu_collections",
1430 "icu_normalizer_data",
1431 "icu_properties",
1432 "icu_provider",
1433 "smallvec",
1434 "zerovec",
1435]
1436
1437[[package]]
1438name = "icu_normalizer_data"
1439version = "2.0.0"
1440source = "registry+https://github.com/rust-lang/crates.io-index"
1441checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
1442
1443[[package]]
1444name = "icu_properties"
1445version = "2.0.1"
1446source = "registry+https://github.com/rust-lang/crates.io-index"
1447checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
1448dependencies = [
1449 "displaydoc",
1450 "icu_collections",
1451 "icu_locale_core",
1452 "icu_properties_data",
1453 "icu_provider",
1454 "potential_utf",
1455 "zerotrie",
1456 "zerovec",
1457]
1458
1459[[package]]
1460name = "icu_properties_data"
1461version = "2.0.1"
1462source = "registry+https://github.com/rust-lang/crates.io-index"
1463checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
1464
1465[[package]]
1466name = "icu_provider"
1467version = "2.0.0"
1468source = "registry+https://github.com/rust-lang/crates.io-index"
1469checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
1470dependencies = [
1471 "displaydoc",
1472 "icu_locale_core",
1473 "stable_deref_trait",
1474 "tinystr",
1475 "writeable",
1476 "yoke",
1477 "zerofrom",
1478 "zerotrie",
1479 "zerovec",
1480]
1481
1482[[package]]
1156name = "idna" 1483name = "idna"
1157version = "0.5.0" 1484version = "1.1.0"
1485source = "registry+https://github.com/rust-lang/crates.io-index"
1486checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
1487dependencies = [
1488 "idna_adapter",
1489 "smallvec",
1490 "utf8_iter",
1491]
1492
1493[[package]]
1494name = "idna_adapter"
1495version = "1.2.1"
1158source = "registry+https://github.com/rust-lang/crates.io-index" 1496source = "registry+https://github.com/rust-lang/crates.io-index"
1159checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 1497checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
1160dependencies = [ 1498dependencies = [
1161 "unicode-bidi", 1499 "icu_normalizer",
1162 "unicode-normalization", 1500 "icu_properties",
1163] 1501]
1164 1502
1165[[package]] 1503[[package]]
1166name = "indexmap" 1504name = "indexmap"
1167version = "2.2.6" 1505version = "2.11.0"
1168source = "registry+https://github.com/rust-lang/crates.io-index" 1506source = "registry+https://github.com/rust-lang/crates.io-index"
1169checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 1507checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9"
1170dependencies = [ 1508dependencies = [
1171 "equivalent", 1509 "equivalent",
1172 "hashbrown", 1510 "hashbrown",
1173] 1511]
1174 1512
1175[[package]] 1513[[package]]
1514name = "io-uring"
1515version = "0.7.10"
1516source = "registry+https://github.com/rust-lang/crates.io-index"
1517checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b"
1518dependencies = [
1519 "bitflags",
1520 "cfg-if",
1521 "libc",
1522]
1523
1524[[package]]
1525name = "ipnet"
1526version = "2.11.0"
1527source = "registry+https://github.com/rust-lang/crates.io-index"
1528checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
1529
1530[[package]]
1531name = "itertools"
1532version = "0.12.1"
1533source = "registry+https://github.com/rust-lang/crates.io-index"
1534checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
1535dependencies = [
1536 "either",
1537]
1538
1539[[package]]
1176name = "itoa" 1540name = "itoa"
1177version = "1.0.11" 1541version = "1.0.15"
1178source = "registry+https://github.com/rust-lang/crates.io-index" 1542source = "registry+https://github.com/rust-lang/crates.io-index"
1179checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 1543checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
1544
1545[[package]]
1546name = "jobserver"
1547version = "0.1.34"
1548source = "registry+https://github.com/rust-lang/crates.io-index"
1549checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
1550dependencies = [
1551 "getrandom 0.3.3",
1552 "libc",
1553]
1180 1554
1181[[package]] 1555[[package]]
1182name = "js-sys" 1556name = "js-sys"
1183version = "0.3.69" 1557version = "0.3.77"
1184source = "registry+https://github.com/rust-lang/crates.io-index" 1558source = "registry+https://github.com/rust-lang/crates.io-index"
1185checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 1559checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
1186dependencies = [ 1560dependencies = [
1561 "once_cell",
1187 "wasm-bindgen", 1562 "wasm-bindgen",
1188] 1563]
1189 1564
1190[[package]] 1565[[package]]
1191name = "lazy_static" 1566name = "lazy_static"
1192version = "1.4.0" 1567version = "1.5.0"
1568source = "registry+https://github.com/rust-lang/crates.io-index"
1569checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
1570
1571[[package]]
1572name = "lazycell"
1573version = "1.3.0"
1193source = "registry+https://github.com/rust-lang/crates.io-index" 1574source = "registry+https://github.com/rust-lang/crates.io-index"
1194checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1575checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
1195 1576
1196[[package]] 1577[[package]]
1197name = "libc" 1578name = "libc"
1198version = "0.2.153" 1579version = "0.2.175"
1580source = "registry+https://github.com/rust-lang/crates.io-index"
1581checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
1582
1583[[package]]
1584name = "libloading"
1585version = "0.8.8"
1586source = "registry+https://github.com/rust-lang/crates.io-index"
1587checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667"
1588dependencies = [
1589 "cfg-if",
1590 "windows-targets 0.53.3",
1591]
1592
1593[[package]]
1594name = "linux-raw-sys"
1595version = "0.4.15"
1199source = "registry+https://github.com/rust-lang/crates.io-index" 1596source = "registry+https://github.com/rust-lang/crates.io-index"
1200checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" 1597checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
1598
1599[[package]]
1600name = "litemap"
1601version = "0.8.0"
1602source = "registry+https://github.com/rust-lang/crates.io-index"
1603checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
1201 1604
1202[[package]] 1605[[package]]
1203name = "lock_api" 1606name = "lock_api"
1204version = "0.4.12" 1607version = "0.4.13"
1205source = "registry+https://github.com/rust-lang/crates.io-index" 1608source = "registry+https://github.com/rust-lang/crates.io-index"
1206checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1609checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
1207dependencies = [ 1610dependencies = [
1208 "autocfg", 1611 "autocfg",
1209 "scopeguard", 1612 "scopeguard",
@@ -1211,33 +1614,33 @@ dependencies = [
1211 1614
1212[[package]] 1615[[package]]
1213name = "log" 1616name = "log"
1214version = "0.4.21" 1617version = "0.4.27"
1215source = "registry+https://github.com/rust-lang/crates.io-index" 1618source = "registry+https://github.com/rust-lang/crates.io-index"
1216checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 1619checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
1217 1620
1218[[package]] 1621[[package]]
1219name = "lru" 1622name = "lru"
1220version = "0.12.3" 1623version = "0.12.5"
1221source = "registry+https://github.com/rust-lang/crates.io-index" 1624source = "registry+https://github.com/rust-lang/crates.io-index"
1222checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" 1625checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
1223dependencies = [ 1626dependencies = [
1224 "hashbrown", 1627 "hashbrown",
1225] 1628]
1226 1629
1227[[package]] 1630[[package]]
1228name = "matchers" 1631name = "matchers"
1229version = "0.1.0" 1632version = "0.2.0"
1230source = "registry+https://github.com/rust-lang/crates.io-index" 1633source = "registry+https://github.com/rust-lang/crates.io-index"
1231checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1634checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
1232dependencies = [ 1635dependencies = [
1233 "regex-automata 0.1.10", 1636 "regex-automata",
1234] 1637]
1235 1638
1236[[package]] 1639[[package]]
1237name = "matchit" 1640name = "matchit"
1238version = "0.7.3" 1641version = "0.8.4"
1239source = "registry+https://github.com/rust-lang/crates.io-index" 1642source = "registry+https://github.com/rust-lang/crates.io-index"
1240checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" 1643checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
1241 1644
1242[[package]] 1645[[package]]
1243name = "md-5" 1646name = "md-5"
@@ -1251,9 +1654,9 @@ dependencies = [
1251 1654
1252[[package]] 1655[[package]]
1253name = "memchr" 1656name = "memchr"
1254version = "2.7.2" 1657version = "2.7.5"
1255source = "registry+https://github.com/rust-lang/crates.io-index" 1658source = "registry+https://github.com/rust-lang/crates.io-index"
1256checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" 1659checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
1257 1660
1258[[package]] 1661[[package]]
1259name = "mime" 1662name = "mime"
@@ -1262,33 +1665,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1262checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1665checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
1263 1666
1264[[package]] 1667[[package]]
1668name = "minimal-lexical"
1669version = "0.2.1"
1670source = "registry+https://github.com/rust-lang/crates.io-index"
1671checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
1672
1673[[package]]
1265name = "miniz_oxide" 1674name = "miniz_oxide"
1266version = "0.7.2" 1675version = "0.8.9"
1267source = "registry+https://github.com/rust-lang/crates.io-index" 1676source = "registry+https://github.com/rust-lang/crates.io-index"
1268checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" 1677checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
1269dependencies = [ 1678dependencies = [
1270 "adler", 1679 "adler2",
1271] 1680]
1272 1681
1273[[package]] 1682[[package]]
1274name = "mio" 1683name = "mio"
1275version = "0.8.11" 1684version = "1.0.4"
1276source = "registry+https://github.com/rust-lang/crates.io-index" 1685source = "registry+https://github.com/rust-lang/crates.io-index"
1277checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 1686checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
1278dependencies = [ 1687dependencies = [
1279 "libc", 1688 "libc",
1280 "wasi", 1689 "wasi 0.11.1+wasi-snapshot-preview1",
1281 "windows-sys 0.48.0", 1690 "windows-sys 0.59.0",
1691]
1692
1693[[package]]
1694name = "nom"
1695version = "7.1.3"
1696source = "registry+https://github.com/rust-lang/crates.io-index"
1697checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
1698dependencies = [
1699 "memchr",
1700 "minimal-lexical",
1282] 1701]
1283 1702
1284[[package]] 1703[[package]]
1285name = "nu-ansi-term" 1704name = "nu-ansi-term"
1286version = "0.46.0" 1705version = "0.50.1"
1287source = "registry+https://github.com/rust-lang/crates.io-index" 1706source = "registry+https://github.com/rust-lang/crates.io-index"
1288checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1707checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399"
1289dependencies = [ 1708dependencies = [
1290 "overload", 1709 "windows-sys 0.52.0",
1291 "winapi",
1292] 1710]
1293 1711
1294[[package]] 1712[[package]]
@@ -1308,55 +1726,39 @@ dependencies = [
1308 1726
1309[[package]] 1727[[package]]
1310name = "num-traits" 1728name = "num-traits"
1311version = "0.2.18" 1729version = "0.2.19"
1312source = "registry+https://github.com/rust-lang/crates.io-index" 1730source = "registry+https://github.com/rust-lang/crates.io-index"
1313checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" 1731checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
1314dependencies = [ 1732dependencies = [
1315 "autocfg", 1733 "autocfg",
1316] 1734]
1317 1735
1318[[package]] 1736[[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" 1737name = "object"
1330version = "0.32.2" 1738version = "0.36.7"
1331source = "registry+https://github.com/rust-lang/crates.io-index" 1739source = "registry+https://github.com/rust-lang/crates.io-index"
1332checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 1740checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
1333dependencies = [ 1741dependencies = [
1334 "memchr", 1742 "memchr",
1335] 1743]
1336 1744
1337[[package]] 1745[[package]]
1338name = "once_cell" 1746name = "once_cell"
1339version = "1.19.0" 1747version = "1.21.3"
1340source = "registry+https://github.com/rust-lang/crates.io-index" 1748source = "registry+https://github.com/rust-lang/crates.io-index"
1341checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1749checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
1342 1750
1343[[package]] 1751[[package]]
1344name = "openssl-probe" 1752name = "openssl-probe"
1345version = "0.1.5" 1753version = "0.1.6"
1346source = "registry+https://github.com/rust-lang/crates.io-index" 1754source = "registry+https://github.com/rust-lang/crates.io-index"
1347checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1755checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
1348 1756
1349[[package]] 1757[[package]]
1350name = "outref" 1758name = "outref"
1351version = "0.5.1" 1759version = "0.5.2"
1352source = "registry+https://github.com/rust-lang/crates.io-index" 1760source = "registry+https://github.com/rust-lang/crates.io-index"
1353checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" 1761checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
1354
1355[[package]]
1356name = "overload"
1357version = "0.1.1"
1358source = "registry+https://github.com/rust-lang/crates.io-index"
1359checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
1360 1762
1361[[package]] 1763[[package]]
1362name = "p256" 1764name = "p256"
@@ -1371,9 +1773,9 @@ dependencies = [
1371 1773
1372[[package]] 1774[[package]]
1373name = "parking_lot" 1775name = "parking_lot"
1374version = "0.12.2" 1776version = "0.12.4"
1375source = "registry+https://github.com/rust-lang/crates.io-index" 1777source = "registry+https://github.com/rust-lang/crates.io-index"
1376checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" 1778checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
1377dependencies = [ 1779dependencies = [
1378 "lock_api", 1780 "lock_api",
1379 "parking_lot_core", 1781 "parking_lot_core",
@@ -1381,48 +1783,28 @@ dependencies = [
1381 1783
1382[[package]] 1784[[package]]
1383name = "parking_lot_core" 1785name = "parking_lot_core"
1384version = "0.9.10" 1786version = "0.9.11"
1385source = "registry+https://github.com/rust-lang/crates.io-index" 1787source = "registry+https://github.com/rust-lang/crates.io-index"
1386checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1788checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
1387dependencies = [ 1789dependencies = [
1388 "cfg-if", 1790 "cfg-if",
1389 "libc", 1791 "libc",
1390 "redox_syscall", 1792 "redox_syscall",
1391 "smallvec", 1793 "smallvec",
1392 "windows-targets 0.52.5", 1794 "windows-targets 0.52.6",
1393] 1795]
1394 1796
1395[[package]] 1797[[package]]
1396name = "percent-encoding" 1798name = "percent-encoding"
1397version = "2.3.1" 1799version = "2.3.2"
1398source = "registry+https://github.com/rust-lang/crates.io-index"
1399checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
1400
1401[[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" 1800source = "registry+https://github.com/rust-lang/crates.io-index"
1414checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 1801checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
1415dependencies = [
1416 "proc-macro2",
1417 "quote",
1418 "syn",
1419]
1420 1802
1421[[package]] 1803[[package]]
1422name = "pin-project-lite" 1804name = "pin-project-lite"
1423version = "0.2.14" 1805version = "0.2.16"
1424source = "registry+https://github.com/rust-lang/crates.io-index" 1806source = "registry+https://github.com/rust-lang/crates.io-index"
1425checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 1807checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
1426 1808
1427[[package]] 1809[[package]]
1428name = "pin-utils" 1810name = "pin-utils"
@@ -1441,96 +1823,144 @@ dependencies = [
1441] 1823]
1442 1824
1443[[package]] 1825[[package]]
1826name = "potential_utf"
1827version = "0.1.3"
1828source = "registry+https://github.com/rust-lang/crates.io-index"
1829checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a"
1830dependencies = [
1831 "zerovec",
1832]
1833
1834[[package]]
1444name = "powerfmt" 1835name = "powerfmt"
1445version = "0.2.0" 1836version = "0.2.0"
1446source = "registry+https://github.com/rust-lang/crates.io-index" 1837source = "registry+https://github.com/rust-lang/crates.io-index"
1447checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1838checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
1448 1839
1449[[package]] 1840[[package]]
1841name = "ppv-lite86"
1842version = "0.2.21"
1843source = "registry+https://github.com/rust-lang/crates.io-index"
1844checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
1845dependencies = [
1846 "zerocopy",
1847]
1848
1849[[package]]
1850name = "prettyplease"
1851version = "0.2.37"
1852source = "registry+https://github.com/rust-lang/crates.io-index"
1853checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
1854dependencies = [
1855 "proc-macro2",
1856 "syn",
1857]
1858
1859[[package]]
1450name = "proc-macro2" 1860name = "proc-macro2"
1451version = "1.0.81" 1861version = "1.0.101"
1452source = "registry+https://github.com/rust-lang/crates.io-index" 1862source = "registry+https://github.com/rust-lang/crates.io-index"
1453checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" 1863checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
1454dependencies = [ 1864dependencies = [
1455 "unicode-ident", 1865 "unicode-ident",
1456] 1866]
1457 1867
1458[[package]] 1868[[package]]
1459name = "quote" 1869name = "quote"
1460version = "1.0.36" 1870version = "1.0.40"
1461source = "registry+https://github.com/rust-lang/crates.io-index" 1871source = "registry+https://github.com/rust-lang/crates.io-index"
1462checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 1872checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
1463dependencies = [ 1873dependencies = [
1464 "proc-macro2", 1874 "proc-macro2",
1465] 1875]
1466 1876
1467[[package]] 1877[[package]]
1878name = "r-efi"
1879version = "5.3.0"
1880source = "registry+https://github.com/rust-lang/crates.io-index"
1881checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
1882
1883[[package]]
1884name = "rand"
1885version = "0.9.2"
1886source = "registry+https://github.com/rust-lang/crates.io-index"
1887checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
1888dependencies = [
1889 "rand_chacha",
1890 "rand_core 0.9.3",
1891]
1892
1893[[package]]
1894name = "rand_chacha"
1895version = "0.9.0"
1896source = "registry+https://github.com/rust-lang/crates.io-index"
1897checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
1898dependencies = [
1899 "ppv-lite86",
1900 "rand_core 0.9.3",
1901]
1902
1903[[package]]
1468name = "rand_core" 1904name = "rand_core"
1469version = "0.6.4" 1905version = "0.6.4"
1470source = "registry+https://github.com/rust-lang/crates.io-index" 1906source = "registry+https://github.com/rust-lang/crates.io-index"
1471checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1907checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1472dependencies = [ 1908dependencies = [
1473 "getrandom", 1909 "getrandom 0.2.16",
1474] 1910]
1475 1911
1476[[package]] 1912[[package]]
1477name = "redox_syscall" 1913name = "rand_core"
1478version = "0.5.1" 1914version = "0.9.3"
1479source = "registry+https://github.com/rust-lang/crates.io-index" 1915source = "registry+https://github.com/rust-lang/crates.io-index"
1480checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" 1916checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
1481dependencies = [ 1917dependencies = [
1482 "bitflags 2.5.0", 1918 "getrandom 0.3.3",
1483] 1919]
1484 1920
1485[[package]] 1921[[package]]
1486name = "regex" 1922name = "redox_syscall"
1487version = "1.10.4" 1923version = "0.5.17"
1488source = "registry+https://github.com/rust-lang/crates.io-index" 1924source = "registry+https://github.com/rust-lang/crates.io-index"
1489checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" 1925checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
1490dependencies = [ 1926dependencies = [
1491 "aho-corasick", 1927 "bitflags",
1492 "memchr",
1493 "regex-automata 0.4.6",
1494 "regex-syntax 0.8.3",
1495] 1928]
1496 1929
1497[[package]] 1930[[package]]
1498name = "regex-automata" 1931name = "regex"
1499version = "0.1.10" 1932version = "1.11.2"
1500source = "registry+https://github.com/rust-lang/crates.io-index" 1933source = "registry+https://github.com/rust-lang/crates.io-index"
1501checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1934checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912"
1502dependencies = [ 1935dependencies = [
1503 "regex-syntax 0.6.29", 1936 "aho-corasick",
1937 "memchr",
1938 "regex-automata",
1939 "regex-syntax",
1504] 1940]
1505 1941
1506[[package]] 1942[[package]]
1507name = "regex-automata" 1943name = "regex-automata"
1508version = "0.4.6" 1944version = "0.4.10"
1509source = "registry+https://github.com/rust-lang/crates.io-index" 1945source = "registry+https://github.com/rust-lang/crates.io-index"
1510checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" 1946checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6"
1511dependencies = [ 1947dependencies = [
1512 "aho-corasick", 1948 "aho-corasick",
1513 "memchr", 1949 "memchr",
1514 "regex-syntax 0.8.3", 1950 "regex-syntax",
1515] 1951]
1516 1952
1517[[package]] 1953[[package]]
1518name = "regex-lite" 1954name = "regex-lite"
1519version = "0.1.5" 1955version = "0.1.7"
1520source = "registry+https://github.com/rust-lang/crates.io-index"
1521checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e"
1522
1523[[package]]
1524name = "regex-syntax"
1525version = "0.6.29"
1526source = "registry+https://github.com/rust-lang/crates.io-index" 1956source = "registry+https://github.com/rust-lang/crates.io-index"
1527checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 1957checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30"
1528 1958
1529[[package]] 1959[[package]]
1530name = "regex-syntax" 1960name = "regex-syntax"
1531version = "0.8.3" 1961version = "0.8.6"
1532source = "registry+https://github.com/rust-lang/crates.io-index" 1962source = "registry+https://github.com/rust-lang/crates.io-index"
1533checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" 1963checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
1534 1964
1535[[package]] 1965[[package]]
1536name = "rfc6979" 1966name = "rfc6979"
@@ -1545,35 +1975,53 @@ dependencies = [
1545 1975
1546[[package]] 1976[[package]]
1547name = "ring" 1977name = "ring"
1548version = "0.17.8" 1978version = "0.17.14"
1549source = "registry+https://github.com/rust-lang/crates.io-index" 1979source = "registry+https://github.com/rust-lang/crates.io-index"
1550checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1980checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
1551dependencies = [ 1981dependencies = [
1552 "cc", 1982 "cc",
1553 "cfg-if", 1983 "cfg-if",
1554 "getrandom", 1984 "getrandom 0.2.16",
1555 "libc", 1985 "libc",
1556 "spin",
1557 "untrusted", 1986 "untrusted",
1558 "windows-sys 0.52.0", 1987 "windows-sys 0.52.0",
1559] 1988]
1560 1989
1561[[package]] 1990[[package]]
1562name = "rustc-demangle" 1991name = "rustc-demangle"
1563version = "0.1.23" 1992version = "0.1.26"
1564source = "registry+https://github.com/rust-lang/crates.io-index" 1993source = "registry+https://github.com/rust-lang/crates.io-index"
1565checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 1994checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace"
1995
1996[[package]]
1997name = "rustc-hash"
1998version = "1.1.0"
1999source = "registry+https://github.com/rust-lang/crates.io-index"
2000checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
1566 2001
1567[[package]] 2002[[package]]
1568name = "rustc_version" 2003name = "rustc_version"
1569version = "0.4.0" 2004version = "0.4.1"
1570source = "registry+https://github.com/rust-lang/crates.io-index" 2005source = "registry+https://github.com/rust-lang/crates.io-index"
1571checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 2006checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
1572dependencies = [ 2007dependencies = [
1573 "semver", 2008 "semver",
1574] 2009]
1575 2010
1576[[package]] 2011[[package]]
2012name = "rustix"
2013version = "0.38.44"
2014source = "registry+https://github.com/rust-lang/crates.io-index"
2015checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
2016dependencies = [
2017 "bitflags",
2018 "errno",
2019 "libc",
2020 "linux-raw-sys",
2021 "windows-sys 0.59.0",
2022]
2023
2024[[package]]
1577name = "rustls" 2025name = "rustls"
1578version = "0.21.12" 2026version = "0.21.12"
1579source = "registry+https://github.com/rust-lang/crates.io-index" 2027source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1581,11 +2029,25 @@ checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
1581dependencies = [ 2029dependencies = [
1582 "log", 2030 "log",
1583 "ring", 2031 "ring",
1584 "rustls-webpki", 2032 "rustls-webpki 0.101.7",
1585 "sct", 2033 "sct",
1586] 2034]
1587 2035
1588[[package]] 2036[[package]]
2037name = "rustls"
2038version = "0.23.31"
2039source = "registry+https://github.com/rust-lang/crates.io-index"
2040checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc"
2041dependencies = [
2042 "aws-lc-rs",
2043 "once_cell",
2044 "rustls-pki-types",
2045 "rustls-webpki 0.103.4",
2046 "subtle",
2047 "zeroize",
2048]
2049
2050[[package]]
1589name = "rustls-native-certs" 2051name = "rustls-native-certs"
1590version = "0.6.3" 2052version = "0.6.3"
1591source = "registry+https://github.com/rust-lang/crates.io-index" 2053source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1594,7 +2056,19 @@ dependencies = [
1594 "openssl-probe", 2056 "openssl-probe",
1595 "rustls-pemfile", 2057 "rustls-pemfile",
1596 "schannel", 2058 "schannel",
1597 "security-framework", 2059 "security-framework 2.11.1",
2060]
2061
2062[[package]]
2063name = "rustls-native-certs"
2064version = "0.8.1"
2065source = "registry+https://github.com/rust-lang/crates.io-index"
2066checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3"
2067dependencies = [
2068 "openssl-probe",
2069 "rustls-pki-types",
2070 "schannel",
2071 "security-framework 3.3.0",
1598] 2072]
1599 2073
1600[[package]] 2074[[package]]
@@ -1603,7 +2077,16 @@ version = "1.0.4"
1603source = "registry+https://github.com/rust-lang/crates.io-index" 2077source = "registry+https://github.com/rust-lang/crates.io-index"
1604checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 2078checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
1605dependencies = [ 2079dependencies = [
1606 "base64", 2080 "base64 0.21.7",
2081]
2082
2083[[package]]
2084name = "rustls-pki-types"
2085version = "1.12.0"
2086source = "registry+https://github.com/rust-lang/crates.io-index"
2087checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
2088dependencies = [
2089 "zeroize",
1607] 2090]
1608 2091
1609[[package]] 2092[[package]]
@@ -1617,24 +2100,36 @@ dependencies = [
1617] 2100]
1618 2101
1619[[package]] 2102[[package]]
2103name = "rustls-webpki"
2104version = "0.103.4"
2105source = "registry+https://github.com/rust-lang/crates.io-index"
2106checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc"
2107dependencies = [
2108 "aws-lc-rs",
2109 "ring",
2110 "rustls-pki-types",
2111 "untrusted",
2112]
2113
2114[[package]]
1620name = "rustversion" 2115name = "rustversion"
1621version = "1.0.15" 2116version = "1.0.22"
1622source = "registry+https://github.com/rust-lang/crates.io-index" 2117source = "registry+https://github.com/rust-lang/crates.io-index"
1623checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" 2118checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
1624 2119
1625[[package]] 2120[[package]]
1626name = "ryu" 2121name = "ryu"
1627version = "1.0.17" 2122version = "1.0.20"
1628source = "registry+https://github.com/rust-lang/crates.io-index" 2123source = "registry+https://github.com/rust-lang/crates.io-index"
1629checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" 2124checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
1630 2125
1631[[package]] 2126[[package]]
1632name = "schannel" 2127name = "schannel"
1633version = "0.1.23" 2128version = "0.1.27"
1634source = "registry+https://github.com/rust-lang/crates.io-index" 2129source = "registry+https://github.com/rust-lang/crates.io-index"
1635checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 2130checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
1636dependencies = [ 2131dependencies = [
1637 "windows-sys 0.52.0", 2132 "windows-sys 0.59.0",
1638] 2133]
1639 2134
1640[[package]] 2135[[package]]
@@ -1669,12 +2164,25 @@ dependencies = [
1669 2164
1670[[package]] 2165[[package]]
1671name = "security-framework" 2166name = "security-framework"
1672version = "2.10.0" 2167version = "2.11.1"
2168source = "registry+https://github.com/rust-lang/crates.io-index"
2169checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
2170dependencies = [
2171 "bitflags",
2172 "core-foundation 0.9.4",
2173 "core-foundation-sys",
2174 "libc",
2175 "security-framework-sys",
2176]
2177
2178[[package]]
2179name = "security-framework"
2180version = "3.3.0"
1673source = "registry+https://github.com/rust-lang/crates.io-index" 2181source = "registry+https://github.com/rust-lang/crates.io-index"
1674checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" 2182checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c"
1675dependencies = [ 2183dependencies = [
1676 "bitflags 1.3.2", 2184 "bitflags",
1677 "core-foundation", 2185 "core-foundation 0.10.1",
1678 "core-foundation-sys", 2186 "core-foundation-sys",
1679 "libc", 2187 "libc",
1680 "security-framework-sys", 2188 "security-framework-sys",
@@ -1682,9 +2190,9 @@ dependencies = [
1682 2190
1683[[package]] 2191[[package]]
1684name = "security-framework-sys" 2192name = "security-framework-sys"
1685version = "2.10.0" 2193version = "2.14.0"
1686source = "registry+https://github.com/rust-lang/crates.io-index" 2194source = "registry+https://github.com/rust-lang/crates.io-index"
1687checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" 2195checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
1688dependencies = [ 2196dependencies = [
1689 "core-foundation-sys", 2197 "core-foundation-sys",
1690 "libc", 2198 "libc",
@@ -1692,24 +2200,24 @@ dependencies = [
1692 2200
1693[[package]] 2201[[package]]
1694name = "semver" 2202name = "semver"
1695version = "1.0.22" 2203version = "1.0.26"
1696source = "registry+https://github.com/rust-lang/crates.io-index" 2204source = "registry+https://github.com/rust-lang/crates.io-index"
1697checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" 2205checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
1698 2206
1699[[package]] 2207[[package]]
1700name = "serde" 2208name = "serde"
1701version = "1.0.199" 2209version = "1.0.219"
1702source = "registry+https://github.com/rust-lang/crates.io-index" 2210source = "registry+https://github.com/rust-lang/crates.io-index"
1703checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a" 2211checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
1704dependencies = [ 2212dependencies = [
1705 "serde_derive", 2213 "serde_derive",
1706] 2214]
1707 2215
1708[[package]] 2216[[package]]
1709name = "serde_derive" 2217name = "serde_derive"
1710version = "1.0.199" 2218version = "1.0.219"
1711source = "registry+https://github.com/rust-lang/crates.io-index" 2219source = "registry+https://github.com/rust-lang/crates.io-index"
1712checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc" 2220checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
1713dependencies = [ 2221dependencies = [
1714 "proc-macro2", 2222 "proc-macro2",
1715 "quote", 2223 "quote",
@@ -1718,20 +2226,21 @@ dependencies = [
1718 2226
1719[[package]] 2227[[package]]
1720name = "serde_json" 2228name = "serde_json"
1721version = "1.0.116" 2229version = "1.0.143"
1722source = "registry+https://github.com/rust-lang/crates.io-index" 2230source = "registry+https://github.com/rust-lang/crates.io-index"
1723checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" 2231checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a"
1724dependencies = [ 2232dependencies = [
1725 "itoa", 2233 "itoa",
2234 "memchr",
1726 "ryu", 2235 "ryu",
1727 "serde", 2236 "serde",
1728] 2237]
1729 2238
1730[[package]] 2239[[package]]
1731name = "serde_path_to_error" 2240name = "serde_path_to_error"
1732version = "0.1.16" 2241version = "0.1.17"
1733source = "registry+https://github.com/rust-lang/crates.io-index" 2242source = "registry+https://github.com/rust-lang/crates.io-index"
1734checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" 2243checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a"
1735dependencies = [ 2244dependencies = [
1736 "itoa", 2245 "itoa",
1737 "serde", 2246 "serde",
@@ -1762,9 +2271,9 @@ dependencies = [
1762 2271
1763[[package]] 2272[[package]]
1764name = "sha2" 2273name = "sha2"
1765version = "0.10.8" 2274version = "0.10.9"
1766source = "registry+https://github.com/rust-lang/crates.io-index" 2275source = "registry+https://github.com/rust-lang/crates.io-index"
1767checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 2276checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
1768dependencies = [ 2277dependencies = [
1769 "cfg-if", 2278 "cfg-if",
1770 "cpufeatures", 2279 "cpufeatures",
@@ -1781,10 +2290,16 @@ dependencies = [
1781] 2290]
1782 2291
1783[[package]] 2292[[package]]
2293name = "shlex"
2294version = "1.3.0"
2295source = "registry+https://github.com/rust-lang/crates.io-index"
2296checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
2297
2298[[package]]
1784name = "signal-hook-registry" 2299name = "signal-hook-registry"
1785version = "1.4.2" 2300version = "1.4.6"
1786source = "registry+https://github.com/rust-lang/crates.io-index" 2301source = "registry+https://github.com/rust-lang/crates.io-index"
1787checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 2302checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
1788dependencies = [ 2303dependencies = [
1789 "libc", 2304 "libc",
1790] 2305]
@@ -1796,39 +2311,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1796checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" 2311checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"
1797dependencies = [ 2312dependencies = [
1798 "digest", 2313 "digest",
1799 "rand_core", 2314 "rand_core 0.6.4",
1800] 2315]
1801 2316
1802[[package]] 2317[[package]]
1803name = "slab" 2318name = "slab"
1804version = "0.4.9" 2319version = "0.4.11"
1805source = "registry+https://github.com/rust-lang/crates.io-index" 2320source = "registry+https://github.com/rust-lang/crates.io-index"
1806checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2321checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
1807dependencies = [
1808 "autocfg",
1809]
1810 2322
1811[[package]] 2323[[package]]
1812name = "smallvec" 2324name = "smallvec"
1813version = "1.13.2" 2325version = "1.15.1"
1814source = "registry+https://github.com/rust-lang/crates.io-index" 2326source = "registry+https://github.com/rust-lang/crates.io-index"
1815checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 2327checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
1816 2328
1817[[package]] 2329[[package]]
1818name = "socket2" 2330name = "socket2"
1819version = "0.5.7" 2331version = "0.5.10"
1820source = "registry+https://github.com/rust-lang/crates.io-index" 2332source = "registry+https://github.com/rust-lang/crates.io-index"
1821checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 2333checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678"
1822dependencies = [ 2334dependencies = [
1823 "libc", 2335 "libc",
1824 "windows-sys 0.52.0", 2336 "windows-sys 0.52.0",
1825] 2337]
1826 2338
1827[[package]] 2339[[package]]
1828name = "spin" 2340name = "socket2"
1829version = "0.9.8" 2341version = "0.6.0"
1830source = "registry+https://github.com/rust-lang/crates.io-index" 2342source = "registry+https://github.com/rust-lang/crates.io-index"
1831checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 2343checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807"
2344dependencies = [
2345 "libc",
2346 "windows-sys 0.59.0",
2347]
1832 2348
1833[[package]] 2349[[package]]
1834name = "spki" 2350name = "spki"
@@ -1841,16 +2357,22 @@ dependencies = [
1841] 2357]
1842 2358
1843[[package]] 2359[[package]]
2360name = "stable_deref_trait"
2361version = "1.2.0"
2362source = "registry+https://github.com/rust-lang/crates.io-index"
2363checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
2364
2365[[package]]
1844name = "subtle" 2366name = "subtle"
1845version = "2.5.0" 2367version = "2.6.1"
1846source = "registry+https://github.com/rust-lang/crates.io-index" 2368source = "registry+https://github.com/rust-lang/crates.io-index"
1847checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 2369checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
1848 2370
1849[[package]] 2371[[package]]
1850name = "syn" 2372name = "syn"
1851version = "2.0.60" 2373version = "2.0.106"
1852source = "registry+https://github.com/rust-lang/crates.io-index" 2374source = "registry+https://github.com/rust-lang/crates.io-index"
1853checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" 2375checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
1854dependencies = [ 2376dependencies = [
1855 "proc-macro2", 2377 "proc-macro2",
1856 "quote", 2378 "quote",
@@ -1859,31 +2381,35 @@ dependencies = [
1859 2381
1860[[package]] 2382[[package]]
1861name = "sync_wrapper" 2383name = "sync_wrapper"
1862version = "0.1.2" 2384version = "1.0.2"
1863source = "registry+https://github.com/rust-lang/crates.io-index" 2385source = "registry+https://github.com/rust-lang/crates.io-index"
1864checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 2386checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
1865 2387
1866[[package]] 2388[[package]]
1867name = "sync_wrapper" 2389name = "synstructure"
1868version = "1.0.1" 2390version = "0.13.2"
1869source = "registry+https://github.com/rust-lang/crates.io-index" 2391source = "registry+https://github.com/rust-lang/crates.io-index"
1870checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" 2392checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
2393dependencies = [
2394 "proc-macro2",
2395 "quote",
2396 "syn",
2397]
1871 2398
1872[[package]] 2399[[package]]
1873name = "thread_local" 2400name = "thread_local"
1874version = "1.1.8" 2401version = "1.1.9"
1875source = "registry+https://github.com/rust-lang/crates.io-index" 2402source = "registry+https://github.com/rust-lang/crates.io-index"
1876checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 2403checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
1877dependencies = [ 2404dependencies = [
1878 "cfg-if", 2405 "cfg-if",
1879 "once_cell",
1880] 2406]
1881 2407
1882[[package]] 2408[[package]]
1883name = "time" 2409name = "time"
1884version = "0.3.36" 2410version = "0.3.42"
1885source = "registry+https://github.com/rust-lang/crates.io-index" 2411source = "registry+https://github.com/rust-lang/crates.io-index"
1886checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" 2412checksum = "8ca967379f9d8eb8058d86ed467d81d03e81acd45757e4ca341c24affbe8e8e3"
1887dependencies = [ 2413dependencies = [
1888 "deranged", 2414 "deranged",
1889 "num-conv", 2415 "num-conv",
@@ -1895,59 +2421,55 @@ dependencies = [
1895 2421
1896[[package]] 2422[[package]]
1897name = "time-core" 2423name = "time-core"
1898version = "0.1.2" 2424version = "0.1.5"
1899source = "registry+https://github.com/rust-lang/crates.io-index" 2425source = "registry+https://github.com/rust-lang/crates.io-index"
1900checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 2426checksum = "a9108bb380861b07264b950ded55a44a14a4adc68b9f5efd85aafc3aa4d40a68"
1901 2427
1902[[package]] 2428[[package]]
1903name = "time-macros" 2429name = "time-macros"
1904version = "0.2.18" 2430version = "0.2.23"
1905source = "registry+https://github.com/rust-lang/crates.io-index" 2431source = "registry+https://github.com/rust-lang/crates.io-index"
1906checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" 2432checksum = "7182799245a7264ce590b349d90338f1c1affad93d2639aed5f8f69c090b334c"
1907dependencies = [ 2433dependencies = [
1908 "num-conv", 2434 "num-conv",
1909 "time-core", 2435 "time-core",
1910] 2436]
1911 2437
1912[[package]] 2438[[package]]
1913name = "tinyvec" 2439name = "tinystr"
1914version = "1.6.0" 2440version = "0.8.1"
1915source = "registry+https://github.com/rust-lang/crates.io-index" 2441source = "registry+https://github.com/rust-lang/crates.io-index"
1916checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2442checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
1917dependencies = [ 2443dependencies = [
1918 "tinyvec_macros", 2444 "displaydoc",
2445 "zerovec",
1919] 2446]
1920 2447
1921[[package]] 2448[[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" 2449name = "tokio"
1929version = "1.37.0" 2450version = "1.47.1"
1930source = "registry+https://github.com/rust-lang/crates.io-index" 2451source = "registry+https://github.com/rust-lang/crates.io-index"
1931checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" 2452checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038"
1932dependencies = [ 2453dependencies = [
1933 "backtrace", 2454 "backtrace",
1934 "bytes", 2455 "bytes",
2456 "io-uring",
1935 "libc", 2457 "libc",
1936 "mio", 2458 "mio",
1937 "num_cpus",
1938 "parking_lot", 2459 "parking_lot",
1939 "pin-project-lite", 2460 "pin-project-lite",
1940 "signal-hook-registry", 2461 "signal-hook-registry",
1941 "socket2", 2462 "slab",
2463 "socket2 0.6.0",
1942 "tokio-macros", 2464 "tokio-macros",
1943 "windows-sys 0.48.0", 2465 "windows-sys 0.59.0",
1944] 2466]
1945 2467
1946[[package]] 2468[[package]]
1947name = "tokio-macros" 2469name = "tokio-macros"
1948version = "2.2.0" 2470version = "2.5.0"
1949source = "registry+https://github.com/rust-lang/crates.io-index" 2471source = "registry+https://github.com/rust-lang/crates.io-index"
1950checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 2472checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
1951dependencies = [ 2473dependencies = [
1952 "proc-macro2", 2474 "proc-macro2",
1953 "quote", 2475 "quote",
@@ -1960,34 +2482,43 @@ version = "0.24.1"
1960source = "registry+https://github.com/rust-lang/crates.io-index" 2482source = "registry+https://github.com/rust-lang/crates.io-index"
1961checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 2483checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
1962dependencies = [ 2484dependencies = [
1963 "rustls", 2485 "rustls 0.21.12",
2486 "tokio",
2487]
2488
2489[[package]]
2490name = "tokio-rustls"
2491version = "0.26.2"
2492source = "registry+https://github.com/rust-lang/crates.io-index"
2493checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b"
2494dependencies = [
2495 "rustls 0.23.31",
1964 "tokio", 2496 "tokio",
1965] 2497]
1966 2498
1967[[package]] 2499[[package]]
1968name = "tokio-util" 2500name = "tokio-util"
1969version = "0.7.10" 2501version = "0.7.16"
1970source = "registry+https://github.com/rust-lang/crates.io-index" 2502source = "registry+https://github.com/rust-lang/crates.io-index"
1971checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" 2503checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5"
1972dependencies = [ 2504dependencies = [
1973 "bytes", 2505 "bytes",
1974 "futures-core", 2506 "futures-core",
1975 "futures-sink", 2507 "futures-sink",
1976 "pin-project-lite", 2508 "pin-project-lite",
1977 "tokio", 2509 "tokio",
1978 "tracing",
1979] 2510]
1980 2511
1981[[package]] 2512[[package]]
1982name = "tower" 2513name = "tower"
1983version = "0.4.13" 2514version = "0.5.2"
1984source = "registry+https://github.com/rust-lang/crates.io-index" 2515source = "registry+https://github.com/rust-lang/crates.io-index"
1985checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 2516checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
1986dependencies = [ 2517dependencies = [
1987 "futures-core", 2518 "futures-core",
1988 "futures-util", 2519 "futures-util",
1989 "pin-project",
1990 "pin-project-lite", 2520 "pin-project-lite",
2521 "sync_wrapper",
1991 "tokio", 2522 "tokio",
1992 "tower-layer", 2523 "tower-layer",
1993 "tower-service", 2524 "tower-service",
@@ -1996,21 +2527,21 @@ dependencies = [
1996 2527
1997[[package]] 2528[[package]]
1998name = "tower-layer" 2529name = "tower-layer"
1999version = "0.3.2" 2530version = "0.3.3"
2000source = "registry+https://github.com/rust-lang/crates.io-index" 2531source = "registry+https://github.com/rust-lang/crates.io-index"
2001checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 2532checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
2002 2533
2003[[package]] 2534[[package]]
2004name = "tower-service" 2535name = "tower-service"
2005version = "0.3.2" 2536version = "0.3.3"
2006source = "registry+https://github.com/rust-lang/crates.io-index" 2537source = "registry+https://github.com/rust-lang/crates.io-index"
2007checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2538checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
2008 2539
2009[[package]] 2540[[package]]
2010name = "tracing" 2541name = "tracing"
2011version = "0.1.40" 2542version = "0.1.41"
2012source = "registry+https://github.com/rust-lang/crates.io-index" 2543source = "registry+https://github.com/rust-lang/crates.io-index"
2013checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 2544checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
2014dependencies = [ 2545dependencies = [
2015 "log", 2546 "log",
2016 "pin-project-lite", 2547 "pin-project-lite",
@@ -2020,9 +2551,9 @@ dependencies = [
2020 2551
2021[[package]] 2552[[package]]
2022name = "tracing-attributes" 2553name = "tracing-attributes"
2023version = "0.1.27" 2554version = "0.1.30"
2024source = "registry+https://github.com/rust-lang/crates.io-index" 2555source = "registry+https://github.com/rust-lang/crates.io-index"
2025checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 2556checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
2026dependencies = [ 2557dependencies = [
2027 "proc-macro2", 2558 "proc-macro2",
2028 "quote", 2559 "quote",
@@ -2031,9 +2562,9 @@ dependencies = [
2031 2562
2032[[package]] 2563[[package]]
2033name = "tracing-core" 2564name = "tracing-core"
2034version = "0.1.32" 2565version = "0.1.34"
2035source = "registry+https://github.com/rust-lang/crates.io-index" 2566source = "registry+https://github.com/rust-lang/crates.io-index"
2036checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 2567checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
2037dependencies = [ 2568dependencies = [
2038 "once_cell", 2569 "once_cell",
2039 "valuable", 2570 "valuable",
@@ -2052,14 +2583,14 @@ dependencies = [
2052 2583
2053[[package]] 2584[[package]]
2054name = "tracing-subscriber" 2585name = "tracing-subscriber"
2055version = "0.3.18" 2586version = "0.3.20"
2056source = "registry+https://github.com/rust-lang/crates.io-index" 2587source = "registry+https://github.com/rust-lang/crates.io-index"
2057checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 2588checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5"
2058dependencies = [ 2589dependencies = [
2059 "matchers", 2590 "matchers",
2060 "nu-ansi-term", 2591 "nu-ansi-term",
2061 "once_cell", 2592 "once_cell",
2062 "regex", 2593 "regex-automata",
2063 "sharded-slab", 2594 "sharded-slab",
2064 "smallvec", 2595 "smallvec",
2065 "thread_local", 2596 "thread_local",
@@ -2076,30 +2607,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
2076 2607
2077[[package]] 2608[[package]]
2078name = "typenum" 2609name = "typenum"
2079version = "1.17.0" 2610version = "1.18.0"
2080source = "registry+https://github.com/rust-lang/crates.io-index"
2081checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
2082
2083[[package]]
2084name = "unicode-bidi"
2085version = "0.3.15"
2086source = "registry+https://github.com/rust-lang/crates.io-index" 2611source = "registry+https://github.com/rust-lang/crates.io-index"
2087checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 2612checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
2088 2613
2089[[package]] 2614[[package]]
2090name = "unicode-ident" 2615name = "unicode-ident"
2091version = "1.0.12" 2616version = "1.0.18"
2092source = "registry+https://github.com/rust-lang/crates.io-index" 2617source = "registry+https://github.com/rust-lang/crates.io-index"
2093checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 2618checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
2094
2095[[package]]
2096name = "unicode-normalization"
2097version = "0.1.23"
2098source = "registry+https://github.com/rust-lang/crates.io-index"
2099checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
2100dependencies = [
2101 "tinyvec",
2102]
2103 2619
2104[[package]] 2620[[package]]
2105name = "untrusted" 2621name = "untrusted"
@@ -2109,13 +2625,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
2109 2625
2110[[package]] 2626[[package]]
2111name = "url" 2627name = "url"
2112version = "2.5.0" 2628version = "2.5.7"
2113source = "registry+https://github.com/rust-lang/crates.io-index" 2629source = "registry+https://github.com/rust-lang/crates.io-index"
2114checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 2630checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b"
2115dependencies = [ 2631dependencies = [
2116 "form_urlencoded", 2632 "form_urlencoded",
2117 "idna", 2633 "idna",
2118 "percent-encoding", 2634 "percent-encoding",
2635 "serde",
2119] 2636]
2120 2637
2121[[package]] 2638[[package]]
@@ -2125,22 +2642,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2125checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 2642checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
2126 2643
2127[[package]] 2644[[package]]
2645name = "utf8_iter"
2646version = "1.0.4"
2647source = "registry+https://github.com/rust-lang/crates.io-index"
2648checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
2649
2650[[package]]
2128name = "uuid" 2651name = "uuid"
2129version = "1.8.0" 2652version = "1.18.0"
2130source = "registry+https://github.com/rust-lang/crates.io-index" 2653source = "registry+https://github.com/rust-lang/crates.io-index"
2131checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" 2654checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be"
2655dependencies = [
2656 "js-sys",
2657 "wasm-bindgen",
2658]
2132 2659
2133[[package]] 2660[[package]]
2134name = "valuable" 2661name = "valuable"
2135version = "0.1.0" 2662version = "0.1.1"
2136source = "registry+https://github.com/rust-lang/crates.io-index" 2663source = "registry+https://github.com/rust-lang/crates.io-index"
2137checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2664checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
2138 2665
2139[[package]] 2666[[package]]
2140name = "version_check" 2667name = "version_check"
2141version = "0.9.4" 2668version = "0.9.5"
2142source = "registry+https://github.com/rust-lang/crates.io-index" 2669source = "registry+https://github.com/rust-lang/crates.io-index"
2143checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2670checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
2144 2671
2145[[package]] 2672[[package]]
2146name = "vsimd" 2673name = "vsimd"
@@ -2159,29 +2686,39 @@ dependencies = [
2159 2686
2160[[package]] 2687[[package]]
2161name = "wasi" 2688name = "wasi"
2162version = "0.11.0+wasi-snapshot-preview1" 2689version = "0.11.1+wasi-snapshot-preview1"
2690source = "registry+https://github.com/rust-lang/crates.io-index"
2691checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
2692
2693[[package]]
2694name = "wasi"
2695version = "0.14.3+wasi-0.2.4"
2163source = "registry+https://github.com/rust-lang/crates.io-index" 2696source = "registry+https://github.com/rust-lang/crates.io-index"
2164checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2697checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95"
2698dependencies = [
2699 "wit-bindgen",
2700]
2165 2701
2166[[package]] 2702[[package]]
2167name = "wasm-bindgen" 2703name = "wasm-bindgen"
2168version = "0.2.92" 2704version = "0.2.100"
2169source = "registry+https://github.com/rust-lang/crates.io-index" 2705source = "registry+https://github.com/rust-lang/crates.io-index"
2170checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 2706checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
2171dependencies = [ 2707dependencies = [
2172 "cfg-if", 2708 "cfg-if",
2709 "once_cell",
2710 "rustversion",
2173 "wasm-bindgen-macro", 2711 "wasm-bindgen-macro",
2174] 2712]
2175 2713
2176[[package]] 2714[[package]]
2177name = "wasm-bindgen-backend" 2715name = "wasm-bindgen-backend"
2178version = "0.2.92" 2716version = "0.2.100"
2179source = "registry+https://github.com/rust-lang/crates.io-index" 2717source = "registry+https://github.com/rust-lang/crates.io-index"
2180checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 2718checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
2181dependencies = [ 2719dependencies = [
2182 "bumpalo", 2720 "bumpalo",
2183 "log", 2721 "log",
2184 "once_cell",
2185 "proc-macro2", 2722 "proc-macro2",
2186 "quote", 2723 "quote",
2187 "syn", 2724 "syn",
@@ -2190,9 +2727,9 @@ dependencies = [
2190 2727
2191[[package]] 2728[[package]]
2192name = "wasm-bindgen-macro" 2729name = "wasm-bindgen-macro"
2193version = "0.2.92" 2730version = "0.2.100"
2194source = "registry+https://github.com/rust-lang/crates.io-index" 2731source = "registry+https://github.com/rust-lang/crates.io-index"
2195checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 2732checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
2196dependencies = [ 2733dependencies = [
2197 "quote", 2734 "quote",
2198 "wasm-bindgen-macro-support", 2735 "wasm-bindgen-macro-support",
@@ -2200,9 +2737,9 @@ dependencies = [
2200 2737
2201[[package]] 2738[[package]]
2202name = "wasm-bindgen-macro-support" 2739name = "wasm-bindgen-macro-support"
2203version = "0.2.92" 2740version = "0.2.100"
2204source = "registry+https://github.com/rust-lang/crates.io-index" 2741source = "registry+https://github.com/rust-lang/crates.io-index"
2205checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 2742checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
2206dependencies = [ 2743dependencies = [
2207 "proc-macro2", 2744 "proc-macro2",
2208 "quote", 2745 "quote",
@@ -2213,48 +2750,82 @@ dependencies = [
2213 2750
2214[[package]] 2751[[package]]
2215name = "wasm-bindgen-shared" 2752name = "wasm-bindgen-shared"
2216version = "0.2.92" 2753version = "0.2.100"
2217source = "registry+https://github.com/rust-lang/crates.io-index" 2754source = "registry+https://github.com/rust-lang/crates.io-index"
2218checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 2755checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
2756dependencies = [
2757 "unicode-ident",
2758]
2219 2759
2220[[package]] 2760[[package]]
2221name = "winapi" 2761name = "which"
2222version = "0.3.9" 2762version = "4.4.2"
2223source = "registry+https://github.com/rust-lang/crates.io-index" 2763source = "registry+https://github.com/rust-lang/crates.io-index"
2224checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2764checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
2225dependencies = [ 2765dependencies = [
2226 "winapi-i686-pc-windows-gnu", 2766 "either",
2227 "winapi-x86_64-pc-windows-gnu", 2767 "home",
2768 "once_cell",
2769 "rustix",
2228] 2770]
2229 2771
2230[[package]] 2772[[package]]
2231name = "winapi-i686-pc-windows-gnu" 2773name = "windows-core"
2232version = "0.4.0" 2774version = "0.61.2"
2233source = "registry+https://github.com/rust-lang/crates.io-index" 2775source = "registry+https://github.com/rust-lang/crates.io-index"
2234checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2776checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
2777dependencies = [
2778 "windows-implement",
2779 "windows-interface",
2780 "windows-link",
2781 "windows-result",
2782 "windows-strings",
2783]
2235 2784
2236[[package]] 2785[[package]]
2237name = "winapi-x86_64-pc-windows-gnu" 2786name = "windows-implement"
2238version = "0.4.0" 2787version = "0.60.0"
2239source = "registry+https://github.com/rust-lang/crates.io-index" 2788source = "registry+https://github.com/rust-lang/crates.io-index"
2240checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2789checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
2790dependencies = [
2791 "proc-macro2",
2792 "quote",
2793 "syn",
2794]
2241 2795
2242[[package]] 2796[[package]]
2243name = "windows-core" 2797name = "windows-interface"
2244version = "0.52.0" 2798version = "0.59.1"
2245source = "registry+https://github.com/rust-lang/crates.io-index" 2799source = "registry+https://github.com/rust-lang/crates.io-index"
2246checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2800checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
2247dependencies = [ 2801dependencies = [
2248 "windows-targets 0.52.5", 2802 "proc-macro2",
2803 "quote",
2804 "syn",
2249] 2805]
2250 2806
2251[[package]] 2807[[package]]
2252name = "windows-sys" 2808name = "windows-link"
2253version = "0.48.0" 2809version = "0.1.3"
2254source = "registry+https://github.com/rust-lang/crates.io-index" 2810source = "registry+https://github.com/rust-lang/crates.io-index"
2255checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2811checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
2812
2813[[package]]
2814name = "windows-result"
2815version = "0.3.4"
2816source = "registry+https://github.com/rust-lang/crates.io-index"
2817checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
2818dependencies = [
2819 "windows-link",
2820]
2821
2822[[package]]
2823name = "windows-strings"
2824version = "0.4.2"
2825source = "registry+https://github.com/rust-lang/crates.io-index"
2826checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
2256dependencies = [ 2827dependencies = [
2257 "windows-targets 0.48.5", 2828 "windows-link",
2258] 2829]
2259 2830
2260[[package]] 2831[[package]]
@@ -2263,129 +2834,167 @@ version = "0.52.0"
2263source = "registry+https://github.com/rust-lang/crates.io-index" 2834source = "registry+https://github.com/rust-lang/crates.io-index"
2264checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2835checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
2265dependencies = [ 2836dependencies = [
2266 "windows-targets 0.52.5", 2837 "windows-targets 0.52.6",
2838]
2839
2840[[package]]
2841name = "windows-sys"
2842version = "0.59.0"
2843source = "registry+https://github.com/rust-lang/crates.io-index"
2844checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
2845dependencies = [
2846 "windows-targets 0.52.6",
2847]
2848
2849[[package]]
2850name = "windows-sys"
2851version = "0.60.2"
2852source = "registry+https://github.com/rust-lang/crates.io-index"
2853checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
2854dependencies = [
2855 "windows-targets 0.53.3",
2267] 2856]
2268 2857
2269[[package]] 2858[[package]]
2270name = "windows-targets" 2859name = "windows-targets"
2271version = "0.48.5" 2860version = "0.52.6"
2272source = "registry+https://github.com/rust-lang/crates.io-index" 2861source = "registry+https://github.com/rust-lang/crates.io-index"
2273checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2862checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
2274dependencies = [ 2863dependencies = [
2275 "windows_aarch64_gnullvm 0.48.5", 2864 "windows_aarch64_gnullvm 0.52.6",
2276 "windows_aarch64_msvc 0.48.5", 2865 "windows_aarch64_msvc 0.52.6",
2277 "windows_i686_gnu 0.48.5", 2866 "windows_i686_gnu 0.52.6",
2278 "windows_i686_msvc 0.48.5", 2867 "windows_i686_gnullvm 0.52.6",
2279 "windows_x86_64_gnu 0.48.5", 2868 "windows_i686_msvc 0.52.6",
2280 "windows_x86_64_gnullvm 0.48.5", 2869 "windows_x86_64_gnu 0.52.6",
2281 "windows_x86_64_msvc 0.48.5", 2870 "windows_x86_64_gnullvm 0.52.6",
2871 "windows_x86_64_msvc 0.52.6",
2282] 2872]
2283 2873
2284[[package]] 2874[[package]]
2285name = "windows-targets" 2875name = "windows-targets"
2286version = "0.52.5" 2876version = "0.53.3"
2287source = "registry+https://github.com/rust-lang/crates.io-index" 2877source = "registry+https://github.com/rust-lang/crates.io-index"
2288checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" 2878checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91"
2289dependencies = [ 2879dependencies = [
2290 "windows_aarch64_gnullvm 0.52.5", 2880 "windows-link",
2291 "windows_aarch64_msvc 0.52.5", 2881 "windows_aarch64_gnullvm 0.53.0",
2292 "windows_i686_gnu 0.52.5", 2882 "windows_aarch64_msvc 0.53.0",
2293 "windows_i686_gnullvm", 2883 "windows_i686_gnu 0.53.0",
2294 "windows_i686_msvc 0.52.5", 2884 "windows_i686_gnullvm 0.53.0",
2295 "windows_x86_64_gnu 0.52.5", 2885 "windows_i686_msvc 0.53.0",
2296 "windows_x86_64_gnullvm 0.52.5", 2886 "windows_x86_64_gnu 0.53.0",
2297 "windows_x86_64_msvc 0.52.5", 2887 "windows_x86_64_gnullvm 0.53.0",
2888 "windows_x86_64_msvc 0.53.0",
2298] 2889]
2299 2890
2300[[package]] 2891[[package]]
2301name = "windows_aarch64_gnullvm" 2892name = "windows_aarch64_gnullvm"
2302version = "0.48.5" 2893version = "0.52.6"
2303source = "registry+https://github.com/rust-lang/crates.io-index" 2894source = "registry+https://github.com/rust-lang/crates.io-index"
2304checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2895checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
2305 2896
2306[[package]] 2897[[package]]
2307name = "windows_aarch64_gnullvm" 2898name = "windows_aarch64_gnullvm"
2308version = "0.52.5" 2899version = "0.53.0"
2309source = "registry+https://github.com/rust-lang/crates.io-index" 2900source = "registry+https://github.com/rust-lang/crates.io-index"
2310checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" 2901checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
2311 2902
2312[[package]] 2903[[package]]
2313name = "windows_aarch64_msvc" 2904name = "windows_aarch64_msvc"
2314version = "0.48.5" 2905version = "0.52.6"
2315source = "registry+https://github.com/rust-lang/crates.io-index" 2906source = "registry+https://github.com/rust-lang/crates.io-index"
2316checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2907checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
2317 2908
2318[[package]] 2909[[package]]
2319name = "windows_aarch64_msvc" 2910name = "windows_aarch64_msvc"
2320version = "0.52.5" 2911version = "0.53.0"
2321source = "registry+https://github.com/rust-lang/crates.io-index" 2912source = "registry+https://github.com/rust-lang/crates.io-index"
2322checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" 2913checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
2323 2914
2324[[package]] 2915[[package]]
2325name = "windows_i686_gnu" 2916name = "windows_i686_gnu"
2326version = "0.48.5" 2917version = "0.52.6"
2327source = "registry+https://github.com/rust-lang/crates.io-index" 2918source = "registry+https://github.com/rust-lang/crates.io-index"
2328checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2919checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
2329 2920
2330[[package]] 2921[[package]]
2331name = "windows_i686_gnu" 2922name = "windows_i686_gnu"
2332version = "0.52.5" 2923version = "0.53.0"
2924source = "registry+https://github.com/rust-lang/crates.io-index"
2925checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
2926
2927[[package]]
2928name = "windows_i686_gnullvm"
2929version = "0.52.6"
2333source = "registry+https://github.com/rust-lang/crates.io-index" 2930source = "registry+https://github.com/rust-lang/crates.io-index"
2334checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" 2931checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
2335 2932
2336[[package]] 2933[[package]]
2337name = "windows_i686_gnullvm" 2934name = "windows_i686_gnullvm"
2338version = "0.52.5" 2935version = "0.53.0"
2339source = "registry+https://github.com/rust-lang/crates.io-index" 2936source = "registry+https://github.com/rust-lang/crates.io-index"
2340checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" 2937checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
2341 2938
2342[[package]] 2939[[package]]
2343name = "windows_i686_msvc" 2940name = "windows_i686_msvc"
2344version = "0.48.5" 2941version = "0.52.6"
2345source = "registry+https://github.com/rust-lang/crates.io-index" 2942source = "registry+https://github.com/rust-lang/crates.io-index"
2346checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2943checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
2347 2944
2348[[package]] 2945[[package]]
2349name = "windows_i686_msvc" 2946name = "windows_i686_msvc"
2350version = "0.52.5" 2947version = "0.53.0"
2351source = "registry+https://github.com/rust-lang/crates.io-index" 2948source = "registry+https://github.com/rust-lang/crates.io-index"
2352checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" 2949checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
2353 2950
2354[[package]] 2951[[package]]
2355name = "windows_x86_64_gnu" 2952name = "windows_x86_64_gnu"
2356version = "0.48.5" 2953version = "0.52.6"
2357source = "registry+https://github.com/rust-lang/crates.io-index" 2954source = "registry+https://github.com/rust-lang/crates.io-index"
2358checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2955checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
2359 2956
2360[[package]] 2957[[package]]
2361name = "windows_x86_64_gnu" 2958name = "windows_x86_64_gnu"
2362version = "0.52.5" 2959version = "0.53.0"
2363source = "registry+https://github.com/rust-lang/crates.io-index" 2960source = "registry+https://github.com/rust-lang/crates.io-index"
2364checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" 2961checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
2365 2962
2366[[package]] 2963[[package]]
2367name = "windows_x86_64_gnullvm" 2964name = "windows_x86_64_gnullvm"
2368version = "0.48.5" 2965version = "0.52.6"
2369source = "registry+https://github.com/rust-lang/crates.io-index" 2966source = "registry+https://github.com/rust-lang/crates.io-index"
2370checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2967checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
2371 2968
2372[[package]] 2969[[package]]
2373name = "windows_x86_64_gnullvm" 2970name = "windows_x86_64_gnullvm"
2374version = "0.52.5" 2971version = "0.53.0"
2375source = "registry+https://github.com/rust-lang/crates.io-index" 2972source = "registry+https://github.com/rust-lang/crates.io-index"
2376checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" 2973checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
2377 2974
2378[[package]] 2975[[package]]
2379name = "windows_x86_64_msvc" 2976name = "windows_x86_64_msvc"
2380version = "0.48.5" 2977version = "0.52.6"
2381source = "registry+https://github.com/rust-lang/crates.io-index" 2978source = "registry+https://github.com/rust-lang/crates.io-index"
2382checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2979checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2383 2980
2384[[package]] 2981[[package]]
2385name = "windows_x86_64_msvc" 2982name = "windows_x86_64_msvc"
2386version = "0.52.5" 2983version = "0.53.0"
2984source = "registry+https://github.com/rust-lang/crates.io-index"
2985checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
2986
2987[[package]]
2988name = "wit-bindgen"
2989version = "0.45.0"
2387source = "registry+https://github.com/rust-lang/crates.io-index" 2990source = "registry+https://github.com/rust-lang/crates.io-index"
2388checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" 2991checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814"
2992
2993[[package]]
2994name = "writeable"
2995version = "0.6.1"
2996source = "registry+https://github.com/rust-lang/crates.io-index"
2997checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
2389 2998
2390[[package]] 2999[[package]]
2391name = "xmlparser" 3000name = "xmlparser"
@@ -2394,27 +3003,105 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2394checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" 3003checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4"
2395 3004
2396[[package]] 3005[[package]]
3006name = "yoke"
3007version = "0.8.0"
3008source = "registry+https://github.com/rust-lang/crates.io-index"
3009checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
3010dependencies = [
3011 "serde",
3012 "stable_deref_trait",
3013 "yoke-derive",
3014 "zerofrom",
3015]
3016
3017[[package]]
3018name = "yoke-derive"
3019version = "0.8.0"
3020source = "registry+https://github.com/rust-lang/crates.io-index"
3021checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
3022dependencies = [
3023 "proc-macro2",
3024 "quote",
3025 "syn",
3026 "synstructure",
3027]
3028
3029[[package]]
2397name = "zerocopy" 3030name = "zerocopy"
2398version = "0.7.32" 3031version = "0.8.26"
2399source = "registry+https://github.com/rust-lang/crates.io-index" 3032source = "registry+https://github.com/rust-lang/crates.io-index"
2400checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" 3033checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
2401dependencies = [ 3034dependencies = [
2402 "zerocopy-derive", 3035 "zerocopy-derive",
2403] 3036]
2404 3037
2405[[package]] 3038[[package]]
2406name = "zerocopy-derive" 3039name = "zerocopy-derive"
2407version = "0.7.32" 3040version = "0.8.26"
3041source = "registry+https://github.com/rust-lang/crates.io-index"
3042checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
3043dependencies = [
3044 "proc-macro2",
3045 "quote",
3046 "syn",
3047]
3048
3049[[package]]
3050name = "zerofrom"
3051version = "0.1.6"
3052source = "registry+https://github.com/rust-lang/crates.io-index"
3053checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
3054dependencies = [
3055 "zerofrom-derive",
3056]
3057
3058[[package]]
3059name = "zerofrom-derive"
3060version = "0.1.6"
2408source = "registry+https://github.com/rust-lang/crates.io-index" 3061source = "registry+https://github.com/rust-lang/crates.io-index"
2409checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" 3062checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
2410dependencies = [ 3063dependencies = [
2411 "proc-macro2", 3064 "proc-macro2",
2412 "quote", 3065 "quote",
2413 "syn", 3066 "syn",
3067 "synstructure",
2414] 3068]
2415 3069
2416[[package]] 3070[[package]]
2417name = "zeroize" 3071name = "zeroize"
2418version = "1.7.0" 3072version = "1.8.1"
3073source = "registry+https://github.com/rust-lang/crates.io-index"
3074checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
3075
3076[[package]]
3077name = "zerotrie"
3078version = "0.2.2"
3079source = "registry+https://github.com/rust-lang/crates.io-index"
3080checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
3081dependencies = [
3082 "displaydoc",
3083 "yoke",
3084 "zerofrom",
3085]
3086
3087[[package]]
3088name = "zerovec"
3089version = "0.11.4"
3090source = "registry+https://github.com/rust-lang/crates.io-index"
3091checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b"
3092dependencies = [
3093 "yoke",
3094 "zerofrom",
3095 "zerovec-derive",
3096]
3097
3098[[package]]
3099name = "zerovec-derive"
3100version = "0.11.1"
2419source = "registry+https://github.com/rust-lang/crates.io-index" 3101source = "registry+https://github.com/rust-lang/crates.io-index"
2420checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" 3102checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
3103dependencies = [
3104 "proc-macro2",
3105 "quote",
3106 "syn",
3107]
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..6daca65 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": 1756731353,
7 "narHash": "sha256-1BVft7ggSN2XXFeXQjazU3jN9wVECd9qp2mZx/8GDMk=", 7 "narHash": "sha256-OylOWF5AASqDHsvZGiLCwBGI1wMvL4gaEMpAM88XqKY=",
8 "owner": "rustsec", 8 "owner": "rustsec",
9 "repo": "advisory-db", 9 "repo": "advisory-db",
10 "rev": "35e7459a331d3e0c585e56dabd03006b9b354088", 10 "rev": "97dec1d752d5ce500b6db833350c13acd02b17cf",
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": 1756705356,
27 "narHash": "sha256-VuLm5tTMqfS82NZAsNfsW7U+pTZ1+GcOU7gYR/Fb1Z4=", 22 "narHash": "sha256-dpBFe8SqYKr7W6KN5QOVCr8N76SBKwTslzjw+4BVBVs=",
28 "rev": "9caad1eb0c69a13ee6467035353b71a76c85ea53", 23 "owner": "ipetkov",
29 "revCount": 540, 24 "repo": "crane",
30 "type": "tarball", 25 "rev": "305707bbc27d83aa1039378e91d7dd816f4cac10",
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": 1756617294,
58 "narHash": "sha256-KtvQeE12MSkCOhvVmnmcZCjnx7t31zWin2XVSDOwBDE=", 55 "narHash": "sha256-aGnd4AHIYCWQKChAkHPpX+YYCt7pA6y2LFFA/s8q0wQ=",
59 "rev": "b500489fd3cf653eafc075f9362423ad5cdd8676", 56 "owner": "NixOS",
60 "revCount": 557957, 57 "repo": "nixpkgs",
61 "type": "tarball", 58 "rev": "b4c2c57c31e68544982226d07e4719a2d86302a8",
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-25.05",
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": 1756694554,
89 "narHash": "sha256-W6Mss7AG6bnFT1BqRApHXvLXBrFOu7V0+EUe9iML30s=", 84 "narHash": "sha256-z/Iy4qvcMqzhA2IAAg71Sw4BrMwbBHvCS90ZoPLsnIk=",
90 "owner": "oxalica", 85 "owner": "oxalica",
91 "repo": "rust-overlay", 86 "repo": "rust-overlay",
92 "rev": "d9b44509b4064f0a3fc9c7c92a603861f52fbedc", 87 "rev": "b29e5365120f344fe7161f14fc9e272fcc41ee56",
93 "type": "github" 88 "type": "github"
94 }, 89 },
95 "original": { 90 "original": {
diff --git a/flake.nix b/flake.nix
index 586486c..5b31ea1 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-25.05";
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..3b1e084 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,
@@ -128,7 +128,7 @@ impl fmt::Display for HexByte {
128 128
129#[derive(Debug, PartialEq, Eq, Copy, Clone)] 129#[derive(Debug, PartialEq, Eq, Copy, Clone)]
130pub enum ParseHexError { 130pub enum ParseHexError {
131 UnevenNibbles, 131 OddNibbleAmount,
132 InvalidCharacter, 132 InvalidCharacter,
133 TooShort, 133 TooShort,
134 TooLong, 134 TooLong,
@@ -137,8 +137,8 @@ pub enum ParseHexError {
137impl fmt::Display for ParseHexError { 137impl fmt::Display for ParseHexError {
138 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 138 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
139 match self { 139 match self {
140 Self::UnevenNibbles => { 140 Self::OddNibbleAmount => {
141 write!(f, "uneven amount of nibbles (chars in range [a-zA-Z0-9])") 141 write!(f, "odd amount of nibbles (chars in range [a-zA-Z0-9])")
142 } 142 }
143 Self::InvalidCharacter => write!(f, "non-hex character encountered"), 143 Self::InvalidCharacter => write!(f, "non-hex character encountered"),
144 Self::TooShort => write!(f, "unexpected end of hex sequence"), 144 Self::TooShort => write!(f, "unexpected end of hex sequence"),
@@ -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::OddNibbleAmount);
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..87c1856 100644
--- a/gitolfs3-server/src/api.rs
+++ b/gitolfs3-server/src/api.rs
@@ -1,89 +1,33 @@
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<'a>(
75 vec![TransferAdapter::Basic] 23 code: http::StatusCode,
24 message: &'a str,
25) -> GitLfsErrorResponse<'a> {
26 (code, GitLfsJson(Json(GitLfsErrorData { message })))
76} 27}
77 28
78#[derive(Debug, Deserialize, PartialEq, Eq, Clone)] 29pub const REPO_NOT_FOUND: GitLfsErrorResponse =
79pub struct BatchRequest { 30 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 31
88#[derive(Debug, Clone)] 32#[derive(Debug, Clone)]
89pub struct GitLfsJson<T>(pub Json<T>); 33pub struct GitLfsJson<T>(pub Json<T>);
@@ -100,7 +44,7 @@ impl IntoResponse for GitLfsJsonRejection {
100 match self { 44 match self {
101 Self::Json(rej) => rej.into_response(), 45 Self::Json(rej) => rej.into_response(),
102 Self::MissingGitLfsJsonContentType => make_error_resp( 46 Self::MissingGitLfsJsonContentType => make_error_resp(
103 StatusCode::UNSUPPORTED_MEDIA_TYPE, 47 http::StatusCode::UNSUPPORTED_MEDIA_TYPE,
104 &format!("Expected request with `Content-Type: {LFS_MIME}`"), 48 &format!("Expected request with `Content-Type: {LFS_MIME}`"),
105 ) 49 )
106 .into_response(), 50 .into_response(),
@@ -125,7 +69,7 @@ pub fn is_git_lfs_json_mimetype(mimetype: &str) -> bool {
125} 69}
126 70
127fn has_git_lfs_json_content_type(req: &Request) -> bool { 71fn has_git_lfs_json_content_type(req: &Request) -> bool {
128 let Some(content_type) = req.headers().get(header::CONTENT_TYPE) else { 72 let Some(content_type) = req.headers().get(http::header::CONTENT_TYPE) else {
129 return false; 73 return false;
130 }; 74 };
131 let Ok(content_type) = content_type.to_str() else { 75 let Ok(content_type) = content_type.to_str() else {
@@ -134,7 +78,6 @@ fn has_git_lfs_json_content_type(req: &Request) -> bool {
134 is_git_lfs_json_mimetype(content_type) 78 is_git_lfs_json_mimetype(content_type)
135} 79}
136 80
137#[async_trait]
138impl<T, S> FromRequest<S> for GitLfsJson<T> 81impl<T, S> FromRequest<S> for GitLfsJson<T>
139where 82where
140 T: DeserializeOwned, 83 T: DeserializeOwned,
@@ -158,46 +101,97 @@ impl<T: Serialize> IntoResponse for GitLfsJson<T> {
158 let GitLfsJson(json) = self; 101 let GitLfsJson(json) = self;
159 let mut resp = json.into_response(); 102 let mut resp = json.into_response();
160 resp.headers_mut().insert( 103 resp.headers_mut().insert(
161 header::CONTENT_TYPE, 104 http::header::CONTENT_TYPE,
162 HeaderValue::from_static("application/vnd.git-lfs+json; charset=utf-8"), 105 http::HeaderValue::from_static("application/vnd.git-lfs+json; charset=utf-8"),
163 ); 106 );
164 resp 107 resp
165 } 108 }
166} 109}
167 110
168#[derive(Debug, Serialize)] 111#[derive(Clone)]
169pub struct GitLfsErrorData<'a> { 112pub struct RepositoryName(pub String);
170 pub message: &'a str, 113
114pub struct RepositoryNameRejection;
115
116impl IntoResponse for RepositoryNameRejection {
117 fn into_response(self) -> Response {
118 (
119 http::StatusCode::INTERNAL_SERVER_ERROR,
120 "Missing repository name",
121 )
122 .into_response()
123 }
171} 124}
172 125
173pub type GitLfsErrorResponse<'a> = (StatusCode, GitLfsJson<GitLfsErrorData<'a>>); 126impl<S: Send + Sync> FromRequestParts<S> for RepositoryName {
127 type Rejection = RepositoryNameRejection;
174 128
175pub const fn make_error_resp(code: StatusCode, message: &str) -> GitLfsErrorResponse { 129 async fn from_request_parts(
176 (code, GitLfsJson(Json(GitLfsErrorData { message }))) 130 parts: &mut http::request::Parts,
131 state: &S,
132 ) -> Result<Self, Self::Rejection> {
133 let Ok(Extension(repo_name)) = Extension::<Self>::from_request_parts(parts, state).await
134 else {
135 return Err(RepositoryNameRejection);
136 };
137 Ok(repo_name)
138 }
177} 139}
178 140
179#[derive(Debug, Serialize, Clone)] 141// ----------------------- Git LFS Batch API -----------------------
180pub struct BatchResponseObjectAction { 142
181 pub href: String, 143#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
182 #[serde(skip_serializing_if = "HashMap::is_empty")] 144pub struct BatchRequest {
183 pub header: HashMap<String, String>, 145 pub operation: Operation,
184 pub expires_at: DateTime<Utc>, 146 #[serde(default = "default_transfers")]
147 pub transfers: Vec<TransferAdapter>,
148 pub objects: Vec<BatchRequestObject>,
149 #[serde(default)]
150 pub hash_algo: HashAlgo,
185} 151}
186 152
187#[derive(Default, Debug, Serialize, Clone)] 153#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
188pub struct BatchResponseObjectActions { 154pub struct BatchRequestObject {
189 #[serde(skip_serializing_if = "Option::is_none")] 155 pub oid: Oid,
190 pub upload: Option<BatchResponseObjectAction>, 156 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} 157}
196 158
197#[derive(Debug, Clone, Serialize)] 159#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)]
198pub struct BatchResponseObjectError { 160pub enum TransferAdapter {
199 pub code: u16, 161 #[serde(rename = "basic")]
200 pub message: String, 162 Basic,
163 #[serde(other)]
164 Unknown,
165}
166
167fn default_transfers() -> Vec<TransferAdapter> {
168 vec![TransferAdapter::Basic]
169}
170
171#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)]
172pub enum HashAlgo {
173 #[serde(rename = "sha256")]
174 Sha256,
175 #[serde(other)]
176 Unknown,
177}
178
179impl Default for HashAlgo {
180 fn default() -> Self {
181 Self::Sha256
182 }
183}
184
185#[derive(Debug, Serialize, Deserialize, Clone)]
186struct BatchRef {
187 name: String,
188}
189
190#[derive(Debug, Serialize, Clone)]
191pub struct BatchResponse {
192 pub transfer: TransferAdapter,
193 pub objects: Vec<BatchResponseObject>,
194 pub hash_algo: HashAlgo,
201} 195}
202 196
203#[derive(Debug, Serialize, Clone)] 197#[derive(Debug, Serialize, Clone)]
@@ -211,10 +205,16 @@ pub struct BatchResponseObject {
211 pub error: Option<BatchResponseObjectError>, 205 pub error: Option<BatchResponseObjectError>,
212} 206}
213 207
208#[derive(Debug, Clone, Serialize)]
209pub struct BatchResponseObjectError {
210 pub code: u16,
211 pub message: String,
212}
213
214impl BatchResponseObject { 214impl BatchResponseObject {
215 pub fn error( 215 pub fn error(
216 obj: &BatchRequestObject, 216 obj: &BatchRequestObject,
217 code: StatusCode, 217 code: http::StatusCode,
218 message: String, 218 message: String,
219 ) -> BatchResponseObject { 219 ) -> BatchResponseObject {
220 BatchResponseObject { 220 BatchResponseObject {
@@ -231,10 +231,21 @@ impl BatchResponseObject {
231} 231}
232 232
233#[derive(Debug, Serialize, Clone)] 233#[derive(Debug, Serialize, Clone)]
234pub struct BatchResponse { 234pub struct BatchResponseObjectAction {
235 pub transfer: TransferAdapter, 235 pub href: String,
236 pub objects: Vec<BatchResponseObject>, 236 #[serde(skip_serializing_if = "HashMap::is_empty")]
237 pub hash_algo: HashAlgo, 237 pub header: HashMap<String, String>,
238 pub expires_at: DateTime<Utc>,
239}
240
241#[derive(Default, Debug, Serialize, Clone)]
242pub struct BatchResponseObjectActions {
243 #[serde(skip_serializing_if = "Option::is_none")]
244 pub upload: Option<BatchResponseObjectAction>,
245 #[serde(skip_serializing_if = "Option::is_none")]
246 pub download: Option<BatchResponseObjectAction>,
247 #[serde(skip_serializing_if = "Option::is_none")]
248 pub verify: Option<BatchResponseObjectAction>,
238} 249}
239 250
240#[test] 251#[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..5167cca 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),
@@ -78,19 +18,11 @@ pub struct AuthorizationConfig {
78 18
79impl Config { 19impl Config {
80 pub fn load() -> Result<Self, String> { 20 pub fn load() -> Result<Self, String> {
81 let env = match Env::load() { 21 let env = Env::load().map_err(|e| format!("failed to load configuration: {e}"))?;
82 Ok(env) => env, 22 let s3_client =
83 Err(e) => return Err(format!("failed to load configuration: {e}")), 23 create_s3_client(&env).map_err(|e| format!("failed to create S3 client: {e}"))?;
84 }; 24 let key =
85 25 load_key(&env.key_path).map_err(|e| format!("failed to load Gitolfs3 key: {e}"))?;
86 let s3_client = match get_s3_client(&env) {
87 Ok(s3_client) => s3_client,
88 Err(e) => return Err(format!("failed to create S3 client: {e}")),
89 };
90 let key = match load_key(&env.key_path) {
91 Ok(key) => key,
92 Err(e) => return Err(format!("failed to load Gitolfs3 key: {e}")),
93 };
94 26
95 let trusted_forwarded_hosts: HashSet<String> = env 27 let trusted_forwarded_hosts: HashSet<String> = env
96 .trusted_forwarded_hosts 28 .trusted_forwarded_hosts
@@ -120,3 +52,63 @@ impl Config {
120 }) 52 })
121 } 53 }
122} 54}
55
56fn create_s3_client(env: &Env) -> Result<aws_sdk_s3::Client, std::io::Error> {
57 let access_key_id = std::fs::read_to_string(&env.s3_access_key_id)?;
58 let secret_access_key = std::fs::read_to_string(&env.s3_secret_access_key)?;
59
60 let credentials = aws_sdk_s3::config::Credentials::new(
61 access_key_id,
62 secret_access_key,
63 None,
64 None,
65 "gitolfs3-env",
66 );
67 let config = aws_config::SdkConfig::builder()
68 .behavior_version(aws_config::BehaviorVersion::latest())
69 .region(aws_config::Region::new(env.s3_region.clone()))
70 .endpoint_url(&env.s3_endpoint)
71 .credentials_provider(aws_sdk_s3::config::SharedCredentialsProvider::new(
72 credentials,
73 ))
74 .build();
75 Ok(aws_sdk_s3::Client::new(&config))
76}
77
78struct Env {
79 s3_access_key_id: String,
80 s3_secret_access_key: String,
81 s3_bucket: String,
82 s3_region: String,
83 s3_endpoint: String,
84 base_url: String,
85 key_path: String,
86 listen_host: String,
87 listen_port: String,
88 download_limit: String,
89 trusted_forwarded_hosts: String,
90}
91
92impl Env {
93 fn load() -> Result<Env, String> {
94 Ok(Env {
95 s3_secret_access_key: require_env("GITOLFS3_S3_SECRET_ACCESS_KEY_FILE")?,
96 s3_access_key_id: require_env("GITOLFS3_S3_ACCESS_KEY_ID_FILE")?,
97 s3_region: require_env("GITOLFS3_S3_REGION")?,
98 s3_endpoint: require_env("GITOLFS3_S3_ENDPOINT")?,
99 s3_bucket: require_env("GITOLFS3_S3_BUCKET")?,
100 base_url: require_env("GITOLFS3_BASE_URL")?,
101 key_path: require_env("GITOLFS3_KEY_PATH")?,
102 listen_host: require_env("GITOLFS3_LISTEN_HOST")?,
103 listen_port: require_env("GITOLFS3_LISTEN_PORT")?,
104 download_limit: require_env("GITOLFS3_DOWNLOAD_LIMIT")?,
105 trusted_forwarded_hosts: std::env::var("GITOLFS3_TRUSTED_FORWARDED_HOSTS")
106 .unwrap_or_default(),
107 })
108 }
109}
110
111fn require_env(name: &str) -> Result<String, String> {
112 std::env::var(name)
113 .map_err(|_| format!("environment variable {name} should be defined and valid"))
114}
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..c5d4a61 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) 88 return BatchResponseObject::error(
145 .key(&full_path) 89 obj,
146 .checksum_mode(aws_sdk_s3::types::ChecksumMode::Enabled) 90 http::StatusCode::UNPROCESSABLE_ENTITY,
147 .send() 91 "Object corrupted".to_string(),
148 .await 92 );
149 { 93 }
150 Ok(result) => result, 94 Err(_) => {
151 Err(e) => {
152 println!("Failed to HeadObject (repo {repo}, OID {}): {e}", obj.oid);
153 return BatchResponseObject::error( 95 return BatchResponseObject::error(
154 obj, 96 obj,
155 StatusCode::INTERNAL_SERVER_ERROR, 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,31 +144,31 @@ 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 && content_length > 0
223 match state 149 {
224 .dl_limiter 150 match state
225 .lock() 151 .dl_limiter
226 .await 152 .lock()
227 .request(content_length as u64) 153 .await
228 .await 154 .request(content_length as u64)
229 { 155 .await
230 Ok(true) => {} 156 {
231 Ok(false) => { 157 Ok(true) => {}
232 return BatchResponseObject::error( 158 Ok(false) => {
233 obj, 159 return BatchResponseObject::error(
234 StatusCode::SERVICE_UNAVAILABLE, 160 obj,
235 "Public LFS downloads temporarily unavailable".to_string(), 161 http::StatusCode::SERVICE_UNAVAILABLE,
236 ); 162 "Public LFS downloads temporarily unavailable".to_string(),
237 } 163 );
238 Err(e) => { 164 }
239 println!("Failed to request {content_length} bytes from download limiter: {e}"); 165 Err(e) => {
240 return BatchResponseObject::error( 166 println!("Failed to request {content_length} bytes from download limiter: {e}");
241 obj, 167 return BatchResponseObject::error(
242 StatusCode::INTERNAL_SERVER_ERROR, 168 obj,
243 "Internal server error".to_string(), 169 http::StatusCode::INTERNAL_SERVER_ERROR,
244 ); 170 "Internal server error".to_string(),
245 } 171 );
246 } 172 }
247 } 173 }
248 } 174 }
@@ -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,168 @@ 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 && let Ok(checksum) = BASE64_STANDARD.decode(checksum)
438 && let Ok(checksum32b) = TryInto::<[u8; 32]>::try_into(checksum)
439 {
440 return Oid::from(checksum32b) == oid;
441 }
442 true
443}
444
445fn s3_validate_size(expected: i64, obj: &HeadObjectOutput) -> bool {
446 if let Some(length) = obj.content_length() {
447 return length == expected;
448 }
449 true
450}
451
452fn repo_exists(name: &str) -> bool {
453 let Ok(metadata) = std::fs::metadata(name) else {
454 return false;
455 };
456 metadata.is_dir()
457}
458
459fn is_repo_public(name: &str) -> Option<bool> {
460 if !repo_exists(name) {
461 return None;
462 }
463 match std::fs::metadata(format!("{name}/git-daemon-export-ok")) {
464 Ok(metadata) if metadata.is_file() => Some(true),
465 Err(e) if e.kind() == std::io::ErrorKind::NotFound => Some(false),
466 _ => None,
467 }
468}
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]