aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1609
-rw-r--r--README.md43
-rw-r--r--docs/man/gitolfs3-server.119
-rw-r--r--docs/man/gitolfs3-shell.18
-rw-r--r--flake.lock71
-rw-r--r--flake.nix14
-rw-r--r--gitolfs3-authenticate/Cargo.toml2
-rw-r--r--gitolfs3-authenticate/src/main.rs8
-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.rs213
-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.rs531
-rw-r--r--gitolfs3-server/src/main.rs25
-rw-r--r--gitolfs3-shell/Cargo.toml2
18 files changed, 1547 insertions, 1258 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 00f856e..d7f401e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,54 +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
5[[package]]
6name = "addr2line"
7version = "0.21.0"
8source = "registry+https://github.com/rust-lang/crates.io-index"
9checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
10dependencies = [
11 "gimli",
12]
13
14[[package]]
15name = "adler"
16version = "1.0.2"
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"
24checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
25dependencies = [
26 "cfg-if",
27 "once_cell",
28 "version_check",
29 "zerocopy",
30]
31 4
32[[package]] 5[[package]]
33name = "aho-corasick" 6name = "aho-corasick"
34version = "1.1.3" 7version = "1.1.4"
35source = "registry+https://github.com/rust-lang/crates.io-index" 8source = "registry+https://github.com/rust-lang/crates.io-index"
36checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 9checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
37dependencies = [ 10dependencies = [
38 "memchr", 11 "memchr",
39] 12]
40 13
41[[package]] 14[[package]]
42name = "allocator-api2" 15name = "allocator-api2"
43version = "0.2.18" 16version = "0.2.21"
44source = "registry+https://github.com/rust-lang/crates.io-index" 17source = "registry+https://github.com/rust-lang/crates.io-index"
45checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" 18checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
46
47[[package]]
48name = "android-tzdata"
49version = "0.1.1"
50source = "registry+https://github.com/rust-lang/crates.io-index"
51checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
52 19
53[[package]] 20[[package]]
54name = "android_system_properties" 21name = "android_system_properties"
@@ -61,32 +28,27 @@ dependencies = [
61 28
62[[package]] 29[[package]]
63name = "anyhow" 30name = "anyhow"
64version = "1.0.82" 31version = "1.0.102"
65source = "registry+https://github.com/rust-lang/crates.io-index" 32source = "registry+https://github.com/rust-lang/crates.io-index"
66checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" 33checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
67 34
68[[package]] 35[[package]]
69name = "async-trait" 36name = "atomic-waker"
70version = "0.1.80" 37version = "1.1.2"
71source = "registry+https://github.com/rust-lang/crates.io-index" 38source = "registry+https://github.com/rust-lang/crates.io-index"
72checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" 39checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
73dependencies = [
74 "proc-macro2",
75 "quote",
76 "syn",
77]
78 40
79[[package]] 41[[package]]
80name = "autocfg" 42name = "autocfg"
81version = "1.2.0" 43version = "1.5.0"
82source = "registry+https://github.com/rust-lang/crates.io-index" 44source = "registry+https://github.com/rust-lang/crates.io-index"
83checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" 45checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
84 46
85[[package]] 47[[package]]
86name = "aws-config" 48name = "aws-config"
87version = "1.2.1" 49version = "1.8.15"
88source = "registry+https://github.com/rust-lang/crates.io-index" 50source = "registry+https://github.com/rust-lang/crates.io-index"
89checksum = "b2a4707646259764ab59fd9a50e9de2e92c637b28b36285d6f6fa030e915fbd9" 51checksum = "11493b0bad143270fb8ad284a096dd529ba91924c5409adeac856cc1bf047dbc"
90dependencies = [ 52dependencies = [
91 "aws-credential-types", 53 "aws-credential-types",
92 "aws-runtime", 54 "aws-runtime",
@@ -103,9 +65,8 @@ dependencies = [
103 "bytes", 65 "bytes",
104 "fastrand", 66 "fastrand",
105 "hex", 67 "hex",
106 "http 0.2.12", 68 "http 1.4.0",
107 "hyper 0.14.28", 69 "sha1",
108 "ring",
109 "time", 70 "time",
110 "tokio", 71 "tokio",
111 "tracing", 72 "tracing",
@@ -115,9 +76,9 @@ dependencies = [
115 76
116[[package]] 77[[package]]
117name = "aws-credential-types" 78name = "aws-credential-types"
118version = "1.2.0" 79version = "1.2.14"
119source = "registry+https://github.com/rust-lang/crates.io-index" 80source = "registry+https://github.com/rust-lang/crates.io-index"
120checksum = "e16838e6c9e12125face1c1eff1343c75e3ff540de98ff7ebd61874a89bcfeb9" 81checksum = "8f20799b373a1be121fe3005fba0c2090af9411573878f224df44b42727fcaf7"
121dependencies = [ 82dependencies = [
122 "aws-smithy-async", 83 "aws-smithy-async",
123 "aws-smithy-runtime-api", 84 "aws-smithy-runtime-api",
@@ -126,23 +87,49 @@ dependencies = [
126] 87]
127 88
128[[package]] 89[[package]]
90name = "aws-lc-rs"
91version = "1.16.2"
92source = "registry+https://github.com/rust-lang/crates.io-index"
93checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc"
94dependencies = [
95 "aws-lc-sys",
96 "zeroize",
97]
98
99[[package]]
100name = "aws-lc-sys"
101version = "0.39.1"
102source = "registry+https://github.com/rust-lang/crates.io-index"
103checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399"
104dependencies = [
105 "cc",
106 "cmake",
107 "dunce",
108 "fs_extra",
109]
110
111[[package]]
129name = "aws-runtime" 112name = "aws-runtime"
130version = "1.2.0" 113version = "1.7.2"
131source = "registry+https://github.com/rust-lang/crates.io-index" 114source = "registry+https://github.com/rust-lang/crates.io-index"
132checksum = "f4963ac9ff2d33a4231b3806c1c69f578f221a9cabb89ad2bde62ce2b442c8a7" 115checksum = "5fc0651c57e384202e47153c1260b84a9936e19803d747615edf199dc3b98d17"
133dependencies = [ 116dependencies = [
134 "aws-credential-types", 117 "aws-credential-types",
135 "aws-sigv4", 118 "aws-sigv4",
136 "aws-smithy-async", 119 "aws-smithy-async",
137 "aws-smithy-eventstream", 120 "aws-smithy-eventstream",
138 "aws-smithy-http", 121 "aws-smithy-http",
122 "aws-smithy-runtime",
139 "aws-smithy-runtime-api", 123 "aws-smithy-runtime-api",
140 "aws-smithy-types", 124 "aws-smithy-types",
141 "aws-types", 125 "aws-types",
142 "bytes", 126 "bytes",
127 "bytes-utils",
143 "fastrand", 128 "fastrand",
144 "http 0.2.12", 129 "http 0.2.12",
130 "http 1.4.0",
145 "http-body 0.4.6", 131 "http-body 0.4.6",
132 "http-body 1.0.1",
146 "percent-encoding", 133 "percent-encoding",
147 "pin-project-lite", 134 "pin-project-lite",
148 "tracing", 135 "tracing",
@@ -151,11 +138,10 @@ dependencies = [
151 138
152[[package]] 139[[package]]
153name = "aws-sdk-s3" 140name = "aws-sdk-s3"
154version = "1.24.0" 141version = "1.129.0"
155source = "registry+https://github.com/rust-lang/crates.io-index" 142source = "registry+https://github.com/rust-lang/crates.io-index"
156checksum = "7f522b68eb0294c59f7beb0defa30e84fed24ebc50ee219e111d6c33eaea96a8" 143checksum = "6d4e8410fadbc0ee453145dd77a4958227b18b05bf67c2795d0a8b8596c9aa0f"
157dependencies = [ 144dependencies = [
158 "ahash",
159 "aws-credential-types", 145 "aws-credential-types",
160 "aws-runtime", 146 "aws-runtime",
161 "aws-sigv4", 147 "aws-sigv4",
@@ -164,6 +150,7 @@ dependencies = [
164 "aws-smithy-eventstream", 150 "aws-smithy-eventstream",
165 "aws-smithy-http", 151 "aws-smithy-http",
166 "aws-smithy-json", 152 "aws-smithy-json",
153 "aws-smithy-observability",
167 "aws-smithy-runtime", 154 "aws-smithy-runtime",
168 "aws-smithy-runtime-api", 155 "aws-smithy-runtime-api",
169 "aws-smithy-types", 156 "aws-smithy-types",
@@ -174,9 +161,9 @@ dependencies = [
174 "hex", 161 "hex",
175 "hmac", 162 "hmac",
176 "http 0.2.12", 163 "http 0.2.12",
177 "http-body 0.4.6", 164 "http 1.4.0",
165 "http-body 1.0.1",
178 "lru", 166 "lru",
179 "once_cell",
180 "percent-encoding", 167 "percent-encoding",
181 "regex-lite", 168 "regex-lite",
182 "sha2", 169 "sha2",
@@ -186,76 +173,82 @@ dependencies = [
186 173
187[[package]] 174[[package]]
188name = "aws-sdk-sso" 175name = "aws-sdk-sso"
189version = "1.21.0" 176version = "1.97.0"
190source = "registry+https://github.com/rust-lang/crates.io-index" 177source = "registry+https://github.com/rust-lang/crates.io-index"
191checksum = "3d70fb493f4183f5102d8a8d0cc9b57aec29a762f55c0e7bf527e0f7177bb408" 178checksum = "9aadc669e184501caaa6beafb28c6267fc1baef0810fb58f9b205485ca3f2567"
192dependencies = [ 179dependencies = [
193 "aws-credential-types", 180 "aws-credential-types",
194 "aws-runtime", 181 "aws-runtime",
195 "aws-smithy-async", 182 "aws-smithy-async",
196 "aws-smithy-http", 183 "aws-smithy-http",
197 "aws-smithy-json", 184 "aws-smithy-json",
185 "aws-smithy-observability",
198 "aws-smithy-runtime", 186 "aws-smithy-runtime",
199 "aws-smithy-runtime-api", 187 "aws-smithy-runtime-api",
200 "aws-smithy-types", 188 "aws-smithy-types",
201 "aws-types", 189 "aws-types",
202 "bytes", 190 "bytes",
191 "fastrand",
203 "http 0.2.12", 192 "http 0.2.12",
204 "once_cell", 193 "http 1.4.0",
205 "regex-lite", 194 "regex-lite",
206 "tracing", 195 "tracing",
207] 196]
208 197
209[[package]] 198[[package]]
210name = "aws-sdk-ssooidc" 199name = "aws-sdk-ssooidc"
211version = "1.21.0" 200version = "1.99.0"
212source = "registry+https://github.com/rust-lang/crates.io-index" 201source = "registry+https://github.com/rust-lang/crates.io-index"
213checksum = "de3f37549b3e38b7ea5efd419d4d7add6ea1e55223506eb0b4fef9d25e7cc90d" 202checksum = "1342a7db8f358d3de0aed2007a0b54e875458e39848d54cc1d46700b2bfcb0a8"
214dependencies = [ 203dependencies = [
215 "aws-credential-types", 204 "aws-credential-types",
216 "aws-runtime", 205 "aws-runtime",
217 "aws-smithy-async", 206 "aws-smithy-async",
218 "aws-smithy-http", 207 "aws-smithy-http",
219 "aws-smithy-json", 208 "aws-smithy-json",
209 "aws-smithy-observability",
220 "aws-smithy-runtime", 210 "aws-smithy-runtime",
221 "aws-smithy-runtime-api", 211 "aws-smithy-runtime-api",
222 "aws-smithy-types", 212 "aws-smithy-types",
223 "aws-types", 213 "aws-types",
224 "bytes", 214 "bytes",
215 "fastrand",
225 "http 0.2.12", 216 "http 0.2.12",
226 "once_cell", 217 "http 1.4.0",
227 "regex-lite", 218 "regex-lite",
228 "tracing", 219 "tracing",
229] 220]
230 221
231[[package]] 222[[package]]
232name = "aws-sdk-sts" 223name = "aws-sdk-sts"
233version = "1.21.0" 224version = "1.101.0"
234source = "registry+https://github.com/rust-lang/crates.io-index" 225source = "registry+https://github.com/rust-lang/crates.io-index"
235checksum = "3b2ff219a5d4b795cd33251c19dbe9c4b401f2b2cbe513e07c76ada644eaf34e" 226checksum = "ab41ad64e4051ecabeea802d6a17845a91e83287e1dd249e6963ea1ba78c428a"
236dependencies = [ 227dependencies = [
237 "aws-credential-types", 228 "aws-credential-types",
238 "aws-runtime", 229 "aws-runtime",
239 "aws-smithy-async", 230 "aws-smithy-async",
240 "aws-smithy-http", 231 "aws-smithy-http",
241 "aws-smithy-json", 232 "aws-smithy-json",
233 "aws-smithy-observability",
242 "aws-smithy-query", 234 "aws-smithy-query",
243 "aws-smithy-runtime", 235 "aws-smithy-runtime",
244 "aws-smithy-runtime-api", 236 "aws-smithy-runtime-api",
245 "aws-smithy-types", 237 "aws-smithy-types",
246 "aws-smithy-xml", 238 "aws-smithy-xml",
247 "aws-types", 239 "aws-types",
240 "fastrand",
248 "http 0.2.12", 241 "http 0.2.12",
249 "once_cell", 242 "http 1.4.0",
250 "regex-lite", 243 "regex-lite",
251 "tracing", 244 "tracing",
252] 245]
253 246
254[[package]] 247[[package]]
255name = "aws-sigv4" 248name = "aws-sigv4"
256version = "1.2.1" 249version = "1.4.2"
257source = "registry+https://github.com/rust-lang/crates.io-index" 250source = "registry+https://github.com/rust-lang/crates.io-index"
258checksum = "58b56f1cbe6fd4d0c2573df72868f20ab1c125ca9c9dbce17927a463433a2e57" 251checksum = "b0b660013a6683ab23797778e21f1f854744fdf05f68204b4cca4c8c04b5d1f4"
259dependencies = [ 252dependencies = [
260 "aws-credential-types", 253 "aws-credential-types",
261 "aws-smithy-eventstream", 254 "aws-smithy-eventstream",
@@ -268,8 +261,7 @@ dependencies = [
268 "hex", 261 "hex",
269 "hmac", 262 "hmac",
270 "http 0.2.12", 263 "http 0.2.12",
271 "http 1.1.0", 264 "http 1.4.0",
272 "once_cell",
273 "p256", 265 "p256",
274 "percent-encoding", 266 "percent-encoding",
275 "ring", 267 "ring",
@@ -282,9 +274,9 @@ dependencies = [
282 274
283[[package]] 275[[package]]
284name = "aws-smithy-async" 276name = "aws-smithy-async"
285version = "1.2.1" 277version = "1.2.14"
286source = "registry+https://github.com/rust-lang/crates.io-index" 278source = "registry+https://github.com/rust-lang/crates.io-index"
287checksum = "62220bc6e97f946ddd51b5f1361f78996e704677afc518a4ff66b7a72ea1378c" 279checksum = "2ffcaf626bdda484571968400c326a244598634dc75fd451325a54ad1a59acfc"
288dependencies = [ 280dependencies = [
289 "futures-util", 281 "futures-util",
290 "pin-project-lite", 282 "pin-project-lite",
@@ -293,18 +285,18 @@ dependencies = [
293 285
294[[package]] 286[[package]]
295name = "aws-smithy-checksums" 287name = "aws-smithy-checksums"
296version = "0.60.7" 288version = "0.64.6"
297source = "registry+https://github.com/rust-lang/crates.io-index" 289source = "registry+https://github.com/rust-lang/crates.io-index"
298checksum = "83fa43bc04a6b2441968faeab56e68da3812f978a670a5db32accbdcafddd12f" 290checksum = "6750f3dd509b0694a4377f0293ed2f9630d710b1cebe281fa8bac8f099f88bc6"
299dependencies = [ 291dependencies = [
300 "aws-smithy-http", 292 "aws-smithy-http",
301 "aws-smithy-types", 293 "aws-smithy-types",
302 "bytes", 294 "bytes",
303 "crc32c", 295 "crc-fast",
304 "crc32fast",
305 "hex", 296 "hex",
306 "http 0.2.12", 297 "http 1.4.0",
307 "http-body 0.4.6", 298 "http-body 1.0.1",
299 "http-body-util",
308 "md-5", 300 "md-5",
309 "pin-project-lite", 301 "pin-project-lite",
310 "sha1", 302 "sha1",
@@ -314,9 +306,9 @@ dependencies = [
314 306
315[[package]] 307[[package]]
316name = "aws-smithy-eventstream" 308name = "aws-smithy-eventstream"
317version = "0.60.4" 309version = "0.60.20"
318source = "registry+https://github.com/rust-lang/crates.io-index" 310source = "registry+https://github.com/rust-lang/crates.io-index"
319checksum = "e6363078f927f612b970edf9d1903ef5cef9a64d1e8423525ebb1f0a1633c858" 311checksum = "faf09d74e5e32f76b8762da505a3cd59303e367a664ca67295387baa8c1d7548"
320dependencies = [ 312dependencies = [
321 "aws-smithy-types", 313 "aws-smithy-types",
322 "bytes", 314 "bytes",
@@ -325,9 +317,9 @@ dependencies = [
325 317
326[[package]] 318[[package]]
327name = "aws-smithy-http" 319name = "aws-smithy-http"
328version = "0.60.8" 320version = "0.63.6"
329source = "registry+https://github.com/rust-lang/crates.io-index" 321source = "registry+https://github.com/rust-lang/crates.io-index"
330checksum = "4a7de001a1b9a25601016d8057ea16e31a45fdca3751304c8edf4ad72e706c08" 322checksum = "ba1ab2dc1c2c3749ead27180d333c42f11be8b0e934058fb4b2258ee8dbe5231"
331dependencies = [ 323dependencies = [
332 "aws-smithy-eventstream", 324 "aws-smithy-eventstream",
333 "aws-smithy-runtime-api", 325 "aws-smithy-runtime-api",
@@ -335,9 +327,10 @@ dependencies = [
335 "bytes", 327 "bytes",
336 "bytes-utils", 328 "bytes-utils",
337 "futures-core", 329 "futures-core",
338 "http 0.2.12", 330 "futures-util",
339 "http-body 0.4.6", 331 "http 1.4.0",
340 "once_cell", 332 "http-body 1.0.1",
333 "http-body-util",
341 "percent-encoding", 334 "percent-encoding",
342 "pin-project-lite", 335 "pin-project-lite",
343 "pin-utils", 336 "pin-utils",
@@ -345,19 +338,58 @@ dependencies = [
345] 338]
346 339
347[[package]] 340[[package]]
341name = "aws-smithy-http-client"
342version = "1.1.12"
343source = "registry+https://github.com/rust-lang/crates.io-index"
344checksum = "6a2f165a7feee6f263028b899d0a181987f4fa7179a6411a32a439fba7c5f769"
345dependencies = [
346 "aws-smithy-async",
347 "aws-smithy-runtime-api",
348 "aws-smithy-types",
349 "h2 0.3.27",
350 "h2 0.4.13",
351 "http 0.2.12",
352 "http 1.4.0",
353 "http-body 0.4.6",
354 "hyper 0.14.32",
355 "hyper 1.9.0",
356 "hyper-rustls 0.24.2",
357 "hyper-rustls 0.27.7",
358 "hyper-util",
359 "pin-project-lite",
360 "rustls 0.21.12",
361 "rustls 0.23.37",
362 "rustls-native-certs",
363 "rustls-pki-types",
364 "tokio",
365 "tokio-rustls 0.26.4",
366 "tower",
367 "tracing",
368]
369
370[[package]]
348name = "aws-smithy-json" 371name = "aws-smithy-json"
349version = "0.60.7" 372version = "0.62.5"
350source = "registry+https://github.com/rust-lang/crates.io-index" 373source = "registry+https://github.com/rust-lang/crates.io-index"
351checksum = "4683df9469ef09468dad3473d129960119a0d3593617542b7d52086c8486f2d6" 374checksum = "9648b0bb82a2eedd844052c6ad2a1a822d1f8e3adee5fbf668366717e428856a"
352dependencies = [ 375dependencies = [
353 "aws-smithy-types", 376 "aws-smithy-types",
354] 377]
355 378
356[[package]] 379[[package]]
380name = "aws-smithy-observability"
381version = "0.2.6"
382source = "registry+https://github.com/rust-lang/crates.io-index"
383checksum = "a06c2315d173edbf1920da8ba3a7189695827002e4c0fc961973ab1c54abca9c"
384dependencies = [
385 "aws-smithy-runtime-api",
386]
387
388[[package]]
357name = "aws-smithy-query" 389name = "aws-smithy-query"
358version = "0.60.7" 390version = "0.60.15"
359source = "registry+https://github.com/rust-lang/crates.io-index" 391source = "registry+https://github.com/rust-lang/crates.io-index"
360checksum = "f2fbd61ceb3fe8a1cb7352e42689cec5335833cd9f94103a61e98f9bb61c64bb" 392checksum = "1a56d79744fb3edb5d722ef79d86081e121d3b9422cb209eb03aea6aa4f21ebd"
361dependencies = [ 393dependencies = [
362 "aws-smithy-types", 394 "aws-smithy-types",
363 "urlencoding", 395 "urlencoding",
@@ -365,41 +397,40 @@ dependencies = [
365 397
366[[package]] 398[[package]]
367name = "aws-smithy-runtime" 399name = "aws-smithy-runtime"
368version = "1.3.1" 400version = "1.10.3"
369source = "registry+https://github.com/rust-lang/crates.io-index" 401source = "registry+https://github.com/rust-lang/crates.io-index"
370checksum = "44e7945379821074549168917e89e60630647e186a69243248f08c6d168b975a" 402checksum = "028999056d2d2fd58a697232f9eec4a643cf73a71cf327690a7edad1d2af2110"
371dependencies = [ 403dependencies = [
372 "aws-smithy-async", 404 "aws-smithy-async",
373 "aws-smithy-http", 405 "aws-smithy-http",
406 "aws-smithy-http-client",
407 "aws-smithy-observability",
374 "aws-smithy-runtime-api", 408 "aws-smithy-runtime-api",
375 "aws-smithy-types", 409 "aws-smithy-types",
376 "bytes", 410 "bytes",
377 "fastrand", 411 "fastrand",
378 "h2",
379 "http 0.2.12", 412 "http 0.2.12",
413 "http 1.4.0",
380 "http-body 0.4.6", 414 "http-body 0.4.6",
381 "http-body 1.0.0", 415 "http-body 1.0.1",
382 "hyper 0.14.28", 416 "http-body-util",
383 "hyper-rustls",
384 "once_cell",
385 "pin-project-lite", 417 "pin-project-lite",
386 "pin-utils", 418 "pin-utils",
387 "rustls",
388 "tokio", 419 "tokio",
389 "tracing", 420 "tracing",
390] 421]
391 422
392[[package]] 423[[package]]
393name = "aws-smithy-runtime-api" 424name = "aws-smithy-runtime-api"
394version = "1.4.0" 425version = "1.11.6"
395source = "registry+https://github.com/rust-lang/crates.io-index" 426source = "registry+https://github.com/rust-lang/crates.io-index"
396checksum = "4cc56a5c96ec741de6c5e6bf1ce6948be969d6506dfa9c39cffc284e31e4979b" 427checksum = "876ab3c9c29791ba4ba02b780a3049e21ec63dabda09268b175272c3733a79e6"
397dependencies = [ 428dependencies = [
398 "aws-smithy-async", 429 "aws-smithy-async",
399 "aws-smithy-types", 430 "aws-smithy-types",
400 "bytes", 431 "bytes",
401 "http 0.2.12", 432 "http 0.2.12",
402 "http 1.1.0", 433 "http 1.4.0",
403 "pin-project-lite", 434 "pin-project-lite",
404 "tokio", 435 "tokio",
405 "tracing", 436 "tracing",
@@ -408,18 +439,18 @@ dependencies = [
408 439
409[[package]] 440[[package]]
410name = "aws-smithy-types" 441name = "aws-smithy-types"
411version = "1.1.8" 442version = "1.4.7"
412source = "registry+https://github.com/rust-lang/crates.io-index" 443source = "registry+https://github.com/rust-lang/crates.io-index"
413checksum = "abe14dceea1e70101d38fbf2a99e6a34159477c0fb95e68e05c66bd7ae4c3729" 444checksum = "9d73dbfbaa8e4bc57b9045137680b958d274823509a360abfd8e1d514d40c95c"
414dependencies = [ 445dependencies = [
415 "base64-simd", 446 "base64-simd",
416 "bytes", 447 "bytes",
417 "bytes-utils", 448 "bytes-utils",
418 "futures-core", 449 "futures-core",
419 "http 0.2.12", 450 "http 0.2.12",
420 "http 1.1.0", 451 "http 1.4.0",
421 "http-body 0.4.6", 452 "http-body 0.4.6",
422 "http-body 1.0.0", 453 "http-body 1.0.1",
423 "http-body-util", 454 "http-body-util",
424 "itoa", 455 "itoa",
425 "num-integer", 456 "num-integer",
@@ -434,42 +465,41 @@ dependencies = [
434 465
435[[package]] 466[[package]]
436name = "aws-smithy-xml" 467name = "aws-smithy-xml"
437version = "0.60.8" 468version = "0.60.15"
438source = "registry+https://github.com/rust-lang/crates.io-index" 469source = "registry+https://github.com/rust-lang/crates.io-index"
439checksum = "d123fbc2a4adc3c301652ba8e149bf4bc1d1725affb9784eb20c953ace06bf55" 470checksum = "0ce02add1aa3677d022f8adf81dcbe3046a95f17a1b1e8979c145cd21d3d22b3"
440dependencies = [ 471dependencies = [
441 "xmlparser", 472 "xmlparser",
442] 473]
443 474
444[[package]] 475[[package]]
445name = "aws-types" 476name = "aws-types"
446version = "1.2.0" 477version = "1.3.14"
447source = "registry+https://github.com/rust-lang/crates.io-index" 478source = "registry+https://github.com/rust-lang/crates.io-index"
448checksum = "5a43b56df2c529fe44cb4d92bd64d0479883fb9608ff62daede4df5405381814" 479checksum = "47c8323699dd9b3c8d5b3c13051ae9cdef58fd179957c882f8374dd8725962d9"
449dependencies = [ 480dependencies = [
450 "aws-credential-types", 481 "aws-credential-types",
451 "aws-smithy-async", 482 "aws-smithy-async",
452 "aws-smithy-runtime-api", 483 "aws-smithy-runtime-api",
453 "aws-smithy-types", 484 "aws-smithy-types",
454 "http 0.2.12",
455 "rustc_version", 485 "rustc_version",
456 "tracing", 486 "tracing",
457] 487]
458 488
459[[package]] 489[[package]]
460name = "axum" 490name = "axum"
461version = "0.7.5" 491version = "0.8.8"
462source = "registry+https://github.com/rust-lang/crates.io-index" 492source = "registry+https://github.com/rust-lang/crates.io-index"
463checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" 493checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8"
464dependencies = [ 494dependencies = [
465 "async-trait",
466 "axum-core", 495 "axum-core",
467 "bytes", 496 "bytes",
497 "form_urlencoded",
468 "futures-util", 498 "futures-util",
469 "http 1.1.0", 499 "http 1.4.0",
470 "http-body 1.0.0", 500 "http-body 1.0.1",
471 "http-body-util", 501 "http-body-util",
472 "hyper 1.3.1", 502 "hyper 1.9.0",
473 "hyper-util", 503 "hyper-util",
474 "itoa", 504 "itoa",
475 "matchit", 505 "matchit",
@@ -477,12 +507,11 @@ dependencies = [
477 "mime", 507 "mime",
478 "percent-encoding", 508 "percent-encoding",
479 "pin-project-lite", 509 "pin-project-lite",
480 "rustversion", 510 "serde_core",
481 "serde",
482 "serde_json", 511 "serde_json",
483 "serde_path_to_error", 512 "serde_path_to_error",
484 "serde_urlencoded", 513 "serde_urlencoded",
485 "sync_wrapper 1.0.1", 514 "sync_wrapper",
486 "tokio", 515 "tokio",
487 "tower", 516 "tower",
488 "tower-layer", 517 "tower-layer",
@@ -492,41 +521,24 @@ dependencies = [
492 521
493[[package]] 522[[package]]
494name = "axum-core" 523name = "axum-core"
495version = "0.4.3" 524version = "0.5.6"
496source = "registry+https://github.com/rust-lang/crates.io-index" 525source = "registry+https://github.com/rust-lang/crates.io-index"
497checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" 526checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
498dependencies = [ 527dependencies = [
499 "async-trait",
500 "bytes", 528 "bytes",
501 "futures-util", 529 "futures-core",
502 "http 1.1.0", 530 "http 1.4.0",
503 "http-body 1.0.0", 531 "http-body 1.0.1",
504 "http-body-util", 532 "http-body-util",
505 "mime", 533 "mime",
506 "pin-project-lite", 534 "pin-project-lite",
507 "rustversion", 535 "sync_wrapper",
508 "sync_wrapper 0.1.2",
509 "tower-layer", 536 "tower-layer",
510 "tower-service", 537 "tower-service",
511 "tracing", 538 "tracing",
512] 539]
513 540
514[[package]] 541[[package]]
515name = "backtrace"
516version = "0.3.71"
517source = "registry+https://github.com/rust-lang/crates.io-index"
518checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d"
519dependencies = [
520 "addr2line",
521 "cc",
522 "cfg-if",
523 "libc",
524 "miniz_oxide",
525 "object",
526 "rustc-demangle",
527]
528
529[[package]]
530name = "base16ct" 542name = "base16ct"
531version = "0.1.1" 543version = "0.1.1"
532source = "registry+https://github.com/rust-lang/crates.io-index" 544source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -534,9 +546,9 @@ checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce"
534 546
535[[package]] 547[[package]]
536name = "base64" 548name = "base64"
537version = "0.21.7" 549version = "0.22.1"
538source = "registry+https://github.com/rust-lang/crates.io-index" 550source = "registry+https://github.com/rust-lang/crates.io-index"
539checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 551checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
540 552
541[[package]] 553[[package]]
542name = "base64-simd" 554name = "base64-simd"
@@ -550,21 +562,15 @@ dependencies = [
550 562
551[[package]] 563[[package]]
552name = "base64ct" 564name = "base64ct"
553version = "1.6.0" 565version = "1.8.3"
554source = "registry+https://github.com/rust-lang/crates.io-index" 566source = "registry+https://github.com/rust-lang/crates.io-index"
555checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 567checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
556 568
557[[package]] 569[[package]]
558name = "bitflags" 570name = "bitflags"
559version = "1.3.2" 571version = "2.11.0"
560source = "registry+https://github.com/rust-lang/crates.io-index" 572source = "registry+https://github.com/rust-lang/crates.io-index"
561checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 573checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
562
563[[package]]
564name = "bitflags"
565version = "2.5.0"
566source = "registry+https://github.com/rust-lang/crates.io-index"
567checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
568 574
569[[package]] 575[[package]]
570name = "block-buffer" 576name = "block-buffer"
@@ -577,15 +583,15 @@ dependencies = [
577 583
578[[package]] 584[[package]]
579name = "bumpalo" 585name = "bumpalo"
580version = "3.16.0" 586version = "3.20.2"
581source = "registry+https://github.com/rust-lang/crates.io-index" 587source = "registry+https://github.com/rust-lang/crates.io-index"
582checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 588checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
583 589
584[[package]] 590[[package]]
585name = "bytes" 591name = "bytes"
586version = "1.6.0" 592version = "1.11.1"
587source = "registry+https://github.com/rust-lang/crates.io-index" 593source = "registry+https://github.com/rust-lang/crates.io-index"
588checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" 594checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
589 595
590[[package]] 596[[package]]
591name = "bytes-utils" 597name = "bytes-utils"
@@ -599,29 +605,43 @@ dependencies = [
599 605
600[[package]] 606[[package]]
601name = "cc" 607name = "cc"
602version = "1.0.95" 608version = "1.2.59"
603source = "registry+https://github.com/rust-lang/crates.io-index" 609source = "registry+https://github.com/rust-lang/crates.io-index"
604checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" 610checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283"
611dependencies = [
612 "find-msvc-tools",
613 "jobserver",
614 "libc",
615 "shlex",
616]
605 617
606[[package]] 618[[package]]
607name = "cfg-if" 619name = "cfg-if"
608version = "1.0.0" 620version = "1.0.4"
609source = "registry+https://github.com/rust-lang/crates.io-index" 621source = "registry+https://github.com/rust-lang/crates.io-index"
610checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 622checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
611 623
612[[package]] 624[[package]]
613name = "chrono" 625name = "chrono"
614version = "0.4.38" 626version = "0.4.44"
615source = "registry+https://github.com/rust-lang/crates.io-index" 627source = "registry+https://github.com/rust-lang/crates.io-index"
616checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" 628checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
617dependencies = [ 629dependencies = [
618 "android-tzdata",
619 "iana-time-zone", 630 "iana-time-zone",
620 "js-sys", 631 "js-sys",
621 "num-traits", 632 "num-traits",
622 "serde", 633 "serde",
623 "wasm-bindgen", 634 "wasm-bindgen",
624 "windows-targets 0.52.5", 635 "windows-link",
636]
637
638[[package]]
639name = "cmake"
640version = "0.1.58"
641source = "registry+https://github.com/rust-lang/crates.io-index"
642checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678"
643dependencies = [
644 "cc",
625] 645]
626 646
627[[package]] 647[[package]]
@@ -632,9 +652,9 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
632 652
633[[package]] 653[[package]]
634name = "core-foundation" 654name = "core-foundation"
635version = "0.9.4" 655version = "0.10.1"
636source = "registry+https://github.com/rust-lang/crates.io-index" 656source = "registry+https://github.com/rust-lang/crates.io-index"
637checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 657checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
638dependencies = [ 658dependencies = [
639 "core-foundation-sys", 659 "core-foundation-sys",
640 "libc", 660 "libc",
@@ -642,33 +662,51 @@ dependencies = [
642 662
643[[package]] 663[[package]]
644name = "core-foundation-sys" 664name = "core-foundation-sys"
645version = "0.8.6" 665version = "0.8.7"
646source = "registry+https://github.com/rust-lang/crates.io-index" 666source = "registry+https://github.com/rust-lang/crates.io-index"
647checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 667checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
648 668
649[[package]] 669[[package]]
650name = "cpufeatures" 670name = "cpufeatures"
651version = "0.2.12" 671version = "0.2.17"
652source = "registry+https://github.com/rust-lang/crates.io-index" 672source = "registry+https://github.com/rust-lang/crates.io-index"
653checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 673checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
654dependencies = [ 674dependencies = [
655 "libc", 675 "libc",
656] 676]
657 677
658[[package]] 678[[package]]
659name = "crc32c" 679name = "crc"
660version = "0.6.5" 680version = "3.3.0"
661source = "registry+https://github.com/rust-lang/crates.io-index" 681source = "registry+https://github.com/rust-lang/crates.io-index"
662checksum = "89254598aa9b9fa608de44b3ae54c810f0f06d755e24c50177f1f8f31ff50ce2" 682checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675"
663dependencies = [ 683dependencies = [
664 "rustc_version", 684 "crc-catalog",
685]
686
687[[package]]
688name = "crc-catalog"
689version = "2.4.0"
690source = "registry+https://github.com/rust-lang/crates.io-index"
691checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
692
693[[package]]
694name = "crc-fast"
695version = "1.9.0"
696source = "registry+https://github.com/rust-lang/crates.io-index"
697checksum = "2fd92aca2c6001b1bf5ba0ff84ee74ec8501b52bbef0cac80bf25a6c1d87a83d"
698dependencies = [
699 "crc",
700 "digest",
701 "rustversion",
702 "spin",
665] 703]
666 704
667[[package]] 705[[package]]
668name = "crc32fast" 706name = "crc32fast"
669version = "1.4.0" 707version = "1.5.0"
670source = "registry+https://github.com/rust-lang/crates.io-index" 708source = "registry+https://github.com/rust-lang/crates.io-index"
671checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" 709checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
672dependencies = [ 710dependencies = [
673 "cfg-if", 711 "cfg-if",
674] 712]
@@ -697,9 +735,9 @@ dependencies = [
697 735
698[[package]] 736[[package]]
699name = "crypto-common" 737name = "crypto-common"
700version = "0.1.6" 738version = "0.1.7"
701source = "registry+https://github.com/rust-lang/crates.io-index" 739source = "registry+https://github.com/rust-lang/crates.io-index"
702checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 740checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
703dependencies = [ 741dependencies = [
704 "generic-array", 742 "generic-array",
705 "typenum", 743 "typenum",
@@ -717,9 +755,9 @@ dependencies = [
717 755
718[[package]] 756[[package]]
719name = "deranged" 757name = "deranged"
720version = "0.3.11" 758version = "0.5.8"
721source = "registry+https://github.com/rust-lang/crates.io-index" 759source = "registry+https://github.com/rust-lang/crates.io-index"
722checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 760checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
723dependencies = [ 761dependencies = [
724 "powerfmt", 762 "powerfmt",
725] 763]
@@ -736,6 +774,23 @@ dependencies = [
736] 774]
737 775
738[[package]] 776[[package]]
777name = "displaydoc"
778version = "0.2.5"
779source = "registry+https://github.com/rust-lang/crates.io-index"
780checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
781dependencies = [
782 "proc-macro2",
783 "quote",
784 "syn",
785]
786
787[[package]]
788name = "dunce"
789version = "1.0.5"
790source = "registry+https://github.com/rust-lang/crates.io-index"
791checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
792
793[[package]]
739name = "ecdsa" 794name = "ecdsa"
740version = "0.14.8" 795version = "0.14.8"
741source = "registry+https://github.com/rust-lang/crates.io-index" 796source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -749,9 +804,9 @@ dependencies = [
749 804
750[[package]] 805[[package]]
751name = "either" 806name = "either"
752version = "1.11.0" 807version = "1.15.0"
753source = "registry+https://github.com/rust-lang/crates.io-index" 808source = "registry+https://github.com/rust-lang/crates.io-index"
754checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" 809checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
755 810
756[[package]] 811[[package]]
757name = "elliptic-curve" 812name = "elliptic-curve"
@@ -775,15 +830,25 @@ dependencies = [
775 830
776[[package]] 831[[package]]
777name = "equivalent" 832name = "equivalent"
778version = "1.0.1" 833version = "1.0.2"
779source = "registry+https://github.com/rust-lang/crates.io-index" 834source = "registry+https://github.com/rust-lang/crates.io-index"
780checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 835checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
836
837[[package]]
838name = "errno"
839version = "0.3.14"
840source = "registry+https://github.com/rust-lang/crates.io-index"
841checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
842dependencies = [
843 "libc",
844 "windows-sys 0.61.2",
845]
781 846
782[[package]] 847[[package]]
783name = "fastrand" 848name = "fastrand"
784version = "2.1.0" 849version = "2.4.1"
785source = "registry+https://github.com/rust-lang/crates.io-index" 850source = "registry+https://github.com/rust-lang/crates.io-index"
786checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" 851checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
787 852
788[[package]] 853[[package]]
789name = "ff" 854name = "ff"
@@ -796,57 +861,75 @@ dependencies = [
796] 861]
797 862
798[[package]] 863[[package]]
864name = "find-msvc-tools"
865version = "0.1.9"
866source = "registry+https://github.com/rust-lang/crates.io-index"
867checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
868
869[[package]]
799name = "fnv" 870name = "fnv"
800version = "1.0.7" 871version = "1.0.7"
801source = "registry+https://github.com/rust-lang/crates.io-index" 872source = "registry+https://github.com/rust-lang/crates.io-index"
802checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 873checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
803 874
804[[package]] 875[[package]]
876name = "foldhash"
877version = "0.2.0"
878source = "registry+https://github.com/rust-lang/crates.io-index"
879checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
880
881[[package]]
805name = "form_urlencoded" 882name = "form_urlencoded"
806version = "1.2.1" 883version = "1.2.2"
807source = "registry+https://github.com/rust-lang/crates.io-index" 884source = "registry+https://github.com/rust-lang/crates.io-index"
808checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 885checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
809dependencies = [ 886dependencies = [
810 "percent-encoding", 887 "percent-encoding",
811] 888]
812 889
813[[package]] 890[[package]]
891name = "fs_extra"
892version = "1.3.0"
893source = "registry+https://github.com/rust-lang/crates.io-index"
894checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
895
896[[package]]
814name = "futures-channel" 897name = "futures-channel"
815version = "0.3.30" 898version = "0.3.32"
816source = "registry+https://github.com/rust-lang/crates.io-index" 899source = "registry+https://github.com/rust-lang/crates.io-index"
817checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 900checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
818dependencies = [ 901dependencies = [
819 "futures-core", 902 "futures-core",
820] 903]
821 904
822[[package]] 905[[package]]
823name = "futures-core" 906name = "futures-core"
824version = "0.3.30" 907version = "0.3.32"
825source = "registry+https://github.com/rust-lang/crates.io-index" 908source = "registry+https://github.com/rust-lang/crates.io-index"
826checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 909checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
827 910
828[[package]] 911[[package]]
829name = "futures-sink" 912name = "futures-sink"
830version = "0.3.30" 913version = "0.3.32"
831source = "registry+https://github.com/rust-lang/crates.io-index" 914source = "registry+https://github.com/rust-lang/crates.io-index"
832checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 915checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893"
833 916
834[[package]] 917[[package]]
835name = "futures-task" 918name = "futures-task"
836version = "0.3.30" 919version = "0.3.32"
837source = "registry+https://github.com/rust-lang/crates.io-index" 920source = "registry+https://github.com/rust-lang/crates.io-index"
838checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 921checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
839 922
840[[package]] 923[[package]]
841name = "futures-util" 924name = "futures-util"
842version = "0.3.30" 925version = "0.3.32"
843source = "registry+https://github.com/rust-lang/crates.io-index" 926source = "registry+https://github.com/rust-lang/crates.io-index"
844checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 927checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
845dependencies = [ 928dependencies = [
846 "futures-core", 929 "futures-core",
847 "futures-task", 930 "futures-task",
848 "pin-project-lite", 931 "pin-project-lite",
849 "pin-utils", 932 "slab",
850] 933]
851 934
852[[package]] 935[[package]]
@@ -861,9 +944,9 @@ dependencies = [
861 944
862[[package]] 945[[package]]
863name = "getrandom" 946name = "getrandom"
864version = "0.2.14" 947version = "0.2.17"
865source = "registry+https://github.com/rust-lang/crates.io-index" 948source = "registry+https://github.com/rust-lang/crates.io-index"
866checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" 949checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
867dependencies = [ 950dependencies = [
868 "cfg-if", 951 "cfg-if",
869 "libc", 952 "libc",
@@ -871,10 +954,16 @@ dependencies = [
871] 954]
872 955
873[[package]] 956[[package]]
874name = "gimli" 957name = "getrandom"
875version = "0.28.1" 958version = "0.3.4"
876source = "registry+https://github.com/rust-lang/crates.io-index" 959source = "registry+https://github.com/rust-lang/crates.io-index"
877checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 960checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
961dependencies = [
962 "cfg-if",
963 "libc",
964 "r-efi",
965 "wasip2",
966]
878 967
879[[package]] 968[[package]]
880name = "gitolfs3-authenticate" 969name = "gitolfs3-authenticate"
@@ -932,9 +1021,9 @@ dependencies = [
932 1021
933[[package]] 1022[[package]]
934name = "h2" 1023name = "h2"
935version = "0.3.26" 1024version = "0.3.27"
936source = "registry+https://github.com/rust-lang/crates.io-index" 1025source = "registry+https://github.com/rust-lang/crates.io-index"
937checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 1026checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d"
938dependencies = [ 1027dependencies = [
939 "bytes", 1028 "bytes",
940 "fnv", 1029 "fnv",
@@ -950,20 +1039,34 @@ dependencies = [
950] 1039]
951 1040
952[[package]] 1041[[package]]
953name = "hashbrown" 1042name = "h2"
954version = "0.14.5" 1043version = "0.4.13"
955source = "registry+https://github.com/rust-lang/crates.io-index" 1044source = "registry+https://github.com/rust-lang/crates.io-index"
956checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1045checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54"
957dependencies = [ 1046dependencies = [
958 "ahash", 1047 "atomic-waker",
959 "allocator-api2", 1048 "bytes",
1049 "fnv",
1050 "futures-core",
1051 "futures-sink",
1052 "http 1.4.0",
1053 "indexmap",
1054 "slab",
1055 "tokio",
1056 "tokio-util",
1057 "tracing",
960] 1058]
961 1059
962[[package]] 1060[[package]]
963name = "hermit-abi" 1061name = "hashbrown"
964version = "0.3.9" 1062version = "0.16.1"
965source = "registry+https://github.com/rust-lang/crates.io-index" 1063source = "registry+https://github.com/rust-lang/crates.io-index"
966checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 1064checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
1065dependencies = [
1066 "allocator-api2",
1067 "equivalent",
1068 "foldhash",
1069]
967 1070
968[[package]] 1071[[package]]
969name = "hex" 1072name = "hex"
@@ -982,9 +1085,9 @@ dependencies = [
982 1085
983[[package]] 1086[[package]]
984name = "hmac-sha256" 1087name = "hmac-sha256"
985version = "1.1.7" 1088version = "1.1.14"
986source = "registry+https://github.com/rust-lang/crates.io-index" 1089source = "registry+https://github.com/rust-lang/crates.io-index"
987checksum = "3688e69b38018fec1557254f64c8dc2cc8ec502890182f395dbb0aa997aa5735" 1090checksum = "ec9d92d097f4749b64e8cc33d924d9f40a2d4eb91402b458014b781f5733d60f"
988 1091
989[[package]] 1092[[package]]
990name = "http" 1093name = "http"
@@ -999,12 +1102,11 @@ dependencies = [
999 1102
1000[[package]] 1103[[package]]
1001name = "http" 1104name = "http"
1002version = "1.1.0" 1105version = "1.4.0"
1003source = "registry+https://github.com/rust-lang/crates.io-index" 1106source = "registry+https://github.com/rust-lang/crates.io-index"
1004checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 1107checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
1005dependencies = [ 1108dependencies = [
1006 "bytes", 1109 "bytes",
1007 "fnv",
1008 "itoa", 1110 "itoa",
1009] 1111]
1010 1112
@@ -1021,32 +1123,32 @@ dependencies = [
1021 1123
1022[[package]] 1124[[package]]
1023name = "http-body" 1125name = "http-body"
1024version = "1.0.0" 1126version = "1.0.1"
1025source = "registry+https://github.com/rust-lang/crates.io-index" 1127source = "registry+https://github.com/rust-lang/crates.io-index"
1026checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" 1128checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
1027dependencies = [ 1129dependencies = [
1028 "bytes", 1130 "bytes",
1029 "http 1.1.0", 1131 "http 1.4.0",
1030] 1132]
1031 1133
1032[[package]] 1134[[package]]
1033name = "http-body-util" 1135name = "http-body-util"
1034version = "0.1.1" 1136version = "0.1.3"
1035source = "registry+https://github.com/rust-lang/crates.io-index" 1137source = "registry+https://github.com/rust-lang/crates.io-index"
1036checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" 1138checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
1037dependencies = [ 1139dependencies = [
1038 "bytes", 1140 "bytes",
1039 "futures-core", 1141 "futures-core",
1040 "http 1.1.0", 1142 "http 1.4.0",
1041 "http-body 1.0.0", 1143 "http-body 1.0.1",
1042 "pin-project-lite", 1144 "pin-project-lite",
1043] 1145]
1044 1146
1045[[package]] 1147[[package]]
1046name = "httparse" 1148name = "httparse"
1047version = "1.8.0" 1149version = "1.10.1"
1048source = "registry+https://github.com/rust-lang/crates.io-index" 1150source = "registry+https://github.com/rust-lang/crates.io-index"
1049checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1151checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
1050 1152
1051[[package]] 1153[[package]]
1052name = "httpdate" 1154name = "httpdate"
@@ -1056,22 +1158,22 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
1056 1158
1057[[package]] 1159[[package]]
1058name = "hyper" 1160name = "hyper"
1059version = "0.14.28" 1161version = "0.14.32"
1060source = "registry+https://github.com/rust-lang/crates.io-index" 1162source = "registry+https://github.com/rust-lang/crates.io-index"
1061checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" 1163checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7"
1062dependencies = [ 1164dependencies = [
1063 "bytes", 1165 "bytes",
1064 "futures-channel", 1166 "futures-channel",
1065 "futures-core", 1167 "futures-core",
1066 "futures-util", 1168 "futures-util",
1067 "h2", 1169 "h2 0.3.27",
1068 "http 0.2.12", 1170 "http 0.2.12",
1069 "http-body 0.4.6", 1171 "http-body 0.4.6",
1070 "httparse", 1172 "httparse",
1071 "httpdate", 1173 "httpdate",
1072 "itoa", 1174 "itoa",
1073 "pin-project-lite", 1175 "pin-project-lite",
1074 "socket2", 1176 "socket2 0.5.10",
1075 "tokio", 1177 "tokio",
1076 "tower-service", 1178 "tower-service",
1077 "tracing", 1179 "tracing",
@@ -1080,21 +1182,24 @@ dependencies = [
1080 1182
1081[[package]] 1183[[package]]
1082name = "hyper" 1184name = "hyper"
1083version = "1.3.1" 1185version = "1.9.0"
1084source = "registry+https://github.com/rust-lang/crates.io-index" 1186source = "registry+https://github.com/rust-lang/crates.io-index"
1085checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" 1187checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca"
1086dependencies = [ 1188dependencies = [
1189 "atomic-waker",
1087 "bytes", 1190 "bytes",
1088 "futures-channel", 1191 "futures-channel",
1089 "futures-util", 1192 "futures-core",
1090 "http 1.1.0", 1193 "h2 0.4.13",
1091 "http-body 1.0.0", 1194 "http 1.4.0",
1195 "http-body 1.0.1",
1092 "httparse", 1196 "httparse",
1093 "httpdate", 1197 "httpdate",
1094 "itoa", 1198 "itoa",
1095 "pin-project-lite", 1199 "pin-project-lite",
1096 "smallvec", 1200 "smallvec",
1097 "tokio", 1201 "tokio",
1202 "want",
1098] 1203]
1099 1204
1100[[package]] 1205[[package]]
@@ -1105,40 +1210,64 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
1105dependencies = [ 1210dependencies = [
1106 "futures-util", 1211 "futures-util",
1107 "http 0.2.12", 1212 "http 0.2.12",
1108 "hyper 0.14.28", 1213 "hyper 0.14.32",
1109 "log", 1214 "log",
1110 "rustls", 1215 "rustls 0.21.12",
1216 "tokio",
1217 "tokio-rustls 0.24.1",
1218]
1219
1220[[package]]
1221name = "hyper-rustls"
1222version = "0.27.7"
1223source = "registry+https://github.com/rust-lang/crates.io-index"
1224checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
1225dependencies = [
1226 "http 1.4.0",
1227 "hyper 1.9.0",
1228 "hyper-util",
1229 "rustls 0.23.37",
1111 "rustls-native-certs", 1230 "rustls-native-certs",
1231 "rustls-pki-types",
1112 "tokio", 1232 "tokio",
1113 "tokio-rustls", 1233 "tokio-rustls 0.26.4",
1234 "tower-service",
1114] 1235]
1115 1236
1116[[package]] 1237[[package]]
1117name = "hyper-util" 1238name = "hyper-util"
1118version = "0.1.3" 1239version = "0.1.20"
1119source = "registry+https://github.com/rust-lang/crates.io-index" 1240source = "registry+https://github.com/rust-lang/crates.io-index"
1120checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" 1241checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
1121dependencies = [ 1242dependencies = [
1243 "base64",
1122 "bytes", 1244 "bytes",
1245 "futures-channel",
1123 "futures-util", 1246 "futures-util",
1124 "http 1.1.0", 1247 "http 1.4.0",
1125 "http-body 1.0.0", 1248 "http-body 1.0.1",
1126 "hyper 1.3.1", 1249 "hyper 1.9.0",
1250 "ipnet",
1251 "libc",
1252 "percent-encoding",
1127 "pin-project-lite", 1253 "pin-project-lite",
1128 "socket2", 1254 "socket2 0.6.3",
1129 "tokio", 1255 "tokio",
1256 "tower-service",
1257 "tracing",
1130] 1258]
1131 1259
1132[[package]] 1260[[package]]
1133name = "iana-time-zone" 1261name = "iana-time-zone"
1134version = "0.1.60" 1262version = "0.1.65"
1135source = "registry+https://github.com/rust-lang/crates.io-index" 1263source = "registry+https://github.com/rust-lang/crates.io-index"
1136checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" 1264checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
1137dependencies = [ 1265dependencies = [
1138 "android_system_properties", 1266 "android_system_properties",
1139 "core-foundation-sys", 1267 "core-foundation-sys",
1140 "iana-time-zone-haiku", 1268 "iana-time-zone-haiku",
1141 "js-sys", 1269 "js-sys",
1270 "log",
1142 "wasm-bindgen", 1271 "wasm-bindgen",
1143 "windows-core", 1272 "windows-core",
1144] 1273]
@@ -1153,91 +1282,206 @@ dependencies = [
1153] 1282]
1154 1283
1155[[package]] 1284[[package]]
1285name = "icu_collections"
1286version = "2.2.0"
1287source = "registry+https://github.com/rust-lang/crates.io-index"
1288checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
1289dependencies = [
1290 "displaydoc",
1291 "potential_utf",
1292 "utf8_iter",
1293 "yoke",
1294 "zerofrom",
1295 "zerovec",
1296]
1297
1298[[package]]
1299name = "icu_locale_core"
1300version = "2.2.0"
1301source = "registry+https://github.com/rust-lang/crates.io-index"
1302checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
1303dependencies = [
1304 "displaydoc",
1305 "litemap",
1306 "tinystr",
1307 "writeable",
1308 "zerovec",
1309]
1310
1311[[package]]
1312name = "icu_normalizer"
1313version = "2.2.0"
1314source = "registry+https://github.com/rust-lang/crates.io-index"
1315checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
1316dependencies = [
1317 "icu_collections",
1318 "icu_normalizer_data",
1319 "icu_properties",
1320 "icu_provider",
1321 "smallvec",
1322 "zerovec",
1323]
1324
1325[[package]]
1326name = "icu_normalizer_data"
1327version = "2.2.0"
1328source = "registry+https://github.com/rust-lang/crates.io-index"
1329checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"
1330
1331[[package]]
1332name = "icu_properties"
1333version = "2.2.0"
1334source = "registry+https://github.com/rust-lang/crates.io-index"
1335checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
1336dependencies = [
1337 "icu_collections",
1338 "icu_locale_core",
1339 "icu_properties_data",
1340 "icu_provider",
1341 "zerotrie",
1342 "zerovec",
1343]
1344
1345[[package]]
1346name = "icu_properties_data"
1347version = "2.2.0"
1348source = "registry+https://github.com/rust-lang/crates.io-index"
1349checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"
1350
1351[[package]]
1352name = "icu_provider"
1353version = "2.2.0"
1354source = "registry+https://github.com/rust-lang/crates.io-index"
1355checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
1356dependencies = [
1357 "displaydoc",
1358 "icu_locale_core",
1359 "writeable",
1360 "yoke",
1361 "zerofrom",
1362 "zerotrie",
1363 "zerovec",
1364]
1365
1366[[package]]
1156name = "idna" 1367name = "idna"
1157version = "0.5.0" 1368version = "1.1.0"
1158source = "registry+https://github.com/rust-lang/crates.io-index" 1369source = "registry+https://github.com/rust-lang/crates.io-index"
1159checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 1370checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
1160dependencies = [ 1371dependencies = [
1161 "unicode-bidi", 1372 "idna_adapter",
1162 "unicode-normalization", 1373 "smallvec",
1374 "utf8_iter",
1375]
1376
1377[[package]]
1378name = "idna_adapter"
1379version = "1.2.1"
1380source = "registry+https://github.com/rust-lang/crates.io-index"
1381checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
1382dependencies = [
1383 "icu_normalizer",
1384 "icu_properties",
1163] 1385]
1164 1386
1165[[package]] 1387[[package]]
1166name = "indexmap" 1388name = "indexmap"
1167version = "2.2.6" 1389version = "2.13.1"
1168source = "registry+https://github.com/rust-lang/crates.io-index" 1390source = "registry+https://github.com/rust-lang/crates.io-index"
1169checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 1391checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff"
1170dependencies = [ 1392dependencies = [
1171 "equivalent", 1393 "equivalent",
1172 "hashbrown", 1394 "hashbrown",
1173] 1395]
1174 1396
1175[[package]] 1397[[package]]
1398name = "ipnet"
1399version = "2.12.0"
1400source = "registry+https://github.com/rust-lang/crates.io-index"
1401checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"
1402
1403[[package]]
1176name = "itoa" 1404name = "itoa"
1177version = "1.0.11" 1405version = "1.0.18"
1406source = "registry+https://github.com/rust-lang/crates.io-index"
1407checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
1408
1409[[package]]
1410name = "jobserver"
1411version = "0.1.34"
1178source = "registry+https://github.com/rust-lang/crates.io-index" 1412source = "registry+https://github.com/rust-lang/crates.io-index"
1179checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 1413checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
1414dependencies = [
1415 "getrandom 0.3.4",
1416 "libc",
1417]
1180 1418
1181[[package]] 1419[[package]]
1182name = "js-sys" 1420name = "js-sys"
1183version = "0.3.69" 1421version = "0.3.94"
1184source = "registry+https://github.com/rust-lang/crates.io-index" 1422source = "registry+https://github.com/rust-lang/crates.io-index"
1185checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 1423checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9"
1186dependencies = [ 1424dependencies = [
1425 "once_cell",
1187 "wasm-bindgen", 1426 "wasm-bindgen",
1188] 1427]
1189 1428
1190[[package]] 1429[[package]]
1191name = "lazy_static" 1430name = "lazy_static"
1192version = "1.4.0" 1431version = "1.5.0"
1193source = "registry+https://github.com/rust-lang/crates.io-index" 1432source = "registry+https://github.com/rust-lang/crates.io-index"
1194checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1433checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
1195 1434
1196[[package]] 1435[[package]]
1197name = "libc" 1436name = "libc"
1198version = "0.2.153" 1437version = "0.2.184"
1199source = "registry+https://github.com/rust-lang/crates.io-index" 1438source = "registry+https://github.com/rust-lang/crates.io-index"
1200checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" 1439checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af"
1440
1441[[package]]
1442name = "litemap"
1443version = "0.8.2"
1444source = "registry+https://github.com/rust-lang/crates.io-index"
1445checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
1201 1446
1202[[package]] 1447[[package]]
1203name = "lock_api" 1448name = "lock_api"
1204version = "0.4.12" 1449version = "0.4.14"
1205source = "registry+https://github.com/rust-lang/crates.io-index" 1450source = "registry+https://github.com/rust-lang/crates.io-index"
1206checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1451checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
1207dependencies = [ 1452dependencies = [
1208 "autocfg",
1209 "scopeguard", 1453 "scopeguard",
1210] 1454]
1211 1455
1212[[package]] 1456[[package]]
1213name = "log" 1457name = "log"
1214version = "0.4.21" 1458version = "0.4.29"
1215source = "registry+https://github.com/rust-lang/crates.io-index" 1459source = "registry+https://github.com/rust-lang/crates.io-index"
1216checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 1460checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
1217 1461
1218[[package]] 1462[[package]]
1219name = "lru" 1463name = "lru"
1220version = "0.12.3" 1464version = "0.16.3"
1221source = "registry+https://github.com/rust-lang/crates.io-index" 1465source = "registry+https://github.com/rust-lang/crates.io-index"
1222checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" 1466checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593"
1223dependencies = [ 1467dependencies = [
1224 "hashbrown", 1468 "hashbrown",
1225] 1469]
1226 1470
1227[[package]] 1471[[package]]
1228name = "matchers" 1472name = "matchers"
1229version = "0.1.0" 1473version = "0.2.0"
1230source = "registry+https://github.com/rust-lang/crates.io-index" 1474source = "registry+https://github.com/rust-lang/crates.io-index"
1231checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1475checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
1232dependencies = [ 1476dependencies = [
1233 "regex-automata 0.1.10", 1477 "regex-automata",
1234] 1478]
1235 1479
1236[[package]] 1480[[package]]
1237name = "matchit" 1481name = "matchit"
1238version = "0.7.3" 1482version = "0.8.4"
1239source = "registry+https://github.com/rust-lang/crates.io-index" 1483source = "registry+https://github.com/rust-lang/crates.io-index"
1240checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" 1484checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
1241 1485
1242[[package]] 1486[[package]]
1243name = "md-5" 1487name = "md-5"
@@ -1251,9 +1495,9 @@ dependencies = [
1251 1495
1252[[package]] 1496[[package]]
1253name = "memchr" 1497name = "memchr"
1254version = "2.7.2" 1498version = "2.8.0"
1255source = "registry+https://github.com/rust-lang/crates.io-index" 1499source = "registry+https://github.com/rust-lang/crates.io-index"
1256checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" 1500checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
1257 1501
1258[[package]] 1502[[package]]
1259name = "mime" 1503name = "mime"
@@ -1262,40 +1506,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1262checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1506checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
1263 1507
1264[[package]] 1508[[package]]
1265name = "miniz_oxide"
1266version = "0.7.2"
1267source = "registry+https://github.com/rust-lang/crates.io-index"
1268checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
1269dependencies = [
1270 "adler",
1271]
1272
1273[[package]]
1274name = "mio" 1509name = "mio"
1275version = "0.8.11" 1510version = "1.2.0"
1276source = "registry+https://github.com/rust-lang/crates.io-index" 1511source = "registry+https://github.com/rust-lang/crates.io-index"
1277checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 1512checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
1278dependencies = [ 1513dependencies = [
1279 "libc", 1514 "libc",
1280 "wasi", 1515 "wasi",
1281 "windows-sys 0.48.0", 1516 "windows-sys 0.61.2",
1282] 1517]
1283 1518
1284[[package]] 1519[[package]]
1285name = "nu-ansi-term" 1520name = "nu-ansi-term"
1286version = "0.46.0" 1521version = "0.50.3"
1287source = "registry+https://github.com/rust-lang/crates.io-index" 1522source = "registry+https://github.com/rust-lang/crates.io-index"
1288checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1523checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
1289dependencies = [ 1524dependencies = [
1290 "overload", 1525 "windows-sys 0.61.2",
1291 "winapi",
1292] 1526]
1293 1527
1294[[package]] 1528[[package]]
1295name = "num-conv" 1529name = "num-conv"
1296version = "0.1.0" 1530version = "0.2.1"
1297source = "registry+https://github.com/rust-lang/crates.io-index" 1531source = "registry+https://github.com/rust-lang/crates.io-index"
1298checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1532checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967"
1299 1533
1300[[package]] 1534[[package]]
1301name = "num-integer" 1535name = "num-integer"
@@ -1308,55 +1542,30 @@ dependencies = [
1308 1542
1309[[package]] 1543[[package]]
1310name = "num-traits" 1544name = "num-traits"
1311version = "0.2.18" 1545version = "0.2.19"
1312source = "registry+https://github.com/rust-lang/crates.io-index" 1546source = "registry+https://github.com/rust-lang/crates.io-index"
1313checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" 1547checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
1314dependencies = [ 1548dependencies = [
1315 "autocfg", 1549 "autocfg",
1316] 1550]
1317 1551
1318[[package]] 1552[[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"
1330version = "0.32.2"
1331source = "registry+https://github.com/rust-lang/crates.io-index"
1332checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
1333dependencies = [
1334 "memchr",
1335]
1336
1337[[package]]
1338name = "once_cell" 1553name = "once_cell"
1339version = "1.19.0" 1554version = "1.21.4"
1340source = "registry+https://github.com/rust-lang/crates.io-index" 1555source = "registry+https://github.com/rust-lang/crates.io-index"
1341checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1556checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
1342 1557
1343[[package]] 1558[[package]]
1344name = "openssl-probe" 1559name = "openssl-probe"
1345version = "0.1.5" 1560version = "0.2.1"
1346source = "registry+https://github.com/rust-lang/crates.io-index" 1561source = "registry+https://github.com/rust-lang/crates.io-index"
1347checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1562checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
1348 1563
1349[[package]] 1564[[package]]
1350name = "outref" 1565name = "outref"
1351version = "0.5.1" 1566version = "0.5.2"
1352source = "registry+https://github.com/rust-lang/crates.io-index" 1567source = "registry+https://github.com/rust-lang/crates.io-index"
1353checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" 1568checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
1354
1355[[package]]
1356name = "overload"
1357version = "0.1.1"
1358source = "registry+https://github.com/rust-lang/crates.io-index"
1359checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
1360 1569
1361[[package]] 1570[[package]]
1362name = "p256" 1571name = "p256"
@@ -1371,9 +1580,9 @@ dependencies = [
1371 1580
1372[[package]] 1581[[package]]
1373name = "parking_lot" 1582name = "parking_lot"
1374version = "0.12.2" 1583version = "0.12.5"
1375source = "registry+https://github.com/rust-lang/crates.io-index" 1584source = "registry+https://github.com/rust-lang/crates.io-index"
1376checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" 1585checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
1377dependencies = [ 1586dependencies = [
1378 "lock_api", 1587 "lock_api",
1379 "parking_lot_core", 1588 "parking_lot_core",
@@ -1381,48 +1590,28 @@ dependencies = [
1381 1590
1382[[package]] 1591[[package]]
1383name = "parking_lot_core" 1592name = "parking_lot_core"
1384version = "0.9.10" 1593version = "0.9.12"
1385source = "registry+https://github.com/rust-lang/crates.io-index" 1594source = "registry+https://github.com/rust-lang/crates.io-index"
1386checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1595checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
1387dependencies = [ 1596dependencies = [
1388 "cfg-if", 1597 "cfg-if",
1389 "libc", 1598 "libc",
1390 "redox_syscall", 1599 "redox_syscall",
1391 "smallvec", 1600 "smallvec",
1392 "windows-targets 0.52.5", 1601 "windows-link",
1393] 1602]
1394 1603
1395[[package]] 1604[[package]]
1396name = "percent-encoding" 1605name = "percent-encoding"
1397version = "2.3.1" 1606version = "2.3.2"
1398source = "registry+https://github.com/rust-lang/crates.io-index" 1607source = "registry+https://github.com/rust-lang/crates.io-index"
1399checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1608checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
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"
1414checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
1415dependencies = [
1416 "proc-macro2",
1417 "quote",
1418 "syn",
1419]
1420 1609
1421[[package]] 1610[[package]]
1422name = "pin-project-lite" 1611name = "pin-project-lite"
1423version = "0.2.14" 1612version = "0.2.17"
1424source = "registry+https://github.com/rust-lang/crates.io-index" 1613source = "registry+https://github.com/rust-lang/crates.io-index"
1425checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 1614checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
1426 1615
1427[[package]] 1616[[package]]
1428name = "pin-utils" 1617name = "pin-utils"
@@ -1441,6 +1630,15 @@ dependencies = [
1441] 1630]
1442 1631
1443[[package]] 1632[[package]]
1633name = "potential_utf"
1634version = "0.1.5"
1635source = "registry+https://github.com/rust-lang/crates.io-index"
1636checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
1637dependencies = [
1638 "zerovec",
1639]
1640
1641[[package]]
1444name = "powerfmt" 1642name = "powerfmt"
1445version = "0.2.0" 1643version = "0.2.0"
1446source = "registry+https://github.com/rust-lang/crates.io-index" 1644source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1448,89 +1646,68 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
1448 1646
1449[[package]] 1647[[package]]
1450name = "proc-macro2" 1648name = "proc-macro2"
1451version = "1.0.81" 1649version = "1.0.106"
1452source = "registry+https://github.com/rust-lang/crates.io-index" 1650source = "registry+https://github.com/rust-lang/crates.io-index"
1453checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" 1651checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
1454dependencies = [ 1652dependencies = [
1455 "unicode-ident", 1653 "unicode-ident",
1456] 1654]
1457 1655
1458[[package]] 1656[[package]]
1459name = "quote" 1657name = "quote"
1460version = "1.0.36" 1658version = "1.0.45"
1461source = "registry+https://github.com/rust-lang/crates.io-index" 1659source = "registry+https://github.com/rust-lang/crates.io-index"
1462checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 1660checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
1463dependencies = [ 1661dependencies = [
1464 "proc-macro2", 1662 "proc-macro2",
1465] 1663]
1466 1664
1467[[package]] 1665[[package]]
1666name = "r-efi"
1667version = "5.3.0"
1668source = "registry+https://github.com/rust-lang/crates.io-index"
1669checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
1670
1671[[package]]
1468name = "rand_core" 1672name = "rand_core"
1469version = "0.6.4" 1673version = "0.6.4"
1470source = "registry+https://github.com/rust-lang/crates.io-index" 1674source = "registry+https://github.com/rust-lang/crates.io-index"
1471checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1675checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1472dependencies = [ 1676dependencies = [
1473 "getrandom", 1677 "getrandom 0.2.17",
1474] 1678]
1475 1679
1476[[package]] 1680[[package]]
1477name = "redox_syscall" 1681name = "redox_syscall"
1478version = "0.5.1" 1682version = "0.5.18"
1479source = "registry+https://github.com/rust-lang/crates.io-index"
1480checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
1481dependencies = [
1482 "bitflags 2.5.0",
1483]
1484
1485[[package]]
1486name = "regex"
1487version = "1.10.4"
1488source = "registry+https://github.com/rust-lang/crates.io-index" 1683source = "registry+https://github.com/rust-lang/crates.io-index"
1489checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" 1684checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
1490dependencies = [ 1685dependencies = [
1491 "aho-corasick", 1686 "bitflags",
1492 "memchr",
1493 "regex-automata 0.4.6",
1494 "regex-syntax 0.8.3",
1495] 1687]
1496 1688
1497[[package]] 1689[[package]]
1498name = "regex-automata" 1690name = "regex-automata"
1499version = "0.1.10" 1691version = "0.4.14"
1500source = "registry+https://github.com/rust-lang/crates.io-index" 1692source = "registry+https://github.com/rust-lang/crates.io-index"
1501checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1693checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
1502dependencies = [
1503 "regex-syntax 0.6.29",
1504]
1505
1506[[package]]
1507name = "regex-automata"
1508version = "0.4.6"
1509source = "registry+https://github.com/rust-lang/crates.io-index"
1510checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
1511dependencies = [ 1694dependencies = [
1512 "aho-corasick", 1695 "aho-corasick",
1513 "memchr", 1696 "memchr",
1514 "regex-syntax 0.8.3", 1697 "regex-syntax",
1515] 1698]
1516 1699
1517[[package]] 1700[[package]]
1518name = "regex-lite" 1701name = "regex-lite"
1519version = "0.1.5" 1702version = "0.1.9"
1520source = "registry+https://github.com/rust-lang/crates.io-index" 1703source = "registry+https://github.com/rust-lang/crates.io-index"
1521checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" 1704checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973"
1522 1705
1523[[package]] 1706[[package]]
1524name = "regex-syntax" 1707name = "regex-syntax"
1525version = "0.6.29" 1708version = "0.8.10"
1526source = "registry+https://github.com/rust-lang/crates.io-index" 1709source = "registry+https://github.com/rust-lang/crates.io-index"
1527checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 1710checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
1528
1529[[package]]
1530name = "regex-syntax"
1531version = "0.8.3"
1532source = "registry+https://github.com/rust-lang/crates.io-index"
1533checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
1534 1711
1535[[package]] 1712[[package]]
1536name = "rfc6979" 1713name = "rfc6979"
@@ -1545,30 +1722,23 @@ dependencies = [
1545 1722
1546[[package]] 1723[[package]]
1547name = "ring" 1724name = "ring"
1548version = "0.17.8" 1725version = "0.17.14"
1549source = "registry+https://github.com/rust-lang/crates.io-index" 1726source = "registry+https://github.com/rust-lang/crates.io-index"
1550checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1727checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
1551dependencies = [ 1728dependencies = [
1552 "cc", 1729 "cc",
1553 "cfg-if", 1730 "cfg-if",
1554 "getrandom", 1731 "getrandom 0.2.17",
1555 "libc", 1732 "libc",
1556 "spin",
1557 "untrusted", 1733 "untrusted",
1558 "windows-sys 0.52.0", 1734 "windows-sys 0.52.0",
1559] 1735]
1560 1736
1561[[package]] 1737[[package]]
1562name = "rustc-demangle"
1563version = "0.1.23"
1564source = "registry+https://github.com/rust-lang/crates.io-index"
1565checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
1566
1567[[package]]
1568name = "rustc_version" 1738name = "rustc_version"
1569version = "0.4.0" 1739version = "0.4.1"
1570source = "registry+https://github.com/rust-lang/crates.io-index" 1740source = "registry+https://github.com/rust-lang/crates.io-index"
1571checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1741checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
1572dependencies = [ 1742dependencies = [
1573 "semver", 1743 "semver",
1574] 1744]
@@ -1581,29 +1751,43 @@ checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
1581dependencies = [ 1751dependencies = [
1582 "log", 1752 "log",
1583 "ring", 1753 "ring",
1584 "rustls-webpki", 1754 "rustls-webpki 0.101.7",
1585 "sct", 1755 "sct",
1586] 1756]
1587 1757
1588[[package]] 1758[[package]]
1759name = "rustls"
1760version = "0.23.37"
1761source = "registry+https://github.com/rust-lang/crates.io-index"
1762checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4"
1763dependencies = [
1764 "aws-lc-rs",
1765 "once_cell",
1766 "rustls-pki-types",
1767 "rustls-webpki 0.103.10",
1768 "subtle",
1769 "zeroize",
1770]
1771
1772[[package]]
1589name = "rustls-native-certs" 1773name = "rustls-native-certs"
1590version = "0.6.3" 1774version = "0.8.3"
1591source = "registry+https://github.com/rust-lang/crates.io-index" 1775source = "registry+https://github.com/rust-lang/crates.io-index"
1592checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" 1776checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63"
1593dependencies = [ 1777dependencies = [
1594 "openssl-probe", 1778 "openssl-probe",
1595 "rustls-pemfile", 1779 "rustls-pki-types",
1596 "schannel", 1780 "schannel",
1597 "security-framework", 1781 "security-framework",
1598] 1782]
1599 1783
1600[[package]] 1784[[package]]
1601name = "rustls-pemfile" 1785name = "rustls-pki-types"
1602version = "1.0.4" 1786version = "1.14.0"
1603source = "registry+https://github.com/rust-lang/crates.io-index" 1787source = "registry+https://github.com/rust-lang/crates.io-index"
1604checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 1788checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd"
1605dependencies = [ 1789dependencies = [
1606 "base64", 1790 "zeroize",
1607] 1791]
1608 1792
1609[[package]] 1793[[package]]
@@ -1617,24 +1801,36 @@ dependencies = [
1617] 1801]
1618 1802
1619[[package]] 1803[[package]]
1804name = "rustls-webpki"
1805version = "0.103.10"
1806source = "registry+https://github.com/rust-lang/crates.io-index"
1807checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef"
1808dependencies = [
1809 "aws-lc-rs",
1810 "ring",
1811 "rustls-pki-types",
1812 "untrusted",
1813]
1814
1815[[package]]
1620name = "rustversion" 1816name = "rustversion"
1621version = "1.0.15" 1817version = "1.0.22"
1622source = "registry+https://github.com/rust-lang/crates.io-index" 1818source = "registry+https://github.com/rust-lang/crates.io-index"
1623checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" 1819checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
1624 1820
1625[[package]] 1821[[package]]
1626name = "ryu" 1822name = "ryu"
1627version = "1.0.17" 1823version = "1.0.23"
1628source = "registry+https://github.com/rust-lang/crates.io-index" 1824source = "registry+https://github.com/rust-lang/crates.io-index"
1629checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" 1825checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
1630 1826
1631[[package]] 1827[[package]]
1632name = "schannel" 1828name = "schannel"
1633version = "0.1.23" 1829version = "0.1.29"
1634source = "registry+https://github.com/rust-lang/crates.io-index" 1830source = "registry+https://github.com/rust-lang/crates.io-index"
1635checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 1831checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939"
1636dependencies = [ 1832dependencies = [
1637 "windows-sys 0.52.0", 1833 "windows-sys 0.61.2",
1638] 1834]
1639 1835
1640[[package]] 1836[[package]]
@@ -1669,11 +1865,11 @@ dependencies = [
1669 1865
1670[[package]] 1866[[package]]
1671name = "security-framework" 1867name = "security-framework"
1672version = "2.10.0" 1868version = "3.7.0"
1673source = "registry+https://github.com/rust-lang/crates.io-index" 1869source = "registry+https://github.com/rust-lang/crates.io-index"
1674checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" 1870checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d"
1675dependencies = [ 1871dependencies = [
1676 "bitflags 1.3.2", 1872 "bitflags",
1677 "core-foundation", 1873 "core-foundation",
1678 "core-foundation-sys", 1874 "core-foundation-sys",
1679 "libc", 1875 "libc",
@@ -1682,9 +1878,9 @@ dependencies = [
1682 1878
1683[[package]] 1879[[package]]
1684name = "security-framework-sys" 1880name = "security-framework-sys"
1685version = "2.10.0" 1881version = "2.17.0"
1686source = "registry+https://github.com/rust-lang/crates.io-index" 1882source = "registry+https://github.com/rust-lang/crates.io-index"
1687checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" 1883checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3"
1688dependencies = [ 1884dependencies = [
1689 "core-foundation-sys", 1885 "core-foundation-sys",
1690 "libc", 1886 "libc",
@@ -1692,24 +1888,34 @@ dependencies = [
1692 1888
1693[[package]] 1889[[package]]
1694name = "semver" 1890name = "semver"
1695version = "1.0.22" 1891version = "1.0.28"
1696source = "registry+https://github.com/rust-lang/crates.io-index" 1892source = "registry+https://github.com/rust-lang/crates.io-index"
1697checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" 1893checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
1698 1894
1699[[package]] 1895[[package]]
1700name = "serde" 1896name = "serde"
1701version = "1.0.199" 1897version = "1.0.228"
1702source = "registry+https://github.com/rust-lang/crates.io-index" 1898source = "registry+https://github.com/rust-lang/crates.io-index"
1703checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a" 1899checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
1900dependencies = [
1901 "serde_core",
1902 "serde_derive",
1903]
1904
1905[[package]]
1906name = "serde_core"
1907version = "1.0.228"
1908source = "registry+https://github.com/rust-lang/crates.io-index"
1909checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
1704dependencies = [ 1910dependencies = [
1705 "serde_derive", 1911 "serde_derive",
1706] 1912]
1707 1913
1708[[package]] 1914[[package]]
1709name = "serde_derive" 1915name = "serde_derive"
1710version = "1.0.199" 1916version = "1.0.228"
1711source = "registry+https://github.com/rust-lang/crates.io-index" 1917source = "registry+https://github.com/rust-lang/crates.io-index"
1712checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc" 1918checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
1713dependencies = [ 1919dependencies = [
1714 "proc-macro2", 1920 "proc-macro2",
1715 "quote", 1921 "quote",
@@ -1718,23 +1924,26 @@ dependencies = [
1718 1924
1719[[package]] 1925[[package]]
1720name = "serde_json" 1926name = "serde_json"
1721version = "1.0.116" 1927version = "1.0.149"
1722source = "registry+https://github.com/rust-lang/crates.io-index" 1928source = "registry+https://github.com/rust-lang/crates.io-index"
1723checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" 1929checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
1724dependencies = [ 1930dependencies = [
1725 "itoa", 1931 "itoa",
1726 "ryu", 1932 "memchr",
1727 "serde", 1933 "serde",
1934 "serde_core",
1935 "zmij",
1728] 1936]
1729 1937
1730[[package]] 1938[[package]]
1731name = "serde_path_to_error" 1939name = "serde_path_to_error"
1732version = "0.1.16" 1940version = "0.1.20"
1733source = "registry+https://github.com/rust-lang/crates.io-index" 1941source = "registry+https://github.com/rust-lang/crates.io-index"
1734checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" 1942checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457"
1735dependencies = [ 1943dependencies = [
1736 "itoa", 1944 "itoa",
1737 "serde", 1945 "serde",
1946 "serde_core",
1738] 1947]
1739 1948
1740[[package]] 1949[[package]]
@@ -1762,9 +1971,9 @@ dependencies = [
1762 1971
1763[[package]] 1972[[package]]
1764name = "sha2" 1973name = "sha2"
1765version = "0.10.8" 1974version = "0.10.9"
1766source = "registry+https://github.com/rust-lang/crates.io-index" 1975source = "registry+https://github.com/rust-lang/crates.io-index"
1767checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1976checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
1768dependencies = [ 1977dependencies = [
1769 "cfg-if", 1978 "cfg-if",
1770 "cpufeatures", 1979 "cpufeatures",
@@ -1781,11 +1990,18 @@ dependencies = [
1781] 1990]
1782 1991
1783[[package]] 1992[[package]]
1993name = "shlex"
1994version = "1.3.0"
1995source = "registry+https://github.com/rust-lang/crates.io-index"
1996checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
1997
1998[[package]]
1784name = "signal-hook-registry" 1999name = "signal-hook-registry"
1785version = "1.4.2" 2000version = "1.4.8"
1786source = "registry+https://github.com/rust-lang/crates.io-index" 2001source = "registry+https://github.com/rust-lang/crates.io-index"
1787checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 2002checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
1788dependencies = [ 2003dependencies = [
2004 "errno",
1789 "libc", 2005 "libc",
1790] 2006]
1791 2007
@@ -1801,34 +2017,41 @@ dependencies = [
1801 2017
1802[[package]] 2018[[package]]
1803name = "slab" 2019name = "slab"
1804version = "0.4.9" 2020version = "0.4.12"
1805source = "registry+https://github.com/rust-lang/crates.io-index" 2021source = "registry+https://github.com/rust-lang/crates.io-index"
1806checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2022checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
1807dependencies = [
1808 "autocfg",
1809]
1810 2023
1811[[package]] 2024[[package]]
1812name = "smallvec" 2025name = "smallvec"
1813version = "1.13.2" 2026version = "1.15.1"
1814source = "registry+https://github.com/rust-lang/crates.io-index" 2027source = "registry+https://github.com/rust-lang/crates.io-index"
1815checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 2028checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
1816 2029
1817[[package]] 2030[[package]]
1818name = "socket2" 2031name = "socket2"
1819version = "0.5.7" 2032version = "0.5.10"
1820source = "registry+https://github.com/rust-lang/crates.io-index" 2033source = "registry+https://github.com/rust-lang/crates.io-index"
1821checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 2034checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678"
1822dependencies = [ 2035dependencies = [
1823 "libc", 2036 "libc",
1824 "windows-sys 0.52.0", 2037 "windows-sys 0.52.0",
1825] 2038]
1826 2039
1827[[package]] 2040[[package]]
2041name = "socket2"
2042version = "0.6.3"
2043source = "registry+https://github.com/rust-lang/crates.io-index"
2044checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
2045dependencies = [
2046 "libc",
2047 "windows-sys 0.61.2",
2048]
2049
2050[[package]]
1828name = "spin" 2051name = "spin"
1829version = "0.9.8" 2052version = "0.10.0"
1830source = "registry+https://github.com/rust-lang/crates.io-index" 2053source = "registry+https://github.com/rust-lang/crates.io-index"
1831checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 2054checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591"
1832 2055
1833[[package]] 2056[[package]]
1834name = "spki" 2057name = "spki"
@@ -1841,16 +2064,22 @@ dependencies = [
1841] 2064]
1842 2065
1843[[package]] 2066[[package]]
2067name = "stable_deref_trait"
2068version = "1.2.1"
2069source = "registry+https://github.com/rust-lang/crates.io-index"
2070checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
2071
2072[[package]]
1844name = "subtle" 2073name = "subtle"
1845version = "2.5.0" 2074version = "2.6.1"
1846source = "registry+https://github.com/rust-lang/crates.io-index" 2075source = "registry+https://github.com/rust-lang/crates.io-index"
1847checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 2076checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
1848 2077
1849[[package]] 2078[[package]]
1850name = "syn" 2079name = "syn"
1851version = "2.0.60" 2080version = "2.0.117"
1852source = "registry+https://github.com/rust-lang/crates.io-index" 2081source = "registry+https://github.com/rust-lang/crates.io-index"
1853checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" 2082checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
1854dependencies = [ 2083dependencies = [
1855 "proc-macro2", 2084 "proc-macro2",
1856 "quote", 2085 "quote",
@@ -1859,95 +2088,92 @@ dependencies = [
1859 2088
1860[[package]] 2089[[package]]
1861name = "sync_wrapper" 2090name = "sync_wrapper"
1862version = "0.1.2" 2091version = "1.0.2"
1863source = "registry+https://github.com/rust-lang/crates.io-index" 2092source = "registry+https://github.com/rust-lang/crates.io-index"
1864checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 2093checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
1865 2094
1866[[package]] 2095[[package]]
1867name = "sync_wrapper" 2096name = "synstructure"
1868version = "1.0.1" 2097version = "0.13.2"
1869source = "registry+https://github.com/rust-lang/crates.io-index" 2098source = "registry+https://github.com/rust-lang/crates.io-index"
1870checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" 2099checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
2100dependencies = [
2101 "proc-macro2",
2102 "quote",
2103 "syn",
2104]
1871 2105
1872[[package]] 2106[[package]]
1873name = "thread_local" 2107name = "thread_local"
1874version = "1.1.8" 2108version = "1.1.9"
1875source = "registry+https://github.com/rust-lang/crates.io-index" 2109source = "registry+https://github.com/rust-lang/crates.io-index"
1876checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 2110checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
1877dependencies = [ 2111dependencies = [
1878 "cfg-if", 2112 "cfg-if",
1879 "once_cell",
1880] 2113]
1881 2114
1882[[package]] 2115[[package]]
1883name = "time" 2116name = "time"
1884version = "0.3.36" 2117version = "0.3.47"
1885source = "registry+https://github.com/rust-lang/crates.io-index" 2118source = "registry+https://github.com/rust-lang/crates.io-index"
1886checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" 2119checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
1887dependencies = [ 2120dependencies = [
1888 "deranged", 2121 "deranged",
1889 "num-conv", 2122 "num-conv",
1890 "powerfmt", 2123 "powerfmt",
1891 "serde", 2124 "serde_core",
1892 "time-core", 2125 "time-core",
1893 "time-macros", 2126 "time-macros",
1894] 2127]
1895 2128
1896[[package]] 2129[[package]]
1897name = "time-core" 2130name = "time-core"
1898version = "0.1.2" 2131version = "0.1.8"
1899source = "registry+https://github.com/rust-lang/crates.io-index" 2132source = "registry+https://github.com/rust-lang/crates.io-index"
1900checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 2133checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
1901 2134
1902[[package]] 2135[[package]]
1903name = "time-macros" 2136name = "time-macros"
1904version = "0.2.18" 2137version = "0.2.27"
1905source = "registry+https://github.com/rust-lang/crates.io-index" 2138source = "registry+https://github.com/rust-lang/crates.io-index"
1906checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" 2139checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
1907dependencies = [ 2140dependencies = [
1908 "num-conv", 2141 "num-conv",
1909 "time-core", 2142 "time-core",
1910] 2143]
1911 2144
1912[[package]] 2145[[package]]
1913name = "tinyvec" 2146name = "tinystr"
1914version = "1.6.0" 2147version = "0.8.3"
1915source = "registry+https://github.com/rust-lang/crates.io-index" 2148source = "registry+https://github.com/rust-lang/crates.io-index"
1916checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2149checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
1917dependencies = [ 2150dependencies = [
1918 "tinyvec_macros", 2151 "displaydoc",
2152 "zerovec",
1919] 2153]
1920 2154
1921[[package]] 2155[[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" 2156name = "tokio"
1929version = "1.37.0" 2157version = "1.51.0"
1930source = "registry+https://github.com/rust-lang/crates.io-index" 2158source = "registry+https://github.com/rust-lang/crates.io-index"
1931checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" 2159checksum = "2bd1c4c0fc4a7ab90fc15ef6daaa3ec3b893f004f915f2392557ed23237820cd"
1932dependencies = [ 2160dependencies = [
1933 "backtrace",
1934 "bytes", 2161 "bytes",
1935 "libc", 2162 "libc",
1936 "mio", 2163 "mio",
1937 "num_cpus",
1938 "parking_lot", 2164 "parking_lot",
1939 "pin-project-lite", 2165 "pin-project-lite",
1940 "signal-hook-registry", 2166 "signal-hook-registry",
1941 "socket2", 2167 "socket2 0.6.3",
1942 "tokio-macros", 2168 "tokio-macros",
1943 "windows-sys 0.48.0", 2169 "windows-sys 0.61.2",
1944] 2170]
1945 2171
1946[[package]] 2172[[package]]
1947name = "tokio-macros" 2173name = "tokio-macros"
1948version = "2.2.0" 2174version = "2.7.0"
1949source = "registry+https://github.com/rust-lang/crates.io-index" 2175source = "registry+https://github.com/rust-lang/crates.io-index"
1950checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 2176checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
1951dependencies = [ 2177dependencies = [
1952 "proc-macro2", 2178 "proc-macro2",
1953 "quote", 2179 "quote",
@@ -1960,34 +2186,43 @@ version = "0.24.1"
1960source = "registry+https://github.com/rust-lang/crates.io-index" 2186source = "registry+https://github.com/rust-lang/crates.io-index"
1961checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 2187checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
1962dependencies = [ 2188dependencies = [
1963 "rustls", 2189 "rustls 0.21.12",
2190 "tokio",
2191]
2192
2193[[package]]
2194name = "tokio-rustls"
2195version = "0.26.4"
2196source = "registry+https://github.com/rust-lang/crates.io-index"
2197checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
2198dependencies = [
2199 "rustls 0.23.37",
1964 "tokio", 2200 "tokio",
1965] 2201]
1966 2202
1967[[package]] 2203[[package]]
1968name = "tokio-util" 2204name = "tokio-util"
1969version = "0.7.10" 2205version = "0.7.18"
1970source = "registry+https://github.com/rust-lang/crates.io-index" 2206source = "registry+https://github.com/rust-lang/crates.io-index"
1971checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" 2207checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098"
1972dependencies = [ 2208dependencies = [
1973 "bytes", 2209 "bytes",
1974 "futures-core", 2210 "futures-core",
1975 "futures-sink", 2211 "futures-sink",
1976 "pin-project-lite", 2212 "pin-project-lite",
1977 "tokio", 2213 "tokio",
1978 "tracing",
1979] 2214]
1980 2215
1981[[package]] 2216[[package]]
1982name = "tower" 2217name = "tower"
1983version = "0.4.13" 2218version = "0.5.3"
1984source = "registry+https://github.com/rust-lang/crates.io-index" 2219source = "registry+https://github.com/rust-lang/crates.io-index"
1985checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 2220checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
1986dependencies = [ 2221dependencies = [
1987 "futures-core", 2222 "futures-core",
1988 "futures-util", 2223 "futures-util",
1989 "pin-project",
1990 "pin-project-lite", 2224 "pin-project-lite",
2225 "sync_wrapper",
1991 "tokio", 2226 "tokio",
1992 "tower-layer", 2227 "tower-layer",
1993 "tower-service", 2228 "tower-service",
@@ -1996,21 +2231,21 @@ dependencies = [
1996 2231
1997[[package]] 2232[[package]]
1998name = "tower-layer" 2233name = "tower-layer"
1999version = "0.3.2" 2234version = "0.3.3"
2000source = "registry+https://github.com/rust-lang/crates.io-index" 2235source = "registry+https://github.com/rust-lang/crates.io-index"
2001checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 2236checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
2002 2237
2003[[package]] 2238[[package]]
2004name = "tower-service" 2239name = "tower-service"
2005version = "0.3.2" 2240version = "0.3.3"
2006source = "registry+https://github.com/rust-lang/crates.io-index" 2241source = "registry+https://github.com/rust-lang/crates.io-index"
2007checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2242checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
2008 2243
2009[[package]] 2244[[package]]
2010name = "tracing" 2245name = "tracing"
2011version = "0.1.40" 2246version = "0.1.44"
2012source = "registry+https://github.com/rust-lang/crates.io-index" 2247source = "registry+https://github.com/rust-lang/crates.io-index"
2013checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 2248checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
2014dependencies = [ 2249dependencies = [
2015 "log", 2250 "log",
2016 "pin-project-lite", 2251 "pin-project-lite",
@@ -2020,9 +2255,9 @@ dependencies = [
2020 2255
2021[[package]] 2256[[package]]
2022name = "tracing-attributes" 2257name = "tracing-attributes"
2023version = "0.1.27" 2258version = "0.1.31"
2024source = "registry+https://github.com/rust-lang/crates.io-index" 2259source = "registry+https://github.com/rust-lang/crates.io-index"
2025checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 2260checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
2026dependencies = [ 2261dependencies = [
2027 "proc-macro2", 2262 "proc-macro2",
2028 "quote", 2263 "quote",
@@ -2031,9 +2266,9 @@ dependencies = [
2031 2266
2032[[package]] 2267[[package]]
2033name = "tracing-core" 2268name = "tracing-core"
2034version = "0.1.32" 2269version = "0.1.36"
2035source = "registry+https://github.com/rust-lang/crates.io-index" 2270source = "registry+https://github.com/rust-lang/crates.io-index"
2036checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 2271checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
2037dependencies = [ 2272dependencies = [
2038 "once_cell", 2273 "once_cell",
2039 "valuable", 2274 "valuable",
@@ -2052,14 +2287,14 @@ dependencies = [
2052 2287
2053[[package]] 2288[[package]]
2054name = "tracing-subscriber" 2289name = "tracing-subscriber"
2055version = "0.3.18" 2290version = "0.3.23"
2056source = "registry+https://github.com/rust-lang/crates.io-index" 2291source = "registry+https://github.com/rust-lang/crates.io-index"
2057checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 2292checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
2058dependencies = [ 2293dependencies = [
2059 "matchers", 2294 "matchers",
2060 "nu-ansi-term", 2295 "nu-ansi-term",
2061 "once_cell", 2296 "once_cell",
2062 "regex", 2297 "regex-automata",
2063 "sharded-slab", 2298 "sharded-slab",
2064 "smallvec", 2299 "smallvec",
2065 "thread_local", 2300 "thread_local",
@@ -2076,30 +2311,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
2076 2311
2077[[package]] 2312[[package]]
2078name = "typenum" 2313name = "typenum"
2079version = "1.17.0" 2314version = "1.19.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" 2315source = "registry+https://github.com/rust-lang/crates.io-index"
2087checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 2316checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
2088 2317
2089[[package]] 2318[[package]]
2090name = "unicode-ident" 2319name = "unicode-ident"
2091version = "1.0.12" 2320version = "1.0.24"
2092source = "registry+https://github.com/rust-lang/crates.io-index" 2321source = "registry+https://github.com/rust-lang/crates.io-index"
2093checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 2322checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
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 2323
2104[[package]] 2324[[package]]
2105name = "untrusted" 2325name = "untrusted"
@@ -2109,13 +2329,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
2109 2329
2110[[package]] 2330[[package]]
2111name = "url" 2331name = "url"
2112version = "2.5.0" 2332version = "2.5.8"
2113source = "registry+https://github.com/rust-lang/crates.io-index" 2333source = "registry+https://github.com/rust-lang/crates.io-index"
2114checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 2334checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
2115dependencies = [ 2335dependencies = [
2116 "form_urlencoded", 2336 "form_urlencoded",
2117 "idna", 2337 "idna",
2118 "percent-encoding", 2338 "percent-encoding",
2339 "serde",
2119] 2340]
2120 2341
2121[[package]] 2342[[package]]
@@ -2125,22 +2346,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2125checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 2346checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
2126 2347
2127[[package]] 2348[[package]]
2349name = "utf8_iter"
2350version = "1.0.4"
2351source = "registry+https://github.com/rust-lang/crates.io-index"
2352checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
2353
2354[[package]]
2128name = "uuid" 2355name = "uuid"
2129version = "1.8.0" 2356version = "1.23.0"
2130source = "registry+https://github.com/rust-lang/crates.io-index" 2357source = "registry+https://github.com/rust-lang/crates.io-index"
2131checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" 2358checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9"
2359dependencies = [
2360 "js-sys",
2361 "wasm-bindgen",
2362]
2132 2363
2133[[package]] 2364[[package]]
2134name = "valuable" 2365name = "valuable"
2135version = "0.1.0" 2366version = "0.1.1"
2136source = "registry+https://github.com/rust-lang/crates.io-index" 2367source = "registry+https://github.com/rust-lang/crates.io-index"
2137checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2368checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
2138 2369
2139[[package]] 2370[[package]]
2140name = "version_check" 2371name = "version_check"
2141version = "0.9.4" 2372version = "0.9.5"
2142source = "registry+https://github.com/rust-lang/crates.io-index" 2373source = "registry+https://github.com/rust-lang/crates.io-index"
2143checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2374checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
2144 2375
2145[[package]] 2376[[package]]
2146name = "vsimd" 2377name = "vsimd"
@@ -2159,40 +2390,37 @@ dependencies = [
2159 2390
2160[[package]] 2391[[package]]
2161name = "wasi" 2392name = "wasi"
2162version = "0.11.0+wasi-snapshot-preview1" 2393version = "0.11.1+wasi-snapshot-preview1"
2163source = "registry+https://github.com/rust-lang/crates.io-index" 2394source = "registry+https://github.com/rust-lang/crates.io-index"
2164checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2395checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
2165 2396
2166[[package]] 2397[[package]]
2167name = "wasm-bindgen" 2398name = "wasip2"
2168version = "0.2.92" 2399version = "1.0.2+wasi-0.2.9"
2169source = "registry+https://github.com/rust-lang/crates.io-index" 2400source = "registry+https://github.com/rust-lang/crates.io-index"
2170checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 2401checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
2171dependencies = [ 2402dependencies = [
2172 "cfg-if", 2403 "wit-bindgen",
2173 "wasm-bindgen-macro",
2174] 2404]
2175 2405
2176[[package]] 2406[[package]]
2177name = "wasm-bindgen-backend" 2407name = "wasm-bindgen"
2178version = "0.2.92" 2408version = "0.2.117"
2179source = "registry+https://github.com/rust-lang/crates.io-index" 2409source = "registry+https://github.com/rust-lang/crates.io-index"
2180checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 2410checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0"
2181dependencies = [ 2411dependencies = [
2182 "bumpalo", 2412 "cfg-if",
2183 "log",
2184 "once_cell", 2413 "once_cell",
2185 "proc-macro2", 2414 "rustversion",
2186 "quote", 2415 "wasm-bindgen-macro",
2187 "syn",
2188 "wasm-bindgen-shared", 2416 "wasm-bindgen-shared",
2189] 2417]
2190 2418
2191[[package]] 2419[[package]]
2192name = "wasm-bindgen-macro" 2420name = "wasm-bindgen-macro"
2193version = "0.2.92" 2421version = "0.2.117"
2194source = "registry+https://github.com/rust-lang/crates.io-index" 2422source = "registry+https://github.com/rust-lang/crates.io-index"
2195checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 2423checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be"
2196dependencies = [ 2424dependencies = [
2197 "quote", 2425 "quote",
2198 "wasm-bindgen-macro-support", 2426 "wasm-bindgen-macro-support",
@@ -2200,61 +2428,83 @@ dependencies = [
2200 2428
2201[[package]] 2429[[package]]
2202name = "wasm-bindgen-macro-support" 2430name = "wasm-bindgen-macro-support"
2203version = "0.2.92" 2431version = "0.2.117"
2204source = "registry+https://github.com/rust-lang/crates.io-index" 2432source = "registry+https://github.com/rust-lang/crates.io-index"
2205checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 2433checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2"
2206dependencies = [ 2434dependencies = [
2435 "bumpalo",
2207 "proc-macro2", 2436 "proc-macro2",
2208 "quote", 2437 "quote",
2209 "syn", 2438 "syn",
2210 "wasm-bindgen-backend",
2211 "wasm-bindgen-shared", 2439 "wasm-bindgen-shared",
2212] 2440]
2213 2441
2214[[package]] 2442[[package]]
2215name = "wasm-bindgen-shared" 2443name = "wasm-bindgen-shared"
2216version = "0.2.92" 2444version = "0.2.117"
2217source = "registry+https://github.com/rust-lang/crates.io-index" 2445source = "registry+https://github.com/rust-lang/crates.io-index"
2218checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 2446checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b"
2447dependencies = [
2448 "unicode-ident",
2449]
2219 2450
2220[[package]] 2451[[package]]
2221name = "winapi" 2452name = "windows-core"
2222version = "0.3.9" 2453version = "0.62.2"
2223source = "registry+https://github.com/rust-lang/crates.io-index" 2454source = "registry+https://github.com/rust-lang/crates.io-index"
2224checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2455checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
2225dependencies = [ 2456dependencies = [
2226 "winapi-i686-pc-windows-gnu", 2457 "windows-implement",
2227 "winapi-x86_64-pc-windows-gnu", 2458 "windows-interface",
2459 "windows-link",
2460 "windows-result",
2461 "windows-strings",
2228] 2462]
2229 2463
2230[[package]] 2464[[package]]
2231name = "winapi-i686-pc-windows-gnu" 2465name = "windows-implement"
2232version = "0.4.0" 2466version = "0.60.2"
2233source = "registry+https://github.com/rust-lang/crates.io-index" 2467source = "registry+https://github.com/rust-lang/crates.io-index"
2234checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2468checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
2469dependencies = [
2470 "proc-macro2",
2471 "quote",
2472 "syn",
2473]
2235 2474
2236[[package]] 2475[[package]]
2237name = "winapi-x86_64-pc-windows-gnu" 2476name = "windows-interface"
2238version = "0.4.0" 2477version = "0.59.3"
2239source = "registry+https://github.com/rust-lang/crates.io-index" 2478source = "registry+https://github.com/rust-lang/crates.io-index"
2240checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2479checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
2480dependencies = [
2481 "proc-macro2",
2482 "quote",
2483 "syn",
2484]
2241 2485
2242[[package]] 2486[[package]]
2243name = "windows-core" 2487name = "windows-link"
2244version = "0.52.0" 2488version = "0.2.1"
2489source = "registry+https://github.com/rust-lang/crates.io-index"
2490checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
2491
2492[[package]]
2493name = "windows-result"
2494version = "0.4.1"
2245source = "registry+https://github.com/rust-lang/crates.io-index" 2495source = "registry+https://github.com/rust-lang/crates.io-index"
2246checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2496checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
2247dependencies = [ 2497dependencies = [
2248 "windows-targets 0.52.5", 2498 "windows-link",
2249] 2499]
2250 2500
2251[[package]] 2501[[package]]
2252name = "windows-sys" 2502name = "windows-strings"
2253version = "0.48.0" 2503version = "0.5.1"
2254source = "registry+https://github.com/rust-lang/crates.io-index" 2504source = "registry+https://github.com/rust-lang/crates.io-index"
2255checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2505checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
2256dependencies = [ 2506dependencies = [
2257 "windows-targets 0.48.5", 2507 "windows-link",
2258] 2508]
2259 2509
2260[[package]] 2510[[package]]
@@ -2263,150 +2513,177 @@ version = "0.52.0"
2263source = "registry+https://github.com/rust-lang/crates.io-index" 2513source = "registry+https://github.com/rust-lang/crates.io-index"
2264checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2514checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
2265dependencies = [ 2515dependencies = [
2266 "windows-targets 0.52.5", 2516 "windows-targets",
2267] 2517]
2268 2518
2269[[package]] 2519[[package]]
2270name = "windows-targets" 2520name = "windows-sys"
2271version = "0.48.5" 2521version = "0.61.2"
2272source = "registry+https://github.com/rust-lang/crates.io-index" 2522source = "registry+https://github.com/rust-lang/crates.io-index"
2273checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2523checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
2274dependencies = [ 2524dependencies = [
2275 "windows_aarch64_gnullvm 0.48.5", 2525 "windows-link",
2276 "windows_aarch64_msvc 0.48.5",
2277 "windows_i686_gnu 0.48.5",
2278 "windows_i686_msvc 0.48.5",
2279 "windows_x86_64_gnu 0.48.5",
2280 "windows_x86_64_gnullvm 0.48.5",
2281 "windows_x86_64_msvc 0.48.5",
2282] 2526]
2283 2527
2284[[package]] 2528[[package]]
2285name = "windows-targets" 2529name = "windows-targets"
2286version = "0.52.5" 2530version = "0.52.6"
2287source = "registry+https://github.com/rust-lang/crates.io-index" 2531source = "registry+https://github.com/rust-lang/crates.io-index"
2288checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" 2532checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
2289dependencies = [ 2533dependencies = [
2290 "windows_aarch64_gnullvm 0.52.5", 2534 "windows_aarch64_gnullvm",
2291 "windows_aarch64_msvc 0.52.5", 2535 "windows_aarch64_msvc",
2292 "windows_i686_gnu 0.52.5", 2536 "windows_i686_gnu",
2293 "windows_i686_gnullvm", 2537 "windows_i686_gnullvm",
2294 "windows_i686_msvc 0.52.5", 2538 "windows_i686_msvc",
2295 "windows_x86_64_gnu 0.52.5", 2539 "windows_x86_64_gnu",
2296 "windows_x86_64_gnullvm 0.52.5", 2540 "windows_x86_64_gnullvm",
2297 "windows_x86_64_msvc 0.52.5", 2541 "windows_x86_64_msvc",
2298] 2542]
2299 2543
2300[[package]] 2544[[package]]
2301name = "windows_aarch64_gnullvm" 2545name = "windows_aarch64_gnullvm"
2302version = "0.48.5" 2546version = "0.52.6"
2303source = "registry+https://github.com/rust-lang/crates.io-index" 2547source = "registry+https://github.com/rust-lang/crates.io-index"
2304checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2548checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
2305 2549
2306[[package]] 2550[[package]]
2307name = "windows_aarch64_gnullvm" 2551name = "windows_aarch64_msvc"
2308version = "0.52.5" 2552version = "0.52.6"
2309source = "registry+https://github.com/rust-lang/crates.io-index" 2553source = "registry+https://github.com/rust-lang/crates.io-index"
2310checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" 2554checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
2311 2555
2312[[package]] 2556[[package]]
2313name = "windows_aarch64_msvc" 2557name = "windows_i686_gnu"
2314version = "0.48.5" 2558version = "0.52.6"
2315source = "registry+https://github.com/rust-lang/crates.io-index" 2559source = "registry+https://github.com/rust-lang/crates.io-index"
2316checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2560checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
2317 2561
2318[[package]] 2562[[package]]
2319name = "windows_aarch64_msvc" 2563name = "windows_i686_gnullvm"
2320version = "0.52.5" 2564version = "0.52.6"
2321source = "registry+https://github.com/rust-lang/crates.io-index" 2565source = "registry+https://github.com/rust-lang/crates.io-index"
2322checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" 2566checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
2323 2567
2324[[package]] 2568[[package]]
2325name = "windows_i686_gnu" 2569name = "windows_i686_msvc"
2326version = "0.48.5" 2570version = "0.52.6"
2327source = "registry+https://github.com/rust-lang/crates.io-index" 2571source = "registry+https://github.com/rust-lang/crates.io-index"
2328checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2572checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
2329 2573
2330[[package]] 2574[[package]]
2331name = "windows_i686_gnu" 2575name = "windows_x86_64_gnu"
2332version = "0.52.5" 2576version = "0.52.6"
2333source = "registry+https://github.com/rust-lang/crates.io-index" 2577source = "registry+https://github.com/rust-lang/crates.io-index"
2334checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" 2578checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
2335 2579
2336[[package]] 2580[[package]]
2337name = "windows_i686_gnullvm" 2581name = "windows_x86_64_gnullvm"
2338version = "0.52.5" 2582version = "0.52.6"
2339source = "registry+https://github.com/rust-lang/crates.io-index" 2583source = "registry+https://github.com/rust-lang/crates.io-index"
2340checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" 2584checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
2341 2585
2342[[package]] 2586[[package]]
2343name = "windows_i686_msvc" 2587name = "windows_x86_64_msvc"
2344version = "0.48.5" 2588version = "0.52.6"
2345source = "registry+https://github.com/rust-lang/crates.io-index" 2589source = "registry+https://github.com/rust-lang/crates.io-index"
2346checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2590checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2347 2591
2348[[package]] 2592[[package]]
2349name = "windows_i686_msvc" 2593name = "wit-bindgen"
2350version = "0.52.5" 2594version = "0.51.0"
2351source = "registry+https://github.com/rust-lang/crates.io-index" 2595source = "registry+https://github.com/rust-lang/crates.io-index"
2352checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" 2596checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
2353 2597
2354[[package]] 2598[[package]]
2355name = "windows_x86_64_gnu" 2599name = "writeable"
2356version = "0.48.5" 2600version = "0.6.3"
2357source = "registry+https://github.com/rust-lang/crates.io-index" 2601source = "registry+https://github.com/rust-lang/crates.io-index"
2358checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2602checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
2359 2603
2360[[package]] 2604[[package]]
2361name = "windows_x86_64_gnu" 2605name = "xmlparser"
2362version = "0.52.5" 2606version = "0.13.6"
2363source = "registry+https://github.com/rust-lang/crates.io-index" 2607source = "registry+https://github.com/rust-lang/crates.io-index"
2364checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" 2608checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4"
2365 2609
2366[[package]] 2610[[package]]
2367name = "windows_x86_64_gnullvm" 2611name = "yoke"
2368version = "0.48.5" 2612version = "0.8.2"
2369source = "registry+https://github.com/rust-lang/crates.io-index" 2613source = "registry+https://github.com/rust-lang/crates.io-index"
2370checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2614checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
2615dependencies = [
2616 "stable_deref_trait",
2617 "yoke-derive",
2618 "zerofrom",
2619]
2371 2620
2372[[package]] 2621[[package]]
2373name = "windows_x86_64_gnullvm" 2622name = "yoke-derive"
2374version = "0.52.5" 2623version = "0.8.2"
2375source = "registry+https://github.com/rust-lang/crates.io-index" 2624source = "registry+https://github.com/rust-lang/crates.io-index"
2376checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" 2625checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
2626dependencies = [
2627 "proc-macro2",
2628 "quote",
2629 "syn",
2630 "synstructure",
2631]
2377 2632
2378[[package]] 2633[[package]]
2379name = "windows_x86_64_msvc" 2634name = "zerofrom"
2380version = "0.48.5" 2635version = "0.1.7"
2636source = "registry+https://github.com/rust-lang/crates.io-index"
2637checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df"
2638dependencies = [
2639 "zerofrom-derive",
2640]
2641
2642[[package]]
2643name = "zerofrom-derive"
2644version = "0.1.7"
2381source = "registry+https://github.com/rust-lang/crates.io-index" 2645source = "registry+https://github.com/rust-lang/crates.io-index"
2382checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2646checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
2647dependencies = [
2648 "proc-macro2",
2649 "quote",
2650 "syn",
2651 "synstructure",
2652]
2383 2653
2384[[package]] 2654[[package]]
2385name = "windows_x86_64_msvc" 2655name = "zeroize"
2386version = "0.52.5" 2656version = "1.8.2"
2387source = "registry+https://github.com/rust-lang/crates.io-index" 2657source = "registry+https://github.com/rust-lang/crates.io-index"
2388checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" 2658checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
2389 2659
2390[[package]] 2660[[package]]
2391name = "xmlparser" 2661name = "zerotrie"
2392version = "0.13.6" 2662version = "0.2.4"
2393source = "registry+https://github.com/rust-lang/crates.io-index" 2663source = "registry+https://github.com/rust-lang/crates.io-index"
2394checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" 2664checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
2665dependencies = [
2666 "displaydoc",
2667 "yoke",
2668 "zerofrom",
2669]
2395 2670
2396[[package]] 2671[[package]]
2397name = "zerocopy" 2672name = "zerovec"
2398version = "0.7.32" 2673version = "0.11.6"
2399source = "registry+https://github.com/rust-lang/crates.io-index" 2674source = "registry+https://github.com/rust-lang/crates.io-index"
2400checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" 2675checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
2401dependencies = [ 2676dependencies = [
2402 "zerocopy-derive", 2677 "yoke",
2678 "zerofrom",
2679 "zerovec-derive",
2403] 2680]
2404 2681
2405[[package]] 2682[[package]]
2406name = "zerocopy-derive" 2683name = "zerovec-derive"
2407version = "0.7.32" 2684version = "0.11.3"
2408source = "registry+https://github.com/rust-lang/crates.io-index" 2685source = "registry+https://github.com/rust-lang/crates.io-index"
2409checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" 2686checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
2410dependencies = [ 2687dependencies = [
2411 "proc-macro2", 2688 "proc-macro2",
2412 "quote", 2689 "quote",
@@ -2414,7 +2691,7 @@ dependencies = [
2414] 2691]
2415 2692
2416[[package]] 2693[[package]]
2417name = "zeroize" 2694name = "zmij"
2418version = "1.7.0" 2695version = "1.0.21"
2419source = "registry+https://github.com/rust-lang/crates.io-index" 2696source = "registry+https://github.com/rust-lang/crates.io-index"
2420checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" 2697checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
diff --git a/README.md b/README.md
index d699d2b..e0ba1b9 100644
--- a/README.md
+++ b/README.md
@@ -3,31 +3,31 @@ Gitolfs3: a very simple Git LFS server
3 3
4[![License: MIT](https://img.shields.io/badge/License-MIT-brightgreen.svg)](https://opensource.org/licenses/MIT) 4[![License: MIT](https://img.shields.io/badge/License-MIT-brightgreen.svg)](https://opensource.org/licenses/MIT)
5 5
6Gitolfs3 has a singular purpose: provide me with a personal Git LFS server that 6Gitolfs3 is the Git LFS server that runs on my VPS. It uses an S3-compatible
7I can run on my VPS, that stores objects in S3. It seems to be doing an okay 7service as backing storage. It seems to be working fine up until now, but
8job at it so far. 8doesn't get too much use (so the primary reason for breakage is me being too
9lazy to refresh credentials).
9 10
10The name 'Gitolfs3' started as some kind of concoction of Gitolite, LFS and S3. 11The name 'Gitolfs3' started as a portmanteau of Gitolite, Git LFS and S3. These
11These days, this project has nothing to do with Gitolite because I don't use 12days, this project has nothing to do with Gitolite, because I don't use
12Gitolite anymore. (It was too extensive for my use case, and I prefer to keep 13Gitolite anymore. (It was too extensive for my use case, and I prefer to keep
13the complexity of my system down as much as possible.) 14the complexity of my system down as much as possible.)
14 15
15Currently, it has the following features: 16Currently, it has the following features:
16 17
17- Storage with S3-compatible services (at the moment of writing, I am using 18- Storage with S3-compatible services (at the moment of writing, I am using
18 Scaleway Object Storage for this purpose). 19 Scaleway Object Storage).
19- Git LFS Batch API support. Only the basic transfer adapter is supported. Only 20- Git LFS Batch API support. Only the basic transfer adapter with
20 SHA256 Object IDs (OIDs) are supported. 21 SHA256 Object IDs (OIDs) is supported.
21- `git-lfs-authenticate` is provided for authentication over SSH. File transfer 22- `git-lfs-authenticate` is provided for authentication over SSH. File transfer
22 over SSH using `git-lfs-transfer` is not supported. 23 over SSH using `git-lfs-transfer` is not supported.
23- A Git shell is provided so that I can stay sane. (I don't recall 100%, but I 24- A Git shell is provided so that I can stay sane. (I don't recall 100%, but I
24 believe this was nice when wanting to push to some ssh://git@asdf/blabla.git 25 believe this was nice when wanting to push to some ssh://git@asdf/blabla.git
25 repo without having to type `/srv/git` before the repo name. And I don't want 26 repo without having to type `/srv/git` before the repo name. And I don't want
26 to have to use something like Gitolite.) 27 to have to use something like Gitolite.)
27- Gitolfs3 does not require any kind of persistent nor temporary storage for 28- No requirement for any kind of persistent or temporary storage for tokens.
28 token storage. Instead, user authentication/authorization between 29 Instead, user authentication/authorization between `git-lfs-authenticate` and
29 `git-lfs-authenticate` and the Gitolfs3 server is done using HMAC(-SHA256) 30 the Gitolfs3 server is done using HMAC(-SHA256) MACs.
30 MACs.
31- Limiting unauthenticated public downloads on a per-hour basis. Storage is 31- Limiting unauthenticated public downloads on a per-hour basis. Storage is
32 required for this. (This feature is implemented pretty badly.) 32 required for this. (This feature is implemented pretty badly.)
33- Public/private repos based on the `git-daemon-export-ok` file in the bare 33- Public/private repos based on the `git-daemon-export-ok` file in the bare
@@ -41,19 +41,16 @@ Currently, it has the following features:
41 - Authenticated users can download and upload for all repositories, 41 - Authenticated users can download and upload for all repositories,
42 regardless of how they access the service. 42 regardless of how they access the service.
43 43
44This program, as it is, solely serves my needs. Although I may occasionally add 44This program, as it is, works well enough for me. Although I may occasionally
45some features or perform some cleanups (especially the server still requires 45add some features or perform some cleanups, I don't really have the time to
46some), I have no interest in making this program work for people with different 46make this program work for different use cases than mine. Do feel free to email
47use cases than me. In case you want to use this software, feel free to, but 47me if you have any questions.
48expect that you will basically have to 'make it your own'. If you have a
49burning question or find a security vulnerability, feel free to email me. I'm
50sure you'll manage to find my email address somewhere.
51 48
52Nice-to-have features that I may implement at some point, when I feel a need 49Nice-to-have features that I may implement at some point, when I feel a need
53to: 50to:
54 51
55- No namespacing on S3. (This would mean that having the same big file in two 52- No namespacing on S3. (So the same big file in two repositories would only be
56 repositories would mean it is only stored on S3 once.) 53 stored on S3 once.)
57- Any kind of file deletion/garbage collection. If you ever have the need, you 54- Any kind of file deletion/garbage collection. You need to do this manually
58 need to do this manually right now. 55 right now.
59- Resuming downloads. 56- Resuming downloads.
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/docs/man/gitolfs3-shell.1 b/docs/man/gitolfs3-shell.1
index d7a3637..f5acb5a 100644
--- a/docs/man/gitolfs3-shell.1
+++ b/docs/man/gitolfs3-shell.1
@@ -1,4 +1,4 @@
1.TH GITOLFS3-SHELL 1 2024-04-29 Gitolfs3 "Gitolfs3 Manual" 1.TH GITOLFS3-SHELL 1 2026-04-11 Gitolfs3 "Gitolfs3 Manual"
2.SH NAME 2.SH NAME
3gitolfs3-shell \- Gitolfs3 shell 3gitolfs3-shell \- Gitolfs3 shell
4.SH SYNOPSIS 4.SH SYNOPSIS
@@ -9,19 +9,19 @@ gitolfs3-shell \- Gitolfs3 shell
9is the Gitolfs3 shell, usable as the default shell for the \fIgit\fR user. 9is the Gitolfs3 shell, usable as the default shell for the \fIgit\fR user.
10.SH COMMANDS 10.SH COMMANDS
11.TP 11.TP
12.B git-receive-pack \fR<repsitory>\fB 12.B git-receive-pack \fR<repository>\fB
13Alternatively, using \fBgit receive-pack\fR is also allowed. 13Alternatively, using \fBgit receive-pack\fR is also allowed.
14No other arguments nor options than indicated above are processed nor allowed. 14No other arguments nor options than indicated above are processed nor allowed.
15See 15See
16.BR git-receive-pack (1). 16.BR git-receive-pack (1).
17.TP 17.TP
18.B git-upload-archive \fR<repsitory>\fB 18.B git-upload-archive \fR<repository>\fB
19Alternatively, using \fBgit upload-archive\fR is also allowed. 19Alternatively, using \fBgit upload-archive\fR is also allowed.
20No other arguments nor options than indicated above are processed nor allowed. 20No other arguments nor options than indicated above are processed nor allowed.
21See 21See
22.BR git-upload-archive (1). 22.BR git-upload-archive (1).
23.TP 23.TP
24.B git-upload-pack \fR<repsitory>\fB 24.B git-upload-pack \fR<repository>\fB
25Alternatively, using \fBgit upload-pack\fR is also allowed. 25Alternatively, using \fBgit upload-pack\fR is also allowed.
26No other arguments nor options than indicated above are processed nor allowed. 26No other arguments nor options than indicated above are processed nor allowed.
27See 27See
diff --git a/flake.lock b/flake.lock
index 8e0b00e..878e306 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": 1771560015,
7 "narHash": "sha256-1BVft7ggSN2XXFeXQjazU3jN9wVECd9qp2mZx/8GDMk=", 7 "narHash": "sha256-TuZcPFTXgFyDTcs+olpuVquBphW0zrxoBxgZ4WjEXWE=",
8 "owner": "rustsec", 8 "owner": "rustsec",
9 "repo": "advisory-db", 9 "repo": "advisory-db",
10 "rev": "35e7459a331d3e0c585e56dabd03006b9b354088", 10 "rev": "81e3cd7b86b1a2e05c116072de9b61b872a43ae4",
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": 1771438068,
27 "narHash": "sha256-VuLm5tTMqfS82NZAsNfsW7U+pTZ1+GcOU7gYR/Fb1Z4=", 22 "narHash": "sha256-nGBbXvEZVe/egCPVPFcu89RFtd8Rf6J+4RFoVCFec0A=",
28 "rev": "9caad1eb0c69a13ee6467035353b71a76c85ea53", 23 "owner": "ipetkov",
29 "revCount": 540, 24 "repo": "crane",
30 "type": "tarball", 25 "rev": "b5090e53e9d68c523a4bb9ad42b4737ee6747597",
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": 1771419570,
58 "narHash": "sha256-KtvQeE12MSkCOhvVmnmcZCjnx7t31zWin2XVSDOwBDE=", 55 "narHash": "sha256-bxAlQgre3pcQcaRUm/8A0v/X8d2nhfraWSFqVmMcBcU=",
59 "rev": "b500489fd3cf653eafc075f9362423ad5cdd8676", 56 "owner": "NixOS",
60 "revCount": 557957, 57 "repo": "nixpkgs",
61 "type": "tarball", 58 "rev": "6d41bc27aaf7b6a3ba6b169db3bd5d6159cfaa47",
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.11",
64 "type": "indirect"
67 } 65 }
68 }, 66 },
69 "root": { 67 "root": {
@@ -77,19 +75,16 @@
77 }, 75 },
78 "rust-overlay": { 76 "rust-overlay": {
79 "inputs": { 77 "inputs": {
80 "flake-utils": [
81 "flake-utils"
82 ],
83 "nixpkgs": [ 78 "nixpkgs": [
84 "nixpkgs" 79 "nixpkgs"
85 ] 80 ]
86 }, 81 },
87 "locked": { 82 "locked": {
88 "lastModified": 1714356894, 83 "lastModified": 1771556776,
89 "narHash": "sha256-W6Mss7AG6bnFT1BqRApHXvLXBrFOu7V0+EUe9iML30s=", 84 "narHash": "sha256-zKprqMQDl3xVfhSSYvgru1IGXjFdxryWk+KqK0I20Xk=",
90 "owner": "oxalica", 85 "owner": "oxalica",
91 "repo": "rust-overlay", 86 "repo": "rust-overlay",
92 "rev": "d9b44509b4064f0a3fc9c7c92a603861f52fbedc", 87 "rev": "8b3f46b8a6d17ab46e533a5e3d5b1cc2ff228860",
93 "type": "github" 88 "type": "github"
94 }, 89 },
95 "original": { 90 "original": {
diff --git a/flake.nix b/flake.nix
index 586486c..b83e904 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.11";
4 flake-utils.url = "https://flakehub.com/f/numtide/flake-utils/0.1.92.tar.gz";
5 4
6 crane = { 5 crane.url = "github:ipetkov/crane";
7 url = "https://flakehub.com/f/ipetkov/crane/0.16.3.tar.gz"; 6 flake-utils.url = "github:numtide/flake-utils";
8 inputs.nixpkgs.follows = "nixpkgs";
9 };
10 7
11 advisory-db = { 8 advisory-db = {
12 url = "github:rustsec/advisory-db"; 9 url = "github:rustsec/advisory-db";
@@ -15,10 +12,7 @@
15 12
16 rust-overlay = { 13 rust-overlay = {
17 url = "github:oxalica/rust-overlay"; 14 url = "github:oxalica/rust-overlay";
18 inputs = { 15 inputs.nixpkgs.follows = "nixpkgs";
19 nixpkgs.follows = "nixpkgs";
20 flake-utils.follows = "flake-utils";
21 };
22 }; 16 };
23 }; 17 };
24 18
diff --git a/gitolfs3-authenticate/Cargo.toml b/gitolfs3-authenticate/Cargo.toml
index ff2b702..c39b736 100644
--- a/gitolfs3-authenticate/Cargo.toml
+++ b/gitolfs3-authenticate/Cargo.toml
@@ -1,7 +1,7 @@
1[package] 1[package]
2name = "gitolfs3-authenticate" 2name = "gitolfs3-authenticate"
3version = "0.1.0" 3version = "0.1.0"
4edition = "2021" 4edition = "2024"
5license = "MIT" 5license = "MIT"
6 6
7[dependencies] 7[dependencies]
diff --git a/gitolfs3-authenticate/src/main.rs b/gitolfs3-authenticate/src/main.rs
index 027c01b..bd44394 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
@@ -49,9 +49,9 @@ fn main() -> ExitCode {
49 ), 49 ),
50 }, 50 },
51 "expires_at": expires_at.to_rfc3339_opts(chrono::SecondsFormat::Secs, true), 51 "expires_at": expires_at.to_rfc3339_opts(chrono::SecondsFormat::Secs, true),
52 "href": format!("{}{}/info/lfs", config.href_base, repo_name), 52 "href": format!("{}{repo_name}/info/lfs", config.href_base),
53 }); 53 });
54 println!("{}", response); 54 println!("{response}");
55 55
56 ExitCode::SUCCESS 56 ExitCode::SUCCESS
57} 57}
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..91e2c57 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.8"
9aws-sdk-s3 = "1.12.0" 9aws-sdk-s3 = "1.128"
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.51", 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..b80c83a 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
41#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)]
42pub enum TransferAdapter {
43 #[serde(rename = "basic")]
44 Basic,
45 #[serde(other)]
46 Unknown,
47}
48
49#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)]
50pub enum HashAlgo {
51 #[serde(rename = "sha256")]
52 Sha256,
53 #[serde(other)]
54 Unknown,
55}
56 12
57impl Default for HashAlgo { 13// ----------------------- Generic facilities ----------------------
58 fn default() -> Self {
59 Self::Sha256
60 }
61}
62 14
63#[derive(Debug, Deserialize, PartialEq, Eq, Clone)] 15pub type GitLfsErrorResponse<'a> = (http::StatusCode, GitLfsJson<GitLfsErrorData<'a>>);
64pub struct BatchRequestObject {
65 pub oid: Oid,
66 pub size: i64,
67}
68 16
69#[derive(Debug, Serialize, Deserialize, Clone)] 17#[derive(Debug, Serialize)]
70struct BatchRef { 18pub struct GitLfsErrorData<'a> {
71 name: String, 19 pub message: &'a str,
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,87 @@ 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(Default, Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)]
172pub enum HashAlgo {
173 #[default]
174 #[serde(rename = "sha256")]
175 Sha256,
176 #[serde(other)]
177 Unknown,
178}
179
180#[derive(Debug, Serialize, Clone)]
181pub struct BatchResponse {
182 pub transfer: TransferAdapter,
183 pub objects: Vec<BatchResponseObject>,
184 pub hash_algo: HashAlgo,
201} 185}
202 186
203#[derive(Debug, Serialize, Clone)] 187#[derive(Debug, Serialize, Clone)]
@@ -211,10 +195,16 @@ pub struct BatchResponseObject {
211 pub error: Option<BatchResponseObjectError>, 195 pub error: Option<BatchResponseObjectError>,
212} 196}
213 197
198#[derive(Debug, Clone, Serialize)]
199pub struct BatchResponseObjectError {
200 pub code: u16,
201 pub message: String,
202}
203
214impl BatchResponseObject { 204impl BatchResponseObject {
215 pub fn error( 205 pub fn error(
216 obj: &BatchRequestObject, 206 obj: &BatchRequestObject,
217 code: StatusCode, 207 code: http::StatusCode,
218 message: String, 208 message: String,
219 ) -> BatchResponseObject { 209 ) -> BatchResponseObject {
220 BatchResponseObject { 210 BatchResponseObject {
@@ -231,10 +221,21 @@ impl BatchResponseObject {
231} 221}
232 222
233#[derive(Debug, Serialize, Clone)] 223#[derive(Debug, Serialize, Clone)]
234pub struct BatchResponse { 224pub struct BatchResponseObjectAction {
235 pub transfer: TransferAdapter, 225 pub href: String,
236 pub objects: Vec<BatchResponseObject>, 226 #[serde(skip_serializing_if = "HashMap::is_empty")]
237 pub hash_algo: HashAlgo, 227 pub header: HashMap<String, String>,
228 pub expires_at: DateTime<Utc>,
229}
230
231#[derive(Default, Debug, Serialize, Clone)]
232pub struct BatchResponseObjectActions {
233 #[serde(skip_serializing_if = "Option::is_none")]
234 pub upload: Option<BatchResponseObjectAction>,
235 #[serde(skip_serializing_if = "Option::is_none")]
236 pub download: Option<BatchResponseObjectAction>,
237 #[serde(skip_serializing_if = "Option::is_none")]
238 pub verify: Option<BatchResponseObjectAction>,
238} 239}
239 240
240#[test] 241#[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..1f47c9e 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,52 @@ 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(SdkError::ServiceError(e)) => {
76 Err(SdkError::ServiceError(e)) if e.err().is_not_found() => {} 61 println!(
77 Err(e) => { 62 "Failed to HeadObject (repo {repo}, OID {}): {}",
78 println!("Failed to HeadObject (repo {repo}, OID {}): {e}", obj.oid); 63 e.err(),
79 return Some(BatchResponseObject::error( 64 obj.oid
80 obj, 65 );
81 StatusCode::INTERNAL_SERVER_ERROR, 66 return Err(());
82 "Failed to query object information".to_string(), 67 }
83 )); 68 Err(e) => {
84 } 69 println!("Failed to HeadObject (repo {repo}, OID {}): {e}", obj.oid);
85 }; 70 return Err(());
86 71 }
87 let expires_in = std::time::Duration::from_secs(5 * 60); 72 };
88 let expires_at = Utc::now() + expires_in;
89 73
90 let Ok(config) = aws_sdk_s3::presigning::PresigningConfig::expires_in(expires_in) else { 74 // Scaleway actually doesn't provide SHA256 support, but maybe in the future :)
91 return Some(BatchResponseObject::error( 75 if !s3_validate_checksum(obj.oid, &result) || !s3_validate_size(obj.size, &result) {
92 obj, 76 return Ok(ObjectStatus::ExistsInconsistent);
93 StatusCode::INTERNAL_SERVER_ERROR, 77 }
94 "Failed to generate upload URL".to_string(), 78 Ok(ObjectStatus::ExistsOk {
95 )); 79 content_length: result.content_length(),
96 }; 80 })
97 let Ok(presigned) = state 81 }
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} 82}
131 83
132async fn handle_download_object( 84async fn handle_download_object(
@@ -136,44 +88,26 @@ async fn handle_download_object(
136 trusted: bool, 88 trusted: bool,
137) -> BatchResponseObject { 89) -> BatchResponseObject {
138 let (oid0, oid1) = (HexByte(obj.oid[0]), HexByte(obj.oid[1])); 90 let (oid0, oid1) = (HexByte(obj.oid[0]), HexByte(obj.oid[1]));
139 let full_path = format!("{repo}/lfs/objects/{}/{}/{}", oid0, oid1, obj.oid); 91 let full_path = format!("{repo}/lfs/objects/{oid0}/{oid1}/{}", obj.oid);
140 92
141 let result = match state 93 let content_length = match state.check_object(repo, obj).await {
142 .s3_client 94 Ok(ObjectStatus::ExistsOk { content_length }) => content_length,
143 .head_object() 95 Ok(_) => {
144 .bucket(&state.s3_bucket)
145 .key(&full_path)
146 .checksum_mode(aws_sdk_s3::types::ChecksumMode::Enabled)
147 .send()
148 .await
149 {
150 Ok(result) => result,
151 Err(e) => {
152 println!("Failed to HeadObject (repo {repo}, OID {}): {e}", obj.oid);
153 return BatchResponseObject::error( 96 return BatchResponseObject::error(
154 obj, 97 obj,
155 StatusCode::INTERNAL_SERVER_ERROR, 98 http::StatusCode::UNPROCESSABLE_ENTITY,
99 "Object corrupted".to_string(),
100 );
101 }
102 Err(_) => {
103 return BatchResponseObject::error(
104 obj,
105 http::StatusCode::INTERNAL_SERVER_ERROR,
156 "Failed to query object information".to_string(), 106 "Failed to query object information".to_string(),
157 ); 107 );
158 } 108 }
159 }; 109 };
160 110
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); 111 let expires_in = std::time::Duration::from_secs(5 * 60);
178 let expires_at = Utc::now() + expires_in; 112 let expires_at = Utc::now() + expires_in;
179 113
@@ -181,7 +115,7 @@ async fn handle_download_object(
181 let Ok(config) = aws_sdk_s3::presigning::PresigningConfig::expires_in(expires_in) else { 115 let Ok(config) = aws_sdk_s3::presigning::PresigningConfig::expires_in(expires_in) else {
182 return BatchResponseObject::error( 116 return BatchResponseObject::error(
183 obj, 117 obj,
184 StatusCode::INTERNAL_SERVER_ERROR, 118 http::StatusCode::INTERNAL_SERVER_ERROR,
185 "Failed to generate upload URL".to_string(), 119 "Failed to generate upload URL".to_string(),
186 ); 120 );
187 }; 121 };
@@ -195,7 +129,7 @@ async fn handle_download_object(
195 else { 129 else {
196 return BatchResponseObject::error( 130 return BatchResponseObject::error(
197 obj, 131 obj,
198 StatusCode::INTERNAL_SERVER_ERROR, 132 http::StatusCode::INTERNAL_SERVER_ERROR,
199 "Failed to generate upload URL".to_string(), 133 "Failed to generate upload URL".to_string(),
200 ); 134 );
201 }; 135 };
@@ -218,31 +152,31 @@ async fn handle_download_object(
218 }; 152 };
219 } 153 }
220 154
221 if let Some(content_length) = result.content_length() { 155 if let Some(content_length) = content_length
222 if content_length > 0 { 156 && content_length > 0
223 match state 157 {
224 .dl_limiter 158 match state
225 .lock() 159 .dl_limiter
226 .await 160 .lock()
227 .request(content_length as u64) 161 .await
228 .await 162 .request(content_length as u64)
229 { 163 .await
230 Ok(true) => {} 164 {
231 Ok(false) => { 165 Ok(true) => {}
232 return BatchResponseObject::error( 166 Ok(false) => {
233 obj, 167 return BatchResponseObject::error(
234 StatusCode::SERVICE_UNAVAILABLE, 168 obj,
235 "Public LFS downloads temporarily unavailable".to_string(), 169 http::StatusCode::SERVICE_UNAVAILABLE,
236 ); 170 "Public LFS downloads temporarily unavailable".to_string(),
237 } 171 );
238 Err(e) => { 172 }
239 println!("Failed to request {content_length} bytes from download limiter: {e}"); 173 Err(e) => {
240 return BatchResponseObject::error( 174 println!("Failed to request {content_length} bytes from download limiter: {e}");
241 obj, 175 return BatchResponseObject::error(
242 StatusCode::INTERNAL_SERVER_ERROR, 176 obj,
243 "Internal server error".to_string(), 177 http::StatusCode::INTERNAL_SERVER_ERROR,
244 ); 178 "Internal server error".to_string(),
245 } 179 );
246 } 180 }
247 } 181 }
248 } 182 }
@@ -257,18 +191,11 @@ async fn handle_download_object(
257 ) else { 191 ) else {
258 return BatchResponseObject::error( 192 return BatchResponseObject::error(
259 obj, 193 obj,
260 StatusCode::INTERNAL_SERVER_ERROR, 194 http::StatusCode::INTERNAL_SERVER_ERROR,
261 "Internal server error".to_string(), 195 "Internal server error".to_string(),
262 ); 196 );
263 }; 197 };
264 198
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 { 199 BatchResponseObject {
273 oid: obj.oid, 200 oid: obj.oid,
274 size: obj.size, 201 size: obj.size,
@@ -284,7 +211,13 @@ async fn handle_download_object(
284 map 211 map
285 }, 212 },
286 expires_at, 213 expires_at,
287 href: format!("{}/{upload_path}", state.base_url), 214 href: format!(
215 "{}/{repo}/info/lfs/objects/{}/{}/{}",
216 state.base_url,
217 HexByte(obj.oid[0]),
218 HexByte(obj.oid[1]),
219 obj.oid
220 ),
288 }), 221 }),
289 ..Default::default() 222 ..Default::default()
290 }, 223 },
@@ -292,83 +225,6 @@ async fn handle_download_object(
292 } 225 }
293} 226}
294 227
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)] 228#[derive(Deserialize, Copy, Clone)]
373#[serde(remote = "Self")] 229#[serde(remote = "Self")]
374pub struct FileParams { 230pub struct FileParams {
@@ -382,11 +238,11 @@ impl<'de> Deserialize<'de> for FileParams {
382 where 238 where
383 D: serde::Deserializer<'de>, 239 D: serde::Deserializer<'de>,
384 { 240 {
385 let unchecked @ FileParams { 241 let unchecked @ Self {
386 oid0: HexByte(oid0), 242 oid0: HexByte(oid0),
387 oid1: HexByte(oid1), 243 oid1: HexByte(oid1),
388 oid, 244 oid,
389 } = FileParams::deserialize(deserializer)?; 245 } = Self::deserialize(deserializer)?;
390 if oid0 != oid.as_bytes()[0] { 246 if oid0 != oid.as_bytes()[0] {
391 return Err(de::Error::custom( 247 return Err(de::Error::custom(
392 "first OID path part does not match first byte of full OID", 248 "first OID path part does not match first byte of full OID",
@@ -401,9 +257,9 @@ impl<'de> Deserialize<'de> for FileParams {
401 } 257 }
402} 258}
403 259
404pub async fn obj_download( 260pub async fn handle_obj_download(
405 State(state): State<Arc<AppState>>, 261 State(state): State<Arc<AppState>>,
406 headers: HeaderMap, 262 headers: http::HeaderMap,
407 RepositoryName(repo): RepositoryName, 263 RepositoryName(repo): RepositoryName,
408 Path(FileParams { oid0, oid1, oid }): Path<FileParams>, 264 Path(FileParams { oid0, oid1, oid }): Path<FileParams>,
409) -> Response { 265) -> Response {
@@ -411,7 +267,7 @@ pub async fn obj_download(
411 return e.into_response(); 267 return e.into_response();
412 } 268 }
413 269
414 let full_path = format!("{repo}/lfs/objects/{}/{}/{}", oid0, oid1, oid); 270 let full_path = format!("{repo}/lfs/objects/{oid0}/{oid1}/{oid}");
415 let result = match state 271 let result = match state
416 .s3_client 272 .s3_client
417 .get_object() 273 .get_object()
@@ -422,29 +278,37 @@ pub async fn obj_download(
422 .await 278 .await
423 { 279 {
424 Ok(result) => result, 280 Ok(result) => result,
281 Err(SdkError::ServiceError(e)) => {
282 println!("Failed to GetObject (repo {repo}, OID {oid}): {}", e.err());
283 return (
284 http::StatusCode::INTERNAL_SERVER_ERROR,
285 "Failed to query object information",
286 )
287 .into_response();
288 }
425 Err(e) => { 289 Err(e) => {
426 println!("Failed to GetObject (repo {repo}, OID {oid}): {e}"); 290 println!("Failed to GetObject (repo {repo}, OID {oid}): {e}");
427 return ( 291 return (
428 StatusCode::INTERNAL_SERVER_ERROR, 292 http::StatusCode::INTERNAL_SERVER_ERROR,
429 "Failed to query object information", 293 "Failed to query object information",
430 ) 294 )
431 .into_response(); 295 .into_response();
432 } 296 }
433 }; 297 };
434 298
435 let mut headers = header::HeaderMap::new(); 299 let mut headers = http::header::HeaderMap::new();
436 if let Some(content_type) = result.content_type { 300 if let Some(content_type) = result.content_type {
437 let Ok(header_value) = content_type.try_into() else { 301 let Ok(header_value) = content_type.try_into() else {
438 return ( 302 return (
439 StatusCode::INTERNAL_SERVER_ERROR, 303 http::StatusCode::INTERNAL_SERVER_ERROR,
440 "Object has invalid content type", 304 "Object has invalid content type",
441 ) 305 )
442 .into_response(); 306 .into_response();
443 }; 307 };
444 headers.insert(header::CONTENT_TYPE, header_value); 308 headers.insert(http::header::CONTENT_TYPE, header_value);
445 } 309 }
446 if let Some(content_length) = result.content_length { 310 if let Some(content_length) = result.content_length {
447 headers.insert(header::CONTENT_LENGTH, content_length.into()); 311 headers.insert(http::header::CONTENT_LENGTH, content_length.into());
448 } 312 }
449 313
450 let async_read = result.body.into_async_read(); 314 let async_read = result.body.into_async_read();
@@ -453,3 +317,168 @@ pub async fn obj_download(
453 317
454 (headers, body).into_response() 318 (headers, body).into_response()
455} 319}
320
321async fn handle_upload_object(
322 state: &AppState,
323 repo: &str,
324 obj: &BatchRequestObject,
325) -> Option<BatchResponseObject> {
326 let (oid0, oid1) = (HexByte(obj.oid[0]), HexByte(obj.oid[1]));
327 let full_path = format!("{repo}/lfs/objects/{oid0}/{oid1}/{}", obj.oid);
328
329 match state.check_object(repo, obj).await {
330 Ok(ObjectStatus::ExistsOk { .. }) => {
331 return None;
332 }
333 Ok(_) => {}
334 Err(_) => {
335 return Some(BatchResponseObject::error(
336 obj,
337 http::StatusCode::INTERNAL_SERVER_ERROR,
338 "Failed to query object information".to_string(),
339 ));
340 }
341 };
342
343 let expires_in = std::time::Duration::from_secs(5 * 60);
344 let expires_at = Utc::now() + expires_in;
345
346 let Ok(config) = aws_sdk_s3::presigning::PresigningConfig::expires_in(expires_in) 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 let Ok(presigned) = state
354 .s3_client
355 .put_object()
356 .bucket(&state.s3_bucket)
357 .key(full_path)
358 .checksum_sha256(s3_encode_checksum(obj.oid))
359 .content_length(obj.size)
360 .presigned(config)
361 .await
362 else {
363 return Some(BatchResponseObject::error(
364 obj,
365 http::StatusCode::INTERNAL_SERVER_ERROR,
366 "Failed to generate upload URL".to_string(),
367 ));
368 };
369 Some(BatchResponseObject {
370 oid: obj.oid,
371 size: obj.size,
372 authenticated: Some(true),
373 actions: BatchResponseObjectActions {
374 upload: Some(BatchResponseObjectAction {
375 header: presigned
376 .headers()
377 .map(|(k, v)| (k.to_owned(), v.to_owned()))
378 .collect(),
379 expires_at,
380 href: presigned.uri().to_string(),
381 }),
382 ..Default::default()
383 },
384 error: None,
385 })
386}
387
388pub async fn handle_batch(
389 State(state): State<Arc<AppState>>,
390 headers: http::HeaderMap,
391 RepositoryName(repo): RepositoryName,
392 GitLfsJson(Json(payload)): GitLfsJson<BatchRequest>,
393) -> Response {
394 let Some(public) = is_repo_public(&repo) else {
395 return REPO_NOT_FOUND.into_response();
396 };
397 let Trusted(trusted) = match authorize_batch(
398 &state.authz_conf,
399 &repo,
400 public,
401 payload.operation,
402 &headers,
403 ) {
404 Ok(authn) => authn,
405 Err(e) => return e.into_response(),
406 };
407
408 if !headers
409 .get_all("Accept")
410 .iter()
411 .filter_map(|v| v.to_str().ok())
412 .any(is_git_lfs_json_mimetype)
413 {
414 let message = format!("Expected `{LFS_MIME}` in list of acceptable response media types");
415 return make_error_resp(http::StatusCode::NOT_ACCEPTABLE, &message).into_response();
416 }
417
418 if payload.hash_algo != HashAlgo::Sha256 {
419 let message = "Unsupported hashing algorithm specified";
420 return make_error_resp(http::StatusCode::CONFLICT, message).into_response();
421 }
422 if !payload.transfers.is_empty() && !payload.transfers.contains(&TransferAdapter::Basic) {
423 let message = "Unsupported transfer adapter specified (supported: basic)";
424 return make_error_resp(http::StatusCode::CONFLICT, message).into_response();
425 }
426
427 let mut resp = BatchResponse {
428 transfer: TransferAdapter::Basic,
429 objects: vec![],
430 hash_algo: HashAlgo::Sha256,
431 };
432 for obj in payload.objects {
433 match payload.operation {
434 Operation::Download => resp
435 .objects
436 .push(handle_download_object(&state, &repo, &obj, trusted).await),
437 Operation::Upload => {
438 if let Some(obj_resp) = handle_upload_object(&state, &repo, &obj).await {
439 resp.objects.push(obj_resp);
440 }
441 }
442 };
443 }
444 GitLfsJson(Json(resp)).into_response()
445}
446
447fn s3_encode_checksum(oid: Oid) -> String {
448 BASE64_STANDARD.encode(oid.as_bytes())
449}
450
451fn s3_validate_checksum(oid: Oid, obj: &HeadObjectOutput) -> bool {
452 if let Some(checksum) = obj.checksum_sha256()
453 && let Ok(checksum) = BASE64_STANDARD.decode(checksum)
454 && let Ok(checksum32b) = TryInto::<[u8; 32]>::try_into(checksum)
455 {
456 return Oid::from(checksum32b) == oid;
457 }
458 true
459}
460
461fn s3_validate_size(expected: i64, obj: &HeadObjectOutput) -> bool {
462 if let Some(length) = obj.content_length() {
463 return length == expected;
464 }
465 true
466}
467
468fn repo_exists(name: &str) -> bool {
469 let Ok(metadata) = std::fs::metadata(name) else {
470 return false;
471 };
472 metadata.is_dir()
473}
474
475fn is_repo_public(name: &str) -> Option<bool> {
476 if !repo_exists(name) {
477 return None;
478 }
479 match std::fs::metadata(format!("{name}/git-daemon-export-ok")) {
480 Ok(metadata) if metadata.is_file() => Some(true),
481 Err(e) if e.kind() == std::io::ErrorKind::NotFound => Some(false),
482 _ => None,
483 }
484}
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]