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