diff options
| author | Your Name <you@example.com> | 2026-03-07 12:30:37 +0800 |
|---|---|---|
| committer | Your Name <you@example.com> | 2026-03-07 12:30:37 +0800 |
| commit | a0e83cd1ee46d79636b8ad737210e5d3bebcc4f1 (patch) | |
| tree | 25d379ad9c1c89441fcdd10879b0039cbec9315d | |
fileserver: HTTPS file server with drag-and-drop upload
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | Cargo.lock | 1408 | ||||
| -rw-r--r-- | Cargo.toml | 17 | ||||
| -rw-r--r-- | README.txt | 4 | ||||
| -rw-r--r-- | src/main.rs | 240 |
5 files changed, 1670 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore | |||
| @@ -0,0 +1 @@ | |||
| /target | |||
diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..1cfee8b --- /dev/null +++ b/Cargo.lock | |||
| @@ -0,0 +1,1408 @@ | |||
| 1 | # This file is automatically @generated by Cargo. | ||
| 2 | # It is not intended for manual editing. | ||
| 3 | version = 4 | ||
| 4 | |||
| 5 | [[package]] | ||
| 6 | name = "anstream" | ||
| 7 | version = "0.6.21" | ||
| 8 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 9 | checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" | ||
| 10 | dependencies = [ | ||
| 11 | "anstyle", | ||
| 12 | "anstyle-parse", | ||
| 13 | "anstyle-query", | ||
| 14 | "anstyle-wincon", | ||
| 15 | "colorchoice", | ||
| 16 | "is_terminal_polyfill", | ||
| 17 | "utf8parse", | ||
| 18 | ] | ||
| 19 | |||
| 20 | [[package]] | ||
| 21 | name = "anstyle" | ||
| 22 | version = "1.0.13" | ||
| 23 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 24 | checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" | ||
| 25 | |||
| 26 | [[package]] | ||
| 27 | name = "anstyle-parse" | ||
| 28 | version = "0.2.7" | ||
| 29 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 30 | checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" | ||
| 31 | dependencies = [ | ||
| 32 | "utf8parse", | ||
| 33 | ] | ||
| 34 | |||
| 35 | [[package]] | ||
| 36 | name = "anstyle-query" | ||
| 37 | version = "1.1.5" | ||
| 38 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 39 | checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" | ||
| 40 | dependencies = [ | ||
| 41 | "windows-sys 0.61.2", | ||
| 42 | ] | ||
| 43 | |||
| 44 | [[package]] | ||
| 45 | name = "anstyle-wincon" | ||
| 46 | version = "3.0.11" | ||
| 47 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 48 | checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" | ||
| 49 | dependencies = [ | ||
| 50 | "anstyle", | ||
| 51 | "once_cell_polyfill", | ||
| 52 | "windows-sys 0.61.2", | ||
| 53 | ] | ||
| 54 | |||
| 55 | [[package]] | ||
| 56 | name = "asn1-rs" | ||
| 57 | version = "0.7.1" | ||
| 58 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 59 | checksum = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60" | ||
| 60 | dependencies = [ | ||
| 61 | "asn1-rs-derive", | ||
| 62 | "asn1-rs-impl", | ||
| 63 | "displaydoc", | ||
| 64 | "nom", | ||
| 65 | "num-traits", | ||
| 66 | "rusticata-macros", | ||
| 67 | "thiserror", | ||
| 68 | "time", | ||
| 69 | ] | ||
| 70 | |||
| 71 | [[package]] | ||
| 72 | name = "asn1-rs-derive" | ||
| 73 | version = "0.6.0" | ||
| 74 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 75 | checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" | ||
| 76 | dependencies = [ | ||
| 77 | "proc-macro2", | ||
| 78 | "quote", | ||
| 79 | "syn", | ||
| 80 | "synstructure", | ||
| 81 | ] | ||
| 82 | |||
| 83 | [[package]] | ||
| 84 | name = "asn1-rs-impl" | ||
| 85 | version = "0.2.0" | ||
| 86 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 87 | checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" | ||
| 88 | dependencies = [ | ||
| 89 | "proc-macro2", | ||
| 90 | "quote", | ||
| 91 | "syn", | ||
| 92 | ] | ||
| 93 | |||
| 94 | [[package]] | ||
| 95 | name = "atomic-waker" | ||
| 96 | version = "1.1.2" | ||
| 97 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 98 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" | ||
| 99 | |||
| 100 | [[package]] | ||
| 101 | name = "autocfg" | ||
| 102 | version = "1.5.0" | ||
| 103 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 104 | checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" | ||
| 105 | |||
| 106 | [[package]] | ||
| 107 | name = "aws-lc-rs" | ||
| 108 | version = "1.16.1" | ||
| 109 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 110 | checksum = "94bffc006df10ac2a68c83692d734a465f8ee6c5b384d8545a636f81d858f4bf" | ||
| 111 | dependencies = [ | ||
| 112 | "aws-lc-sys", | ||
| 113 | "zeroize", | ||
| 114 | ] | ||
| 115 | |||
| 116 | [[package]] | ||
| 117 | name = "aws-lc-sys" | ||
| 118 | version = "0.38.0" | ||
| 119 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 120 | checksum = "4321e568ed89bb5a7d291a7f37997c2c0df89809d7b6d12062c81ddb54aa782e" | ||
| 121 | dependencies = [ | ||
| 122 | "cc", | ||
| 123 | "cmake", | ||
| 124 | "dunce", | ||
| 125 | "fs_extra", | ||
| 126 | ] | ||
| 127 | |||
| 128 | [[package]] | ||
| 129 | name = "axum" | ||
| 130 | version = "0.8.8" | ||
| 131 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 132 | checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" | ||
| 133 | dependencies = [ | ||
| 134 | "axum-core", | ||
| 135 | "bytes", | ||
| 136 | "form_urlencoded", | ||
| 137 | "futures-util", | ||
| 138 | "http", | ||
| 139 | "http-body", | ||
| 140 | "http-body-util", | ||
| 141 | "hyper", | ||
| 142 | "hyper-util", | ||
| 143 | "itoa", | ||
| 144 | "matchit", | ||
| 145 | "memchr", | ||
| 146 | "mime", | ||
| 147 | "multer", | ||
| 148 | "percent-encoding", | ||
| 149 | "pin-project-lite", | ||
| 150 | "serde_core", | ||
| 151 | "serde_json", | ||
| 152 | "serde_path_to_error", | ||
| 153 | "serde_urlencoded", | ||
| 154 | "sync_wrapper", | ||
| 155 | "tokio", | ||
| 156 | "tower", | ||
| 157 | "tower-layer", | ||
| 158 | "tower-service", | ||
| 159 | "tracing", | ||
| 160 | ] | ||
| 161 | |||
| 162 | [[package]] | ||
| 163 | name = "axum-core" | ||
| 164 | version = "0.5.6" | ||
| 165 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 166 | checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" | ||
| 167 | dependencies = [ | ||
| 168 | "bytes", | ||
| 169 | "futures-core", | ||
| 170 | "http", | ||
| 171 | "http-body", | ||
| 172 | "http-body-util", | ||
| 173 | "mime", | ||
| 174 | "pin-project-lite", | ||
| 175 | "sync_wrapper", | ||
| 176 | "tower-layer", | ||
| 177 | "tower-service", | ||
| 178 | "tracing", | ||
| 179 | ] | ||
| 180 | |||
| 181 | [[package]] | ||
| 182 | name = "base64" | ||
| 183 | version = "0.22.1" | ||
| 184 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 185 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" | ||
| 186 | |||
| 187 | [[package]] | ||
| 188 | name = "bitflags" | ||
| 189 | version = "2.11.0" | ||
| 190 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 191 | checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" | ||
| 192 | |||
| 193 | [[package]] | ||
| 194 | name = "bytes" | ||
| 195 | version = "1.11.1" | ||
| 196 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 197 | checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" | ||
| 198 | |||
| 199 | [[package]] | ||
| 200 | name = "cc" | ||
| 201 | version = "1.2.56" | ||
| 202 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 203 | checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" | ||
| 204 | dependencies = [ | ||
| 205 | "find-msvc-tools", | ||
| 206 | "jobserver", | ||
| 207 | "libc", | ||
| 208 | "shlex", | ||
| 209 | ] | ||
| 210 | |||
| 211 | [[package]] | ||
| 212 | name = "cfg-if" | ||
| 213 | version = "1.0.4" | ||
| 214 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 215 | checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" | ||
| 216 | |||
| 217 | [[package]] | ||
| 218 | name = "clap" | ||
| 219 | version = "4.5.60" | ||
| 220 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 221 | checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" | ||
| 222 | dependencies = [ | ||
| 223 | "clap_builder", | ||
| 224 | "clap_derive", | ||
| 225 | ] | ||
| 226 | |||
| 227 | [[package]] | ||
| 228 | name = "clap_builder" | ||
| 229 | version = "4.5.60" | ||
| 230 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 231 | checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" | ||
| 232 | dependencies = [ | ||
| 233 | "anstream", | ||
| 234 | "anstyle", | ||
| 235 | "clap_lex", | ||
| 236 | "strsim", | ||
| 237 | ] | ||
| 238 | |||
| 239 | [[package]] | ||
| 240 | name = "clap_derive" | ||
| 241 | version = "4.5.55" | ||
| 242 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 243 | checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" | ||
| 244 | dependencies = [ | ||
| 245 | "heck", | ||
| 246 | "proc-macro2", | ||
| 247 | "quote", | ||
| 248 | "syn", | ||
| 249 | ] | ||
| 250 | |||
| 251 | [[package]] | ||
| 252 | name = "clap_lex" | ||
| 253 | version = "1.0.0" | ||
| 254 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 255 | checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" | ||
| 256 | |||
| 257 | [[package]] | ||
| 258 | name = "cmake" | ||
| 259 | version = "0.1.57" | ||
| 260 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 261 | checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" | ||
| 262 | dependencies = [ | ||
| 263 | "cc", | ||
| 264 | ] | ||
| 265 | |||
| 266 | [[package]] | ||
| 267 | name = "colorchoice" | ||
| 268 | version = "1.0.4" | ||
| 269 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 270 | checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" | ||
| 271 | |||
| 272 | [[package]] | ||
| 273 | name = "data-encoding" | ||
| 274 | version = "2.10.0" | ||
| 275 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 276 | checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" | ||
| 277 | |||
| 278 | [[package]] | ||
| 279 | name = "der-parser" | ||
| 280 | version = "10.0.0" | ||
| 281 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 282 | checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" | ||
| 283 | dependencies = [ | ||
| 284 | "asn1-rs", | ||
| 285 | "displaydoc", | ||
| 286 | "nom", | ||
| 287 | "num-bigint", | ||
| 288 | "num-traits", | ||
| 289 | "rusticata-macros", | ||
| 290 | ] | ||
| 291 | |||
| 292 | [[package]] | ||
| 293 | name = "deranged" | ||
| 294 | version = "0.5.8" | ||
| 295 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 296 | checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" | ||
| 297 | dependencies = [ | ||
| 298 | "powerfmt", | ||
| 299 | ] | ||
| 300 | |||
| 301 | [[package]] | ||
| 302 | name = "displaydoc" | ||
| 303 | version = "0.2.5" | ||
| 304 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 305 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" | ||
| 306 | dependencies = [ | ||
| 307 | "proc-macro2", | ||
| 308 | "quote", | ||
| 309 | "syn", | ||
| 310 | ] | ||
| 311 | |||
| 312 | [[package]] | ||
| 313 | name = "dunce" | ||
| 314 | version = "1.0.5" | ||
| 315 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 316 | checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" | ||
| 317 | |||
| 318 | [[package]] | ||
| 319 | name = "encoding_rs" | ||
| 320 | version = "0.8.35" | ||
| 321 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 322 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" | ||
| 323 | dependencies = [ | ||
| 324 | "cfg-if", | ||
| 325 | ] | ||
| 326 | |||
| 327 | [[package]] | ||
| 328 | name = "equivalent" | ||
| 329 | version = "1.0.2" | ||
| 330 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 331 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" | ||
| 332 | |||
| 333 | [[package]] | ||
| 334 | name = "errno" | ||
| 335 | version = "0.3.14" | ||
| 336 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 337 | checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" | ||
| 338 | dependencies = [ | ||
| 339 | "libc", | ||
| 340 | "windows-sys 0.61.2", | ||
| 341 | ] | ||
| 342 | |||
| 343 | [[package]] | ||
| 344 | name = "fileserver" | ||
| 345 | version = "0.0.0" | ||
| 346 | dependencies = [ | ||
| 347 | "axum", | ||
| 348 | "base64", | ||
| 349 | "clap", | ||
| 350 | "hyper-util", | ||
| 351 | "libc", | ||
| 352 | "mime_guess", | ||
| 353 | "percent-encoding", | ||
| 354 | "rcgen", | ||
| 355 | "rustls", | ||
| 356 | "rustls-pemfile", | ||
| 357 | "tokio", | ||
| 358 | "tokio-rustls", | ||
| 359 | ] | ||
| 360 | |||
| 361 | [[package]] | ||
| 362 | name = "find-msvc-tools" | ||
| 363 | version = "0.1.9" | ||
| 364 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 365 | checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" | ||
| 366 | |||
| 367 | [[package]] | ||
| 368 | name = "fnv" | ||
| 369 | version = "1.0.7" | ||
| 370 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 371 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" | ||
| 372 | |||
| 373 | [[package]] | ||
| 374 | name = "form_urlencoded" | ||
| 375 | version = "1.2.2" | ||
| 376 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 377 | checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" | ||
| 378 | dependencies = [ | ||
| 379 | "percent-encoding", | ||
| 380 | ] | ||
| 381 | |||
| 382 | [[package]] | ||
| 383 | name = "fs_extra" | ||
| 384 | version = "1.3.0" | ||
| 385 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 386 | checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" | ||
| 387 | |||
| 388 | [[package]] | ||
| 389 | name = "futures-channel" | ||
| 390 | version = "0.3.32" | ||
| 391 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 392 | checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" | ||
| 393 | dependencies = [ | ||
| 394 | "futures-core", | ||
| 395 | ] | ||
| 396 | |||
| 397 | [[package]] | ||
| 398 | name = "futures-core" | ||
| 399 | version = "0.3.32" | ||
| 400 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 401 | checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" | ||
| 402 | |||
| 403 | [[package]] | ||
| 404 | name = "futures-sink" | ||
| 405 | version = "0.3.32" | ||
| 406 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 407 | checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" | ||
| 408 | |||
| 409 | [[package]] | ||
| 410 | name = "futures-task" | ||
| 411 | version = "0.3.32" | ||
| 412 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 413 | checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" | ||
| 414 | |||
| 415 | [[package]] | ||
| 416 | name = "futures-util" | ||
| 417 | version = "0.3.32" | ||
| 418 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 419 | checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" | ||
| 420 | dependencies = [ | ||
| 421 | "futures-core", | ||
| 422 | "futures-task", | ||
| 423 | "pin-project-lite", | ||
| 424 | "slab", | ||
| 425 | ] | ||
| 426 | |||
| 427 | [[package]] | ||
| 428 | name = "getrandom" | ||
| 429 | version = "0.2.17" | ||
| 430 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 431 | checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" | ||
| 432 | dependencies = [ | ||
| 433 | "cfg-if", | ||
| 434 | "libc", | ||
| 435 | "wasi", | ||
| 436 | ] | ||
| 437 | |||
| 438 | [[package]] | ||
| 439 | name = "getrandom" | ||
| 440 | version = "0.3.4" | ||
| 441 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 442 | checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" | ||
| 443 | dependencies = [ | ||
| 444 | "cfg-if", | ||
| 445 | "libc", | ||
| 446 | "r-efi", | ||
| 447 | "wasip2", | ||
| 448 | ] | ||
| 449 | |||
| 450 | [[package]] | ||
| 451 | name = "h2" | ||
| 452 | version = "0.4.13" | ||
| 453 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 454 | checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" | ||
| 455 | dependencies = [ | ||
| 456 | "atomic-waker", | ||
| 457 | "bytes", | ||
| 458 | "fnv", | ||
| 459 | "futures-core", | ||
| 460 | "futures-sink", | ||
| 461 | "http", | ||
| 462 | "indexmap", | ||
| 463 | "slab", | ||
| 464 | "tokio", | ||
| 465 | "tokio-util", | ||
| 466 | "tracing", | ||
| 467 | ] | ||
| 468 | |||
| 469 | [[package]] | ||
| 470 | name = "hashbrown" | ||
| 471 | version = "0.16.1" | ||
| 472 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 473 | checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" | ||
| 474 | |||
| 475 | [[package]] | ||
| 476 | name = "heck" | ||
| 477 | version = "0.5.0" | ||
| 478 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 479 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" | ||
| 480 | |||
| 481 | [[package]] | ||
| 482 | name = "http" | ||
| 483 | version = "1.4.0" | ||
| 484 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 485 | checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" | ||
| 486 | dependencies = [ | ||
| 487 | "bytes", | ||
| 488 | "itoa", | ||
| 489 | ] | ||
| 490 | |||
| 491 | [[package]] | ||
| 492 | name = "http-body" | ||
| 493 | version = "1.0.1" | ||
| 494 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 495 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" | ||
| 496 | dependencies = [ | ||
| 497 | "bytes", | ||
| 498 | "http", | ||
| 499 | ] | ||
| 500 | |||
| 501 | [[package]] | ||
| 502 | name = "http-body-util" | ||
| 503 | version = "0.1.3" | ||
| 504 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 505 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" | ||
| 506 | dependencies = [ | ||
| 507 | "bytes", | ||
| 508 | "futures-core", | ||
| 509 | "http", | ||
| 510 | "http-body", | ||
| 511 | "pin-project-lite", | ||
| 512 | ] | ||
| 513 | |||
| 514 | [[package]] | ||
| 515 | name = "httparse" | ||
| 516 | version = "1.10.1" | ||
| 517 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 518 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" | ||
| 519 | |||
| 520 | [[package]] | ||
| 521 | name = "httpdate" | ||
| 522 | version = "1.0.3" | ||
| 523 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 524 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" | ||
| 525 | |||
| 526 | [[package]] | ||
| 527 | name = "hyper" | ||
| 528 | version = "1.8.1" | ||
| 529 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 530 | checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" | ||
| 531 | dependencies = [ | ||
| 532 | "atomic-waker", | ||
| 533 | "bytes", | ||
| 534 | "futures-channel", | ||
| 535 | "futures-core", | ||
| 536 | "h2", | ||
| 537 | "http", | ||
| 538 | "http-body", | ||
| 539 | "httparse", | ||
| 540 | "httpdate", | ||
| 541 | "itoa", | ||
| 542 | "pin-project-lite", | ||
| 543 | "pin-utils", | ||
| 544 | "smallvec", | ||
| 545 | "tokio", | ||
| 546 | ] | ||
| 547 | |||
| 548 | [[package]] | ||
| 549 | name = "hyper-util" | ||
| 550 | version = "0.1.20" | ||
| 551 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 552 | checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" | ||
| 553 | dependencies = [ | ||
| 554 | "bytes", | ||
| 555 | "http", | ||
| 556 | "http-body", | ||
| 557 | "hyper", | ||
| 558 | "pin-project-lite", | ||
| 559 | "tokio", | ||
| 560 | "tower-service", | ||
| 561 | ] | ||
| 562 | |||
| 563 | [[package]] | ||
| 564 | name = "indexmap" | ||
| 565 | version = "2.13.0" | ||
| 566 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 567 | checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" | ||
| 568 | dependencies = [ | ||
| 569 | "equivalent", | ||
| 570 | "hashbrown", | ||
| 571 | ] | ||
| 572 | |||
| 573 | [[package]] | ||
| 574 | name = "is_terminal_polyfill" | ||
| 575 | version = "1.70.2" | ||
| 576 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 577 | checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" | ||
| 578 | |||
| 579 | [[package]] | ||
| 580 | name = "itoa" | ||
| 581 | version = "1.0.17" | ||
| 582 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 583 | checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" | ||
| 584 | |||
| 585 | [[package]] | ||
| 586 | name = "jobserver" | ||
| 587 | version = "0.1.34" | ||
| 588 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 589 | checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" | ||
| 590 | dependencies = [ | ||
| 591 | "getrandom 0.3.4", | ||
| 592 | "libc", | ||
| 593 | ] | ||
| 594 | |||
| 595 | [[package]] | ||
| 596 | name = "lazy_static" | ||
| 597 | version = "1.5.0" | ||
| 598 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 599 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" | ||
| 600 | |||
| 601 | [[package]] | ||
| 602 | name = "libc" | ||
| 603 | version = "0.2.182" | ||
| 604 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 605 | checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" | ||
| 606 | |||
| 607 | [[package]] | ||
| 608 | name = "lock_api" | ||
| 609 | version = "0.4.14" | ||
| 610 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 611 | checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" | ||
| 612 | dependencies = [ | ||
| 613 | "scopeguard", | ||
| 614 | ] | ||
| 615 | |||
| 616 | [[package]] | ||
| 617 | name = "log" | ||
| 618 | version = "0.4.29" | ||
| 619 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 620 | checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" | ||
| 621 | |||
| 622 | [[package]] | ||
| 623 | name = "matchit" | ||
| 624 | version = "0.8.4" | ||
| 625 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 626 | checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" | ||
| 627 | |||
| 628 | [[package]] | ||
| 629 | name = "memchr" | ||
| 630 | version = "2.8.0" | ||
| 631 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 632 | checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" | ||
| 633 | |||
| 634 | [[package]] | ||
| 635 | name = "mime" | ||
| 636 | version = "0.3.17" | ||
| 637 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 638 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" | ||
| 639 | |||
| 640 | [[package]] | ||
| 641 | name = "mime_guess" | ||
| 642 | version = "2.0.5" | ||
| 643 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 644 | checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" | ||
| 645 | dependencies = [ | ||
| 646 | "mime", | ||
| 647 | "unicase", | ||
| 648 | ] | ||
| 649 | |||
| 650 | [[package]] | ||
| 651 | name = "minimal-lexical" | ||
| 652 | version = "0.2.1" | ||
| 653 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 654 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" | ||
| 655 | |||
| 656 | [[package]] | ||
| 657 | name = "mio" | ||
| 658 | version = "1.1.1" | ||
| 659 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 660 | checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" | ||
| 661 | dependencies = [ | ||
| 662 | "libc", | ||
| 663 | "wasi", | ||
| 664 | "windows-sys 0.61.2", | ||
| 665 | ] | ||
| 666 | |||
| 667 | [[package]] | ||
| 668 | name = "multer" | ||
| 669 | version = "3.1.0" | ||
| 670 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 671 | checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" | ||
| 672 | dependencies = [ | ||
| 673 | "bytes", | ||
| 674 | "encoding_rs", | ||
| 675 | "futures-util", | ||
| 676 | "http", | ||
| 677 | "httparse", | ||
| 678 | "memchr", | ||
| 679 | "mime", | ||
| 680 | "spin", | ||
| 681 | "version_check", | ||
| 682 | ] | ||
| 683 | |||
| 684 | [[package]] | ||
| 685 | name = "nom" | ||
| 686 | version = "7.1.3" | ||
| 687 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 688 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" | ||
| 689 | dependencies = [ | ||
| 690 | "memchr", | ||
| 691 | "minimal-lexical", | ||
| 692 | ] | ||
| 693 | |||
| 694 | [[package]] | ||
| 695 | name = "num-bigint" | ||
| 696 | version = "0.4.6" | ||
| 697 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 698 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" | ||
| 699 | dependencies = [ | ||
| 700 | "num-integer", | ||
| 701 | "num-traits", | ||
| 702 | ] | ||
| 703 | |||
| 704 | [[package]] | ||
| 705 | name = "num-conv" | ||
| 706 | version = "0.2.0" | ||
| 707 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 708 | checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" | ||
| 709 | |||
| 710 | [[package]] | ||
| 711 | name = "num-integer" | ||
| 712 | version = "0.1.46" | ||
| 713 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 714 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" | ||
| 715 | dependencies = [ | ||
| 716 | "num-traits", | ||
| 717 | ] | ||
| 718 | |||
| 719 | [[package]] | ||
| 720 | name = "num-traits" | ||
| 721 | version = "0.2.19" | ||
| 722 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 723 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" | ||
| 724 | dependencies = [ | ||
| 725 | "autocfg", | ||
| 726 | ] | ||
| 727 | |||
| 728 | [[package]] | ||
| 729 | name = "oid-registry" | ||
| 730 | version = "0.8.1" | ||
| 731 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 732 | checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" | ||
| 733 | dependencies = [ | ||
| 734 | "asn1-rs", | ||
| 735 | ] | ||
| 736 | |||
| 737 | [[package]] | ||
| 738 | name = "once_cell" | ||
| 739 | version = "1.21.3" | ||
| 740 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 741 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" | ||
| 742 | |||
| 743 | [[package]] | ||
| 744 | name = "once_cell_polyfill" | ||
| 745 | version = "1.70.2" | ||
| 746 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 747 | checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" | ||
| 748 | |||
| 749 | [[package]] | ||
| 750 | name = "parking_lot" | ||
| 751 | version = "0.12.5" | ||
| 752 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 753 | checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" | ||
| 754 | dependencies = [ | ||
| 755 | "lock_api", | ||
| 756 | "parking_lot_core", | ||
| 757 | ] | ||
| 758 | |||
| 759 | [[package]] | ||
| 760 | name = "parking_lot_core" | ||
| 761 | version = "0.9.12" | ||
| 762 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 763 | checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" | ||
| 764 | dependencies = [ | ||
| 765 | "cfg-if", | ||
| 766 | "libc", | ||
| 767 | "redox_syscall", | ||
| 768 | "smallvec", | ||
| 769 | "windows-link", | ||
| 770 | ] | ||
| 771 | |||
| 772 | [[package]] | ||
| 773 | name = "pem" | ||
| 774 | version = "3.0.6" | ||
| 775 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 776 | checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" | ||
| 777 | dependencies = [ | ||
| 778 | "base64", | ||
| 779 | "serde_core", | ||
| 780 | ] | ||
| 781 | |||
| 782 | [[package]] | ||
| 783 | name = "percent-encoding" | ||
| 784 | version = "2.3.2" | ||
| 785 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 786 | checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" | ||
| 787 | |||
| 788 | [[package]] | ||
| 789 | name = "pin-project-lite" | ||
| 790 | version = "0.2.17" | ||
| 791 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 792 | checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" | ||
| 793 | |||
| 794 | [[package]] | ||
| 795 | name = "pin-utils" | ||
| 796 | version = "0.1.0" | ||
| 797 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 798 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" | ||
| 799 | |||
| 800 | [[package]] | ||
| 801 | name = "powerfmt" | ||
| 802 | version = "0.2.0" | ||
| 803 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 804 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" | ||
| 805 | |||
| 806 | [[package]] | ||
| 807 | name = "proc-macro2" | ||
| 808 | version = "1.0.106" | ||
| 809 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 810 | checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" | ||
| 811 | dependencies = [ | ||
| 812 | "unicode-ident", | ||
| 813 | ] | ||
| 814 | |||
| 815 | [[package]] | ||
| 816 | name = "quote" | ||
| 817 | version = "1.0.45" | ||
| 818 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 819 | checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" | ||
| 820 | dependencies = [ | ||
| 821 | "proc-macro2", | ||
| 822 | ] | ||
| 823 | |||
| 824 | [[package]] | ||
| 825 | name = "r-efi" | ||
| 826 | version = "5.3.0" | ||
| 827 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 828 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" | ||
| 829 | |||
| 830 | [[package]] | ||
| 831 | name = "rcgen" | ||
| 832 | version = "0.14.7" | ||
| 833 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 834 | checksum = "10b99e0098aa4082912d4c649628623db6aba77335e4f4569ff5083a6448b32e" | ||
| 835 | dependencies = [ | ||
| 836 | "pem", | ||
| 837 | "ring", | ||
| 838 | "rustls-pki-types", | ||
| 839 | "time", | ||
| 840 | "x509-parser", | ||
| 841 | "yasna", | ||
| 842 | ] | ||
| 843 | |||
| 844 | [[package]] | ||
| 845 | name = "redox_syscall" | ||
| 846 | version = "0.5.18" | ||
| 847 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 848 | checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" | ||
| 849 | dependencies = [ | ||
| 850 | "bitflags", | ||
| 851 | ] | ||
| 852 | |||
| 853 | [[package]] | ||
| 854 | name = "ring" | ||
| 855 | version = "0.17.14" | ||
| 856 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 857 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" | ||
| 858 | dependencies = [ | ||
| 859 | "cc", | ||
| 860 | "cfg-if", | ||
| 861 | "getrandom 0.2.17", | ||
| 862 | "libc", | ||
| 863 | "untrusted", | ||
| 864 | "windows-sys 0.52.0", | ||
| 865 | ] | ||
| 866 | |||
| 867 | [[package]] | ||
| 868 | name = "rusticata-macros" | ||
| 869 | version = "4.1.0" | ||
| 870 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 871 | checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" | ||
| 872 | dependencies = [ | ||
| 873 | "nom", | ||
| 874 | ] | ||
| 875 | |||
| 876 | [[package]] | ||
| 877 | name = "rustls" | ||
| 878 | version = "0.23.37" | ||
| 879 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 880 | checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" | ||
| 881 | dependencies = [ | ||
| 882 | "aws-lc-rs", | ||
| 883 | "log", | ||
| 884 | "once_cell", | ||
| 885 | "rustls-pki-types", | ||
| 886 | "rustls-webpki", | ||
| 887 | "subtle", | ||
| 888 | "zeroize", | ||
| 889 | ] | ||
| 890 | |||
| 891 | [[package]] | ||
| 892 | name = "rustls-pemfile" | ||
| 893 | version = "2.2.0" | ||
| 894 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 895 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" | ||
| 896 | dependencies = [ | ||
| 897 | "rustls-pki-types", | ||
| 898 | ] | ||
| 899 | |||
| 900 | [[package]] | ||
| 901 | name = "rustls-pki-types" | ||
| 902 | version = "1.14.0" | ||
| 903 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 904 | checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" | ||
| 905 | dependencies = [ | ||
| 906 | "zeroize", | ||
| 907 | ] | ||
| 908 | |||
| 909 | [[package]] | ||
| 910 | name = "rustls-webpki" | ||
| 911 | version = "0.103.9" | ||
| 912 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 913 | checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" | ||
| 914 | dependencies = [ | ||
| 915 | "aws-lc-rs", | ||
| 916 | "ring", | ||
| 917 | "rustls-pki-types", | ||
| 918 | "untrusted", | ||
| 919 | ] | ||
| 920 | |||
| 921 | [[package]] | ||
| 922 | name = "ryu" | ||
| 923 | version = "1.0.23" | ||
| 924 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 925 | checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" | ||
| 926 | |||
| 927 | [[package]] | ||
| 928 | name = "scopeguard" | ||
| 929 | version = "1.2.0" | ||
| 930 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 931 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" | ||
| 932 | |||
| 933 | [[package]] | ||
| 934 | name = "serde" | ||
| 935 | version = "1.0.228" | ||
| 936 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 937 | checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" | ||
| 938 | dependencies = [ | ||
| 939 | "serde_core", | ||
| 940 | ] | ||
| 941 | |||
| 942 | [[package]] | ||
| 943 | name = "serde_core" | ||
| 944 | version = "1.0.228" | ||
| 945 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 946 | checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" | ||
| 947 | dependencies = [ | ||
| 948 | "serde_derive", | ||
| 949 | ] | ||
| 950 | |||
| 951 | [[package]] | ||
| 952 | name = "serde_derive" | ||
| 953 | version = "1.0.228" | ||
| 954 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 955 | checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" | ||
| 956 | dependencies = [ | ||
| 957 | "proc-macro2", | ||
| 958 | "quote", | ||
| 959 | "syn", | ||
| 960 | ] | ||
| 961 | |||
| 962 | [[package]] | ||
| 963 | name = "serde_json" | ||
| 964 | version = "1.0.149" | ||
| 965 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 966 | checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" | ||
| 967 | dependencies = [ | ||
| 968 | "itoa", | ||
| 969 | "memchr", | ||
| 970 | "serde", | ||
| 971 | "serde_core", | ||
| 972 | "zmij", | ||
| 973 | ] | ||
| 974 | |||
| 975 | [[package]] | ||
| 976 | name = "serde_path_to_error" | ||
| 977 | version = "0.1.20" | ||
| 978 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 979 | checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" | ||
| 980 | dependencies = [ | ||
| 981 | "itoa", | ||
| 982 | "serde", | ||
| 983 | "serde_core", | ||
| 984 | ] | ||
| 985 | |||
| 986 | [[package]] | ||
| 987 | name = "serde_urlencoded" | ||
| 988 | version = "0.7.1" | ||
| 989 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 990 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" | ||
| 991 | dependencies = [ | ||
| 992 | "form_urlencoded", | ||
| 993 | "itoa", | ||
| 994 | "ryu", | ||
| 995 | "serde", | ||
| 996 | ] | ||
| 997 | |||
| 998 | [[package]] | ||
| 999 | name = "shlex" | ||
| 1000 | version = "1.3.0" | ||
| 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1002 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" | ||
| 1003 | |||
| 1004 | [[package]] | ||
| 1005 | name = "signal-hook-registry" | ||
| 1006 | version = "1.4.8" | ||
| 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1008 | checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" | ||
| 1009 | dependencies = [ | ||
| 1010 | "errno", | ||
| 1011 | "libc", | ||
| 1012 | ] | ||
| 1013 | |||
| 1014 | [[package]] | ||
| 1015 | name = "slab" | ||
| 1016 | version = "0.4.12" | ||
| 1017 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1018 | checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" | ||
| 1019 | |||
| 1020 | [[package]] | ||
| 1021 | name = "smallvec" | ||
| 1022 | version = "1.15.1" | ||
| 1023 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1024 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" | ||
| 1025 | |||
| 1026 | [[package]] | ||
| 1027 | name = "socket2" | ||
| 1028 | version = "0.6.3" | ||
| 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1030 | checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" | ||
| 1031 | dependencies = [ | ||
| 1032 | "libc", | ||
| 1033 | "windows-sys 0.61.2", | ||
| 1034 | ] | ||
| 1035 | |||
| 1036 | [[package]] | ||
| 1037 | name = "spin" | ||
| 1038 | version = "0.9.8" | ||
| 1039 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1040 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" | ||
| 1041 | |||
| 1042 | [[package]] | ||
| 1043 | name = "strsim" | ||
| 1044 | version = "0.11.1" | ||
| 1045 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1046 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" | ||
| 1047 | |||
| 1048 | [[package]] | ||
| 1049 | name = "subtle" | ||
| 1050 | version = "2.6.1" | ||
| 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1052 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" | ||
| 1053 | |||
| 1054 | [[package]] | ||
| 1055 | name = "syn" | ||
| 1056 | version = "2.0.117" | ||
| 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1058 | checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" | ||
| 1059 | dependencies = [ | ||
| 1060 | "proc-macro2", | ||
| 1061 | "quote", | ||
| 1062 | "unicode-ident", | ||
| 1063 | ] | ||
| 1064 | |||
| 1065 | [[package]] | ||
| 1066 | name = "sync_wrapper" | ||
| 1067 | version = "1.0.2" | ||
| 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1069 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" | ||
| 1070 | |||
| 1071 | [[package]] | ||
| 1072 | name = "synstructure" | ||
| 1073 | version = "0.13.2" | ||
| 1074 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1075 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" | ||
| 1076 | dependencies = [ | ||
| 1077 | "proc-macro2", | ||
| 1078 | "quote", | ||
| 1079 | "syn", | ||
| 1080 | ] | ||
| 1081 | |||
| 1082 | [[package]] | ||
| 1083 | name = "thiserror" | ||
| 1084 | version = "2.0.18" | ||
| 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1086 | checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" | ||
| 1087 | dependencies = [ | ||
| 1088 | "thiserror-impl", | ||
| 1089 | ] | ||
| 1090 | |||
| 1091 | [[package]] | ||
| 1092 | name = "thiserror-impl" | ||
| 1093 | version = "2.0.18" | ||
| 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1095 | checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" | ||
| 1096 | dependencies = [ | ||
| 1097 | "proc-macro2", | ||
| 1098 | "quote", | ||
| 1099 | "syn", | ||
| 1100 | ] | ||
| 1101 | |||
| 1102 | [[package]] | ||
| 1103 | name = "time" | ||
| 1104 | version = "0.3.47" | ||
| 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1106 | checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" | ||
| 1107 | dependencies = [ | ||
| 1108 | "deranged", | ||
| 1109 | "itoa", | ||
| 1110 | "num-conv", | ||
| 1111 | "powerfmt", | ||
| 1112 | "serde_core", | ||
| 1113 | "time-core", | ||
| 1114 | "time-macros", | ||
| 1115 | ] | ||
| 1116 | |||
| 1117 | [[package]] | ||
| 1118 | name = "time-core" | ||
| 1119 | version = "0.1.8" | ||
| 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1121 | checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" | ||
| 1122 | |||
| 1123 | [[package]] | ||
| 1124 | name = "time-macros" | ||
| 1125 | version = "0.2.27" | ||
| 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1127 | checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" | ||
| 1128 | dependencies = [ | ||
| 1129 | "num-conv", | ||
| 1130 | "time-core", | ||
| 1131 | ] | ||
| 1132 | |||
| 1133 | [[package]] | ||
| 1134 | name = "tokio" | ||
| 1135 | version = "1.50.0" | ||
| 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1137 | checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" | ||
| 1138 | dependencies = [ | ||
| 1139 | "bytes", | ||
| 1140 | "libc", | ||
| 1141 | "mio", | ||
| 1142 | "parking_lot", | ||
| 1143 | "pin-project-lite", | ||
| 1144 | "signal-hook-registry", | ||
| 1145 | "socket2", | ||
| 1146 | "tokio-macros", | ||
| 1147 | "windows-sys 0.61.2", | ||
| 1148 | ] | ||
| 1149 | |||
| 1150 | [[package]] | ||
| 1151 | name = "tokio-macros" | ||
| 1152 | version = "2.6.1" | ||
| 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1154 | checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" | ||
| 1155 | dependencies = [ | ||
| 1156 | "proc-macro2", | ||
| 1157 | "quote", | ||
| 1158 | "syn", | ||
| 1159 | ] | ||
| 1160 | |||
| 1161 | [[package]] | ||
| 1162 | name = "tokio-rustls" | ||
| 1163 | version = "0.26.4" | ||
| 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1165 | checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" | ||
| 1166 | dependencies = [ | ||
| 1167 | "rustls", | ||
| 1168 | "tokio", | ||
| 1169 | ] | ||
| 1170 | |||
| 1171 | [[package]] | ||
| 1172 | name = "tokio-util" | ||
| 1173 | version = "0.7.18" | ||
| 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1175 | checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" | ||
| 1176 | dependencies = [ | ||
| 1177 | "bytes", | ||
| 1178 | "futures-core", | ||
| 1179 | "futures-sink", | ||
| 1180 | "pin-project-lite", | ||
| 1181 | "tokio", | ||
| 1182 | ] | ||
| 1183 | |||
| 1184 | [[package]] | ||
| 1185 | name = "tower" | ||
| 1186 | version = "0.5.3" | ||
| 1187 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1188 | checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" | ||
| 1189 | dependencies = [ | ||
| 1190 | "futures-core", | ||
| 1191 | "futures-util", | ||
| 1192 | "pin-project-lite", | ||
| 1193 | "sync_wrapper", | ||
| 1194 | "tokio", | ||
| 1195 | "tower-layer", | ||
| 1196 | "tower-service", | ||
| 1197 | "tracing", | ||
| 1198 | ] | ||
| 1199 | |||
| 1200 | [[package]] | ||
| 1201 | name = "tower-layer" | ||
| 1202 | version = "0.3.3" | ||
| 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1204 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" | ||
| 1205 | |||
| 1206 | [[package]] | ||
| 1207 | name = "tower-service" | ||
| 1208 | version = "0.3.3" | ||
| 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1210 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" | ||
| 1211 | |||
| 1212 | [[package]] | ||
| 1213 | name = "tracing" | ||
| 1214 | version = "0.1.44" | ||
| 1215 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1216 | checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" | ||
| 1217 | dependencies = [ | ||
| 1218 | "log", | ||
| 1219 | "pin-project-lite", | ||
| 1220 | "tracing-core", | ||
| 1221 | ] | ||
| 1222 | |||
| 1223 | [[package]] | ||
| 1224 | name = "tracing-core" | ||
| 1225 | version = "0.1.36" | ||
| 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1227 | checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" | ||
| 1228 | dependencies = [ | ||
| 1229 | "once_cell", | ||
| 1230 | ] | ||
| 1231 | |||
| 1232 | [[package]] | ||
| 1233 | name = "unicase" | ||
| 1234 | version = "2.9.0" | ||
| 1235 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1236 | checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" | ||
| 1237 | |||
| 1238 | [[package]] | ||
| 1239 | name = "unicode-ident" | ||
| 1240 | version = "1.0.24" | ||
| 1241 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1242 | checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" | ||
| 1243 | |||
| 1244 | [[package]] | ||
| 1245 | name = "untrusted" | ||
| 1246 | version = "0.9.0" | ||
| 1247 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1248 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" | ||
| 1249 | |||
| 1250 | [[package]] | ||
| 1251 | name = "utf8parse" | ||
| 1252 | version = "0.2.2" | ||
| 1253 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1254 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" | ||
| 1255 | |||
| 1256 | [[package]] | ||
| 1257 | name = "version_check" | ||
| 1258 | version = "0.9.5" | ||
| 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1260 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" | ||
| 1261 | |||
| 1262 | [[package]] | ||
| 1263 | name = "wasi" | ||
| 1264 | version = "0.11.1+wasi-snapshot-preview1" | ||
| 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1266 | checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" | ||
| 1267 | |||
| 1268 | [[package]] | ||
| 1269 | name = "wasip2" | ||
| 1270 | version = "1.0.2+wasi-0.2.9" | ||
| 1271 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1272 | checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" | ||
| 1273 | dependencies = [ | ||
| 1274 | "wit-bindgen", | ||
| 1275 | ] | ||
| 1276 | |||
| 1277 | [[package]] | ||
| 1278 | name = "windows-link" | ||
| 1279 | version = "0.2.1" | ||
| 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1281 | checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" | ||
| 1282 | |||
| 1283 | [[package]] | ||
| 1284 | name = "windows-sys" | ||
| 1285 | version = "0.52.0" | ||
| 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1287 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" | ||
| 1288 | dependencies = [ | ||
| 1289 | "windows-targets", | ||
| 1290 | ] | ||
| 1291 | |||
| 1292 | [[package]] | ||
| 1293 | name = "windows-sys" | ||
| 1294 | version = "0.61.2" | ||
| 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1296 | checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" | ||
| 1297 | dependencies = [ | ||
| 1298 | "windows-link", | ||
| 1299 | ] | ||
| 1300 | |||
| 1301 | [[package]] | ||
| 1302 | name = "windows-targets" | ||
| 1303 | version = "0.52.6" | ||
| 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1305 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" | ||
| 1306 | dependencies = [ | ||
| 1307 | "windows_aarch64_gnullvm", | ||
| 1308 | "windows_aarch64_msvc", | ||
| 1309 | "windows_i686_gnu", | ||
| 1310 | "windows_i686_gnullvm", | ||
| 1311 | "windows_i686_msvc", | ||
| 1312 | "windows_x86_64_gnu", | ||
| 1313 | "windows_x86_64_gnullvm", | ||
| 1314 | "windows_x86_64_msvc", | ||
| 1315 | ] | ||
| 1316 | |||
| 1317 | [[package]] | ||
| 1318 | name = "windows_aarch64_gnullvm" | ||
| 1319 | version = "0.52.6" | ||
| 1320 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1321 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" | ||
| 1322 | |||
| 1323 | [[package]] | ||
| 1324 | name = "windows_aarch64_msvc" | ||
| 1325 | version = "0.52.6" | ||
| 1326 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1327 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" | ||
| 1328 | |||
| 1329 | [[package]] | ||
| 1330 | name = "windows_i686_gnu" | ||
| 1331 | version = "0.52.6" | ||
| 1332 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1333 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" | ||
| 1334 | |||
| 1335 | [[package]] | ||
| 1336 | name = "windows_i686_gnullvm" | ||
| 1337 | version = "0.52.6" | ||
| 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1339 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" | ||
| 1340 | |||
| 1341 | [[package]] | ||
| 1342 | name = "windows_i686_msvc" | ||
| 1343 | version = "0.52.6" | ||
| 1344 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1345 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" | ||
| 1346 | |||
| 1347 | [[package]] | ||
| 1348 | name = "windows_x86_64_gnu" | ||
| 1349 | version = "0.52.6" | ||
| 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1351 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" | ||
| 1352 | |||
| 1353 | [[package]] | ||
| 1354 | name = "windows_x86_64_gnullvm" | ||
| 1355 | version = "0.52.6" | ||
| 1356 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1357 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" | ||
| 1358 | |||
| 1359 | [[package]] | ||
| 1360 | name = "windows_x86_64_msvc" | ||
| 1361 | version = "0.52.6" | ||
| 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1363 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" | ||
| 1364 | |||
| 1365 | [[package]] | ||
| 1366 | name = "wit-bindgen" | ||
| 1367 | version = "0.51.0" | ||
| 1368 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1369 | checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" | ||
| 1370 | |||
| 1371 | [[package]] | ||
| 1372 | name = "x509-parser" | ||
| 1373 | version = "0.18.1" | ||
| 1374 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1375 | checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" | ||
| 1376 | dependencies = [ | ||
| 1377 | "asn1-rs", | ||
| 1378 | "data-encoding", | ||
| 1379 | "der-parser", | ||
| 1380 | "lazy_static", | ||
| 1381 | "nom", | ||
| 1382 | "oid-registry", | ||
| 1383 | "ring", | ||
| 1384 | "rusticata-macros", | ||
| 1385 | "thiserror", | ||
| 1386 | "time", | ||
| 1387 | ] | ||
| 1388 | |||
| 1389 | [[package]] | ||
| 1390 | name = "yasna" | ||
| 1391 | version = "0.5.2" | ||
| 1392 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1393 | checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" | ||
| 1394 | dependencies = [ | ||
| 1395 | "time", | ||
| 1396 | ] | ||
| 1397 | |||
| 1398 | [[package]] | ||
| 1399 | name = "zeroize" | ||
| 1400 | version = "1.8.2" | ||
| 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1402 | checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" | ||
| 1403 | |||
| 1404 | [[package]] | ||
| 1405 | name = "zmij" | ||
| 1406 | version = "1.0.21" | ||
| 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1408 | checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" | ||
diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..0799fcf --- /dev/null +++ b/Cargo.toml | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | [package] | ||
| 2 | name = "fileserver" | ||
| 3 | edition = "2024" | ||
| 4 | |||
| 5 | [dependencies] | ||
| 6 | axum = { version = "0.8", features = ["multipart"] } | ||
| 7 | tokio = { version = "1", features = ["full"] } | ||
| 8 | tokio-rustls = "0.26" | ||
| 9 | rustls = "0.23" | ||
| 10 | rcgen = "0.14" | ||
| 11 | hyper-util = { version = "0.1", features = ["tokio", "server-auto", "service"] } | ||
| 12 | rustls-pemfile = "2" | ||
| 13 | base64 = "0.22" | ||
| 14 | clap = { version = "4", features = ["derive"] } | ||
| 15 | libc = "0.2" | ||
| 16 | percent-encoding = "2.3" | ||
| 17 | mime_guess = "2" | ||
diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..c23b846 --- /dev/null +++ b/README.txt | |||
| @@ -0,0 +1,4 @@ | |||
| 1 | cargo run -- --help | ||
| 2 | cargo install --path . | ||
| 3 | cargo install --list | ||
| 4 | cargo uninstall fileserver | ||
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..926ddb6 --- /dev/null +++ b/src/main.rs | |||
| @@ -0,0 +1,240 @@ | |||
| 1 | use axum::{ | ||
| 2 | body::Body, extract::{DefaultBodyLimit, Multipart, Path, Request, State}, | ||
| 3 | http::{header, StatusCode}, middleware::{self, Next}, | ||
| 4 | response::{Html, IntoResponse, Redirect, Response}, routing::get, Router, | ||
| 5 | }; | ||
| 6 | use base64::{Engine, engine::general_purpose::STANDARD as B64}; | ||
| 7 | use clap::Parser; | ||
| 8 | use hyper_util::{rt::TokioIo, server::conn::auto::Builder, service::TowerToHyperService}; | ||
| 9 | use rustls::ServerConfig; | ||
| 10 | use std::{io::Write, path::{Path as FsPath, PathBuf}, sync::Arc, time::Instant}; | ||
| 11 | use tokio::{fs, io::AsyncWriteExt, net::TcpListener, signal}; | ||
| 12 | use tokio_rustls::TlsAcceptor; | ||
| 13 | |||
| 14 | type St = Arc<AppState>; | ||
| 15 | struct AppState { root: PathBuf, pass: Option<String> } | ||
| 16 | |||
| 17 | #[derive(Parser)] | ||
| 18 | struct Args { | ||
| 19 | #[arg(short, long, default_value_t = 8000)] port: u16, | ||
| 20 | #[arg(default_value = ".")] directory: PathBuf, | ||
| 21 | #[arg(long)] pass: Option<String>, | ||
| 22 | } | ||
| 23 | |||
| 24 | #[tokio::main] | ||
| 25 | async fn main() { | ||
| 26 | let args = Args::parse(); | ||
| 27 | let root = std::fs::canonicalize(&args.directory) | ||
| 28 | .unwrap_or_else(|_| panic!("Not found: {}", args.directory.display())); | ||
| 29 | let st: St = Arc::new(AppState { root: root.clone(), pass: args.pass }); | ||
| 30 | let app = Router::new() | ||
| 31 | .route("/", get(get_h).post(upload_h)) | ||
| 32 | .route("/{*path}", get(get_h).post(upload_h)) | ||
| 33 | .layer(DefaultBodyLimit::max(100 * 1024 * 1024 * 1024)) | ||
| 34 | .layer(middleware::from_fn_with_state(st.clone(), auth)) | ||
| 35 | .with_state(st); | ||
| 36 | let acceptor = self_signed_tls(); | ||
| 37 | let addr = format!("[::]:{}", args.port); | ||
| 38 | let listener = TcpListener::bind(&addr).await.unwrap(); | ||
| 39 | println!("Serving {} on https://{addr}", root.display()); | ||
| 40 | |||
| 41 | let shutdown = async { signal::ctrl_c().await.ok(); println!("\nshutting down..."); }; | ||
| 42 | tokio::pin!(shutdown); | ||
| 43 | |||
| 44 | loop { | ||
| 45 | tokio::select! { | ||
| 46 | _ = &mut shutdown => break, | ||
| 47 | res = listener.accept() => { | ||
| 48 | let (stream, _peer) = match res { | ||
| 49 | Ok(c) => c, Err(e) => { eprintln!("accept: {e}"); continue } | ||
| 50 | }; | ||
| 51 | let (acc, app) = (acceptor.clone(), app.clone()); | ||
| 52 | tokio::spawn(async move { | ||
| 53 | let Ok(tls) = acc.accept(stream).await.inspect_err(|e| eprintln!("tls: {e}")) else { return }; | ||
| 54 | let svc = TowerToHyperService::new(app); | ||
| 55 | let _ = Builder::new(hyper_util::rt::TokioExecutor::new()) | ||
| 56 | .serve_connection(TokioIo::new(tls), svc).await; | ||
| 57 | }); | ||
| 58 | } | ||
| 59 | } | ||
| 60 | } | ||
| 61 | } | ||
| 62 | |||
| 63 | |||
| 64 | fn self_signed_tls() -> TlsAcceptor { | ||
| 65 | use std::os::unix::fs::MetadataExt; | ||
| 66 | let dir = std::path::Path::new("/tmp/fileserver"); | ||
| 67 | let uid = unsafe { libc::getuid() }; | ||
| 68 | if dir.exists() { | ||
| 69 | let meta = std::fs::metadata(dir).expect("can't stat /tmp/fileserver"); | ||
| 70 | if meta.uid() != uid { | ||
| 71 | eprintln!("/tmp/fileserver owned by uid {}, expected {uid} — refusing", meta.uid()); | ||
| 72 | std::process::exit(1); | ||
| 73 | } | ||
| 74 | } else { | ||
| 75 | std::fs::create_dir(dir).expect("can't create /tmp/fileserver"); | ||
| 76 | } | ||
| 77 | let lock = std::fs::File::create("/tmp/fileserver/.lock").unwrap(); | ||
| 78 | use std::os::unix::io::AsRawFd; | ||
| 79 | if unsafe { libc::flock(lock.as_raw_fd(), libc::LOCK_EX | libc::LOCK_NB) } != 0 { | ||
| 80 | eprintln!("another fileserver is already running"); std::process::exit(1); | ||
| 81 | } | ||
| 82 | std::mem::forget(lock); | ||
| 83 | for entry in std::fs::read_dir(dir).unwrap() { | ||
| 84 | let p = entry.unwrap().path(); | ||
| 85 | if p.file_name().unwrap() != ".lock" { let _ = std::fs::remove_file(&p); } | ||
| 86 | } | ||
| 87 | |||
| 88 | let c = rcgen::generate_simple_self_signed(vec!["localhost".into(), "0.0.0.0".into(), "127.0.0.1".into()]) | ||
| 89 | .expect("cert gen failed"); | ||
| 90 | let (cp, kp) = (c.cert.pem(), c.signing_key.serialize_pem()); | ||
| 91 | std::fs::write("/tmp/fileserver/cert.pem", &cp).unwrap(); | ||
| 92 | std::fs::write("/tmp/fileserver/key.pem", &kp).unwrap(); | ||
| 93 | println!("cert: /tmp/fileserver/cert.pem\nkey: /tmp/fileserver/key.pem"); | ||
| 94 | let certs: Vec<_> = rustls_pemfile::certs(&mut cp.as_bytes()).collect::<Result<_, _>>().unwrap(); | ||
| 95 | let key = rustls_pemfile::private_key(&mut kp.as_bytes()).unwrap().unwrap(); | ||
| 96 | TlsAcceptor::from(Arc::new(ServerConfig::builder().with_no_client_auth().with_single_cert(certs, key).unwrap())) | ||
| 97 | } | ||
| 98 | |||
| 99 | async fn auth(State(st): State<St>, req: Request, next: Next) -> Response { | ||
| 100 | let method = req.method().clone(); | ||
| 101 | let uri = req.uri().path().to_string(); | ||
| 102 | let resp = auth_inner(&st, req, next).await; | ||
| 103 | println!("{method} {uri} {}", resp.status().as_u16()); | ||
| 104 | resp | ||
| 105 | } | ||
| 106 | |||
| 107 | async fn auth_inner(st: &AppState, req: Request, next: Next) -> Response { | ||
| 108 | let Some(pw) = &st.pass else { return next.run(req).await }; | ||
| 109 | let ok = req.headers().get(header::AUTHORIZATION) | ||
| 110 | .and_then(|v| v.to_str().ok()) | ||
| 111 | .and_then(|v| v.strip_prefix("Basic ")) | ||
| 112 | .and_then(|b| B64.decode(b).ok()) | ||
| 113 | .and_then(|b| String::from_utf8(b).ok()) | ||
| 114 | .is_some_and(|c| c.ends_with(&format!(":{pw}"))); | ||
| 115 | if ok { return next.run(req).await } | ||
| 116 | Response::builder().status(StatusCode::UNAUTHORIZED) | ||
| 117 | .header(header::WWW_AUTHENTICATE, r#"Basic realm="fileserver""#) | ||
| 118 | .body(Body::from("Unauthorized")).unwrap() | ||
| 119 | } | ||
| 120 | |||
| 121 | fn upath(p: &Option<Path<String>>) -> &str { p.as_ref().map(|p| p.as_str()).unwrap_or("") } | ||
| 122 | |||
| 123 | fn resolve(root: &FsPath, p: &str) -> Option<PathBuf> { | ||
| 124 | let d = percent_encoding::percent_decode_str(p).decode_utf8_lossy(); | ||
| 125 | let c = d.trim_start_matches('/'); | ||
| 126 | let f = if c.is_empty() { root.to_path_buf() } else { root.join(c) }; | ||
| 127 | f.canonicalize().ok().filter(|p| p.starts_with(root)) | ||
| 128 | } | ||
| 129 | |||
| 130 | async fn get_h(State(st): State<St>, path: Option<Path<String>>) -> Response { | ||
| 131 | let up = upath(&path); | ||
| 132 | let Some(p) = resolve(&st.root, up) else { return StatusCode::FORBIDDEN.into_response() }; | ||
| 133 | if p.is_dir() { dir_list(&p, up).await } | ||
| 134 | else if p.is_file() { serve_file(&p).await } | ||
| 135 | else { StatusCode::NOT_FOUND.into_response() } | ||
| 136 | } | ||
| 137 | |||
| 138 | async fn upload_h(State(st): State<St>, path: Option<Path<String>>, mut mp: Multipart) -> Response { | ||
| 139 | let up = upath(&path); | ||
| 140 | let Some(dir) = resolve(&st.root, up) else { return StatusCode::FORBIDDEN.into_response() }; | ||
| 141 | let dir = if dir.is_dir() { dir } else { dir.parent().unwrap_or(&st.root).to_path_buf() }; | ||
| 142 | while let Ok(Some(mut field)) = mp.next_field().await { | ||
| 143 | if field.name() != Some("file") { continue } | ||
| 144 | let name = match field.file_name() { Some(n) => sanitize(n), None => continue }; | ||
| 145 | if name.is_empty() { continue } | ||
| 146 | let dest = dir.join(&name); | ||
| 147 | if !dest.starts_with(&st.root) { return StatusCode::FORBIDDEN.into_response() } | ||
| 148 | println!("receiving: {}", dest.display()); | ||
| 149 | let t = Instant::now(); | ||
| 150 | let Ok(mut f) = fs::File::create(&dest).await else { return StatusCode::INTERNAL_SERVER_ERROR.into_response() }; | ||
| 151 | let (mut sz, mut last_print): (u64, u64) = (0, 0); | ||
| 152 | while let Ok(Some(ch)) = field.chunk().await { | ||
| 153 | if f.write_all(&ch).await.is_err() { | ||
| 154 | let _ = fs::remove_file(&dest).await; | ||
| 155 | return StatusCode::INTERNAL_SERVER_ERROR.into_response(); | ||
| 156 | } | ||
| 157 | sz += ch.len() as u64; | ||
| 158 | if sz - last_print >= 10 * 1024 * 1024 { | ||
| 159 | let el = t.elapsed().as_secs_f64(); | ||
| 160 | let spd = if el > 0.0 { (sz as f64 / el) as u64 } else { 0 }; | ||
| 161 | print!("\r {} received, {}/s", hsz(sz), hsz(spd)); | ||
| 162 | std::io::stdout().flush().ok(); | ||
| 163 | last_print = sz; | ||
| 164 | } | ||
| 165 | } | ||
| 166 | if last_print > 0 { println!() } | ||
| 167 | if sz == 0 { let _ = fs::remove_file(&dest).await; continue } | ||
| 168 | let el = t.elapsed().as_secs_f64(); | ||
| 169 | println!("done: {} ({} @ {}/s)", dest.display(), hsz(sz), hsz(if el > 0.0 { (sz as f64 / el) as u64 } else { 0 })); | ||
| 170 | } | ||
| 171 | Redirect::to(&if up.is_empty() { "/".into() } else { format!("/{up}") }).into_response() | ||
| 172 | } | ||
| 173 | |||
| 174 | async fn serve_file(p: &FsPath) -> Response { | ||
| 175 | let Ok(b) = fs::read(p).await else { return StatusCode::INTERNAL_SERVER_ERROR.into_response() }; | ||
| 176 | let mime = mime_guess::from_path(p).first_or_octet_stream().to_string(); | ||
| 177 | let name = p.file_name().unwrap().to_string_lossy(); | ||
| 178 | let inline = mime.starts_with("text/") || mime.starts_with("image/") || mime == "application/pdf"; | ||
| 179 | let d = format!("{}; filename=\"{name}\"", if inline { "inline" } else { "attachment" }); | ||
| 180 | Response::builder().header(header::CONTENT_TYPE, mime).header(header::CONTENT_DISPOSITION, d) | ||
| 181 | .body(Body::from(b)).unwrap() | ||
| 182 | } | ||
| 183 | |||
| 184 | async fn dir_list(dir: &FsPath, url_path: &str) -> Response { | ||
| 185 | let Ok(mut rd) = fs::read_dir(dir).await else { return StatusCode::FORBIDDEN.into_response() }; | ||
| 186 | let (mut ds, mut fs_): (Vec<(String, String)>, Vec<(String, String, u64)>) = (vec![], vec![]); | ||
| 187 | while let Ok(Some(e)) = rd.next_entry().await { | ||
| 188 | let n = e.file_name().to_string_lossy().into_owned(); | ||
| 189 | let Ok(m) = e.metadata().await else { continue }; | ||
| 190 | let enc = percent_encoding::utf8_percent_encode(&n, percent_encoding::NON_ALPHANUMERIC).to_string(); | ||
| 191 | if m.is_dir() { ds.push((n, enc)) } else { fs_.push((n, enc, m.len())) } | ||
| 192 | } | ||
| 193 | ds.sort_by(|a, b| a.0.to_lowercase().cmp(&b.0.to_lowercase())); | ||
| 194 | fs_.sort_by(|a, b| a.0.to_lowercase().cmp(&b.0.to_lowercase())); | ||
| 195 | let dp = if url_path.is_empty() { "/" } else { url_path }; | ||
| 196 | let de = esc(dp); | ||
| 197 | let mut r = String::new(); | ||
| 198 | if !url_path.is_empty() { r.push_str("<a href=\"../\">../</a>\n") } | ||
| 199 | for (n, e) in &ds { r.push_str(&format!("<a href=\"{e}/\">{}/</a>\n", esc(n))) } | ||
| 200 | for (n, e, s) in &fs_ { | ||
| 201 | let (nm, sz) = (esc(n), hsz(*s)); | ||
| 202 | let pad = 60usize.saturating_sub(nm.len()).max(2); | ||
| 203 | r.push_str(&format!("<a href=\"{e}\">{nm}</a>{:>w$}\n", sz, w = pad + sz.len())); | ||
| 204 | } | ||
| 205 | Html(format!(r#"<!DOCTYPE html><html><head><meta charset="utf-8"><title>{de}</title> | ||
| 206 | <style>body{{font-family:monospace;margin:2em auto;max-width:900px;padding:0 1em}}a{{color:#07c}} | ||
| 207 | #dz{{margin-top:1em;padding:1em;border:2px dashed #ccc;text-align:center}} | ||
| 208 | #dz.over{{border-color:#07c;background:#eef}}</style></head> | ||
| 209 | <body><h2>{de}</h2><pre>{r}</pre> | ||
| 210 | <div id="dz">drop files | <input type="file" id="fi" multiple> <button onclick="up(fi.files)">upload</button> | ||
| 211 | <button id="cb" style="display:none;color:red" onclick="xhrs.forEach(x=>x.abort());xhrs=[];cb.style.display='none';st.textContent='cancelled'">cancel</button> | ||
| 212 | <span id="st"></span></div> | ||
| 213 | <script> | ||
| 214 | const dz=document.getElementById('dz'),fi=document.getElementById('fi'),cb=document.getElementById('cb'),st=document.getElementById('st'); | ||
| 215 | let xhrs=[]; | ||
| 216 | dz.ondragover=e=>{{e.preventDefault();dz.classList.add('over')}}; | ||
| 217 | dz.ondragleave=()=>dz.classList.remove('over'); | ||
| 218 | dz.ondrop=e=>{{e.preventDefault();dz.classList.remove('over');if(e.dataTransfer.files.length)up(e.dataTransfer.files)}}; | ||
| 219 | function hz(b){{for(const u of['B','KB','MB','GB','TB']){{if(b<1024)return(b|0)==b?b+' '+u:b.toFixed(1)+' '+u;b/=1024}}return b.toFixed(1)+' PB'}} | ||
| 220 | function up(F){{if(!F.length)return;let n=F.length,tot=0,t0=Date.now();xhrs=[];const ld=new Map(); | ||
| 221 | [...F].forEach(f=>tot+=f.size);st.textContent='...';cb.style.display='inline'; | ||
| 222 | Promise.all([...F].map((f,i)=>new Promise((ok,no)=>{{const x=new XMLHttpRequest(),fd=new FormData();fd.append('file',f);xhrs.push(x); | ||
| 223 | x.open('POST',location.pathname); | ||
| 224 | x.upload.onprogress=e=>{{if(e.lengthComputable){{ld.set(i,e.loaded);let s=0;ld.forEach(v=>s+=v);st.textContent=`${{hz(s)}}/${{hz(tot)}} ${{hz(s/((Date.now()-t0)/1000))}}/s`}}}}; | ||
| 225 | x.onload=()=>x.status>=400?no(Error(f.name+':'+x.status)):ok(); | ||
| 226 | x.onabort=()=>no(Error('cancelled'));x.onerror=()=>no(Error(f.name+':failed'));x.send(fd) | ||
| 227 | }}))).then(()=>{{cb.style.display='none';st.textContent=`done ${{n}} ${{hz(tot)}} @ ${{hz(tot/((Date.now()-t0)/1000))}}/s`; | ||
| 228 | setTimeout(()=>location.reload(),1000)}}).catch(e=>{{cb.style.display='none';st.textContent=e.message}})}} | ||
| 229 | </script></body></html>"#)).into_response() | ||
| 230 | } | ||
| 231 | |||
| 232 | fn sanitize(n: &str) -> String { | ||
| 233 | FsPath::new(n).file_name().map(|n| n.to_string_lossy().replace(['/', '\\', '\0'], "_")).unwrap_or_default() | ||
| 234 | } | ||
| 235 | fn esc(s: &str) -> String { s.replace('&', "&").replace('<', "<").replace('>', ">").replace('"', """) } | ||
| 236 | fn hsz(b: u64) -> String { | ||
| 237 | let mut s = b as f64; | ||
| 238 | for u in ["B","KB","MB","GB","TB"] { if s < 1024.0 { return if u=="B" { format!("{s:.0} {u}") } else { format!("{s:.1} {u}") } } s /= 1024.0 } | ||
| 239 | format!("{s:.1} PB") | ||
| 240 | } | ||
