diff --git a/.gitignore b/.gitignore
index 2a0038a..d4e556a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
/target
-.idea
\ No newline at end of file
+.idea
+pds.env
\ No newline at end of file
diff --git a/Cargo.lock b/Cargo.lock
index 50c741d..7955d87 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -24,7 +24,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
dependencies = [
"cfg-if",
- "getrandom 0.3.3",
"once_cell",
"version_check",
"zerocopy",
@@ -45,6 +44,41 @@ version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.99"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100"
+
+[[package]]
+name = "async-compression"
+version = "0.4.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8"
+dependencies = [
+ "futures-core",
+ "memchr",
+ "pin-project-lite",
+ "tokio",
+ "zstd",
+ "zstd-safe",
+]
+
[[package]]
name = "async-trait"
version = "0.1.89"
@@ -53,7 +87,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.105",
+ "syn",
]
[[package]]
@@ -65,6 +99,12 @@ dependencies = [
"num-traits",
]
+[[package]]
+name = "atomic-waker"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+
[[package]]
name = "autocfg"
version = "1.5.0"
@@ -73,14 +113,14 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "axum"
-version = "0.7.9"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f"
+checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5"
dependencies = [
- "async-trait",
"axum-core",
"axum-macros",
"bytes",
+ "form_urlencoded",
"futures-util",
"http",
"http-body",
@@ -108,13 +148,12 @@ dependencies = [
[[package]]
name = "axum-core"
-version = "0.4.5"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"
+checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6"
dependencies = [
- "async-trait",
"bytes",
- "futures-util",
+ "futures-core",
"http",
"http-body",
"http-body-util",
@@ -129,13 +168,25 @@ dependencies = [
[[package]]
name = "axum-macros"
-version = "0.4.2"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce"
+checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.105",
+ "syn",
+]
+
+[[package]]
+name = "axum-template"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3df50f7d669bfc3a8c348f08f536fe37e7acfbeded3cfdffd2ad3d76725fc40c"
+dependencies = [
+ "axum",
+ "handlebars",
+ "serde",
+ "thiserror 2.0.14",
]
[[package]]
@@ -155,9 +206,9 @@ dependencies = [
[[package]]
name = "base64"
-version = "0.21.7"
+version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]]
name = "base64ct"
@@ -183,6 +234,22 @@ dependencies = [
"generic-array",
]
+[[package]]
+name = "bstr"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4"
+dependencies = [
+ "memchr",
+ "serde",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
+
[[package]]
name = "byteorder"
version = "1.5.0"
@@ -201,6 +268,8 @@ version = "1.2.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e"
dependencies = [
+ "jobserver",
+ "libc",
"shlex",
]
@@ -210,12 +279,96 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
+[[package]]
+name = "chrono"
+version = "0.4.41"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "num-traits",
+ "windows-link",
+]
+
+[[package]]
+name = "chumsky"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eebd66744a15ded14960ab4ccdbfb51ad3b81f51f3f04a80adac98c985396c9"
+dependencies = [
+ "hashbrown 0.14.5",
+ "stacker",
+]
+
+[[package]]
+name = "ciborium"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9"
+dependencies = [
+ "ciborium-io",
+ "half",
+]
+
+[[package]]
+name = "cipher"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
+dependencies = [
+ "crypto-common",
+ "inout",
+]
+
+[[package]]
+name = "concurrent-queue"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
+dependencies = [
+ "crossbeam-utils",
+]
+
[[package]]
name = "const-oid"
version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
+[[package]]
+name = "core-foundation"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
[[package]]
name = "cpufeatures"
version = "0.2.17"
@@ -255,6 +408,12 @@ version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
+[[package]]
+name = "crunchy"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
+
[[package]]
name = "crypto-common"
version = "0.1.6"
@@ -265,6 +424,55 @@ dependencies = [
"typenum",
]
+[[package]]
+name = "darling"
+version = "0.20.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.20.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim",
+ "syn",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.20.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "dashmap"
+version = "6.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+ "hashbrown 0.14.5",
+ "lock_api",
+ "once_cell",
+ "parking_lot_core",
+]
+
[[package]]
name = "der"
version = "0.7.10"
@@ -276,6 +484,37 @@ dependencies = [
"zeroize",
]
+[[package]]
+name = "derive_builder"
+version = "0.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947"
+dependencies = [
+ "derive_builder_macro",
+]
+
+[[package]]
+name = "derive_builder_core"
+version = "0.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8"
+dependencies = [
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "derive_builder_macro"
+version = "0.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
+dependencies = [
+ "derive_builder_core",
+ "syn",
+]
+
[[package]]
name = "digest"
version = "0.10.7"
@@ -296,7 +535,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.105",
+ "syn",
]
[[package]]
@@ -314,6 +553,22 @@ dependencies = [
"serde",
]
+[[package]]
+name = "email-encoding"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6"
+dependencies = [
+ "base64",
+ "memchr",
+]
+
+[[package]]
+name = "email_address"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449"
+
[[package]]
name = "equivalent"
version = "1.0.2"
@@ -327,7 +582,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
dependencies = [
"libc",
- "windows-sys 0.60.2",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -343,9 +598,14 @@ dependencies = [
[[package]]
name = "event-listener"
-version = "2.5.3"
+version = "5.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
+checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
+dependencies = [
+ "concurrent-queue",
+ "parking",
+ "pin-project-lite",
+]
[[package]]
name = "fastrand"
@@ -370,6 +630,27 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+[[package]]
+name = "foldhash"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+
+[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+dependencies = [
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
[[package]]
name = "form_urlencoded"
version = "1.2.1"
@@ -379,6 +660,16 @@ dependencies = [
"percent-encoding",
]
+[[package]]
+name = "forwarded-header-value"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8835f84f38484cc86f110a805655697908257fb9a7af005234060891557198e9"
+dependencies = [
+ "nonempty",
+ "thiserror 1.0.69",
+]
+
[[package]]
name = "futures-channel"
version = "0.3.31"
@@ -435,6 +726,12 @@ version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
+[[package]]
+name = "futures-timer"
+version = "3.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24"
+
[[package]]
name = "futures-util"
version = "0.3.31"
@@ -479,9 +776,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
dependencies = [
"cfg-if",
+ "js-sys",
"libc",
"r-efi",
"wasi 0.14.2+wasi-0.2.4",
+ "wasm-bindgen",
]
[[package]]
@@ -490,6 +789,88 @@ version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
+[[package]]
+name = "globset"
+version = "0.4.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5"
+dependencies = [
+ "aho-corasick",
+ "bstr",
+ "log",
+ "regex-automata 0.4.9",
+ "regex-syntax 0.8.5",
+]
+
+[[package]]
+name = "governor"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "444405bbb1a762387aa22dd569429533b54a1d8759d35d3b64cb39b0293eaa19"
+dependencies = [
+ "cfg-if",
+ "dashmap",
+ "futures-sink",
+ "futures-timer",
+ "futures-util",
+ "getrandom 0.3.3",
+ "hashbrown 0.15.5",
+ "nonzero_ext",
+ "parking_lot",
+ "portable-atomic",
+ "quanta",
+ "rand 0.9.2",
+ "smallvec",
+ "spinning_top",
+ "web-time",
+]
+
+[[package]]
+name = "h2"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386"
+dependencies = [
+ "atomic-waker",
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "half"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9"
+dependencies = [
+ "cfg-if",
+ "crunchy",
+]
+
+[[package]]
+name = "handlebars"
+version = "6.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "759e2d5aea3287cb1190c8ec394f42866cb5bf74fcbf213f354e3c856ea26098"
+dependencies = [
+ "derive_builder",
+ "log",
+ "num-order",
+ "pest",
+ "pest_derive",
+ "rust-embed",
+ "serde",
+ "serde_json",
+ "thiserror 2.0.14",
+]
+
[[package]]
name = "hashbrown"
version = "0.14.5"
@@ -505,24 +886,26 @@ name = "hashbrown"
version = "0.15.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
+dependencies = [
+ "allocator-api2",
+ "equivalent",
+ "foldhash",
+]
[[package]]
name = "hashlink"
-version = "0.8.4"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"
+checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1"
dependencies = [
- "hashbrown 0.14.5",
+ "hashbrown 0.15.5",
]
[[package]]
name = "heck"
-version = "0.4.1"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
-dependencies = [
- "unicode-segmentation",
-]
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "hex"
@@ -557,6 +940,17 @@ dependencies = [
"windows-sys 0.59.0",
]
+[[package]]
+name = "hostname"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "windows-link",
+]
+
[[package]]
name = "http"
version = "1.3.1"
@@ -612,6 +1006,7 @@ dependencies = [
"bytes",
"futures-channel",
"futures-util",
+ "h2",
"http",
"http-body",
"httparse",
@@ -620,6 +1015,20 @@ dependencies = [
"pin-project-lite",
"smallvec",
"tokio",
+ "want",
+]
+
+[[package]]
+name = "hyper-timeout"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0"
+dependencies = [
+ "hyper",
+ "hyper-util",
+ "pin-project-lite",
+ "tokio",
+ "tower-service",
]
[[package]]
@@ -629,13 +1038,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e"
dependencies = [
"bytes",
+ "futures-channel",
"futures-core",
+ "futures-util",
"http",
"http-body",
"hyper",
+ "libc",
"pin-project-lite",
+ "socket2",
"tokio",
"tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "log",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
]
[[package]]
@@ -724,6 +1162,12 @@ dependencies = [
"zerovec",
]
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
[[package]]
name = "idna"
version = "1.0.3"
@@ -755,6 +1199,15 @@ dependencies = [
"hashbrown 0.15.5",
]
+[[package]]
+name = "inout"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"
+dependencies = [
+ "generic-array",
+]
+
[[package]]
name = "io-uring"
version = "0.7.9"
@@ -772,6 +1225,48 @@ version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+[[package]]
+name = "jobserver"
+version = "0.1.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a"
+dependencies = [
+ "getrandom 0.3.3",
+ "libc",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "jwt-compact"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25cb2458ca54de48ef237ac0d68d4e80e512ae81d6aeb9775f4c835da0d193d3"
+dependencies = [
+ "anyhow",
+ "base64ct",
+ "chrono",
+ "ciborium",
+ "hmac",
+ "lazy_static",
+ "rand_core 0.6.4",
+ "secp256k1",
+ "serde",
+ "serde_json",
+ "sha2",
+ "smallvec",
+ "subtle",
+ "zeroize",
+]
+
[[package]]
name = "lazy_static"
version = "1.5.0"
@@ -781,6 +1276,34 @@ dependencies = [
"spin",
]
+[[package]]
+name = "lettre"
+version = "0.11.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cb54db6ff7a89efac87dba5baeac57bb9ccd726b49a9b6f21fb92b3966aaf56"
+dependencies = [
+ "async-trait",
+ "base64",
+ "chumsky",
+ "email-encoding",
+ "email_address",
+ "fastrand",
+ "futures-io",
+ "futures-util",
+ "hostname",
+ "httpdate",
+ "idna",
+ "mime",
+ "native-tls",
+ "nom",
+ "percent-encoding",
+ "quoted_printable",
+ "socket2",
+ "tokio",
+ "tokio-native-tls",
+ "url",
+]
+
[[package]]
name = "libc"
version = "0.2.175"
@@ -806,9 +1329,9 @@ dependencies = [
[[package]]
name = "libsqlite3-sys"
-version = "0.27.0"
+version = "0.30.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716"
+checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149"
dependencies = [
"cc",
"pkg-config",
@@ -854,9 +1377,9 @@ dependencies = [
[[package]]
name = "matchit"
-version = "0.7.3"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
[[package]]
name = "md-5"
@@ -880,12 +1403,6 @@ version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
-[[package]]
-name = "minimal-lexical"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
-
[[package]]
name = "miniz_oxide"
version = "0.8.9"
@@ -906,16 +1423,44 @@ dependencies = [
"windows-sys 0.59.0",
]
+[[package]]
+name = "native-tls"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
+dependencies = [
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
[[package]]
name = "nom"
-version = "7.1.3"
+version = "8.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"
dependencies = [
"memchr",
- "minimal-lexical",
]
+[[package]]
+name = "nonempty"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9e591e719385e6ebaeb5ce5d3887f7d5676fceca6411d1925ccc95745f3d6f7"
+
+[[package]]
+name = "nonzero_ext"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
+
[[package]]
name = "nu-ansi-term"
version = "0.46.0"
@@ -938,7 +1483,7 @@ dependencies = [
"num-integer",
"num-iter",
"num-traits",
- "rand",
+ "rand 0.8.5",
"smallvec",
"zeroize",
]
@@ -963,6 +1508,21 @@ dependencies = [
"num-traits",
]
+[[package]]
+name = "num-modular"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f"
+
+[[package]]
+name = "num-order"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6"
+dependencies = [
+ "num-modular",
+]
+
[[package]]
name = "num-traits"
version = "0.2.19"
@@ -983,10 +1543,54 @@ dependencies = [
]
[[package]]
-name = "once_cell"
-version = "1.21.3"
+name = "once_cell"
+version = "1.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+
+[[package]]
+name = "openssl"
+version = "0.10.73"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8"
+dependencies = [
+ "bitflags",
+ "cfg-if",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
[[package]]
name = "overload"
@@ -994,6 +1598,12 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+[[package]]
+name = "parking"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
+
[[package]]
name = "parking_lot"
version = "0.12.4"
@@ -1018,21 +1628,46 @@ dependencies = [
]
[[package]]
-name = "paste"
-version = "1.0.15"
+name = "password-hash"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166"
+dependencies = [
+ "base64ct",
+ "rand_core 0.6.4",
+ "subtle",
+]
+
+[[package]]
+name = "pbkdf2"
+version = "0.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2"
+dependencies = [
+ "digest",
+ "hmac",
+]
[[package]]
-name = "pds_bells_and_whistles"
+name = "pds_gatekeeper"
version = "0.1.0"
dependencies = [
"axum",
+ "axum-template",
"dotenvy",
+ "handlebars",
+ "hex",
+ "hyper-util",
+ "jwt-compact",
+ "lettre",
+ "rust-embed",
+ "scrypt",
"serde",
"serde_json",
"sqlx",
"tokio",
+ "tower-http",
+ "tower_governor",
"tracing",
"tracing-subscriber",
]
@@ -1052,6 +1687,70 @@ version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+[[package]]
+name = "pest"
+version = "2.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323"
+dependencies = [
+ "memchr",
+ "thiserror 2.0.14",
+ "ucd-trie",
+]
+
+[[package]]
+name = "pest_derive"
+version = "2.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb056d9e8ea77922845ec74a1c4e8fb17e7c218cc4fc11a15c5d25e189aa40bc"
+dependencies = [
+ "pest",
+ "pest_generator",
+]
+
+[[package]]
+name = "pest_generator"
+version = "2.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87e404e638f781eb3202dc82db6760c8ae8a1eeef7fb3fa8264b2ef280504966"
+dependencies = [
+ "pest",
+ "pest_meta",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pest_meta"
+version = "2.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5"
+dependencies = [
+ "pest",
+ "sha2",
+]
+
+[[package]]
+name = "pin-project"
+version = "1.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
[[package]]
name = "pin-project-lite"
version = "0.2.16"
@@ -1091,6 +1790,12 @@ version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
+[[package]]
+name = "portable-atomic"
+version = "1.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
+
[[package]]
name = "potential_utf"
version = "0.1.2"
@@ -1118,6 +1823,30 @@ dependencies = [
"unicode-ident",
]
+[[package]]
+name = "psm"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "quanta"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7"
+dependencies = [
+ "crossbeam-utils",
+ "libc",
+ "once_cell",
+ "raw-cpuid",
+ "wasi 0.11.1+wasi-snapshot-preview1",
+ "web-sys",
+ "winapi",
+]
+
[[package]]
name = "quote"
version = "1.0.40"
@@ -1127,6 +1856,12 @@ dependencies = [
"proc-macro2",
]
+[[package]]
+name = "quoted_printable"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "640c9bd8497b02465aeef5375144c26062e0dcd5939dfcbb0f5db76cb8c17c73"
+
[[package]]
name = "r-efi"
version = "5.3.0"
@@ -1140,8 +1875,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
- "rand_chacha",
- "rand_core",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
+dependencies = [
+ "rand_chacha 0.9.0",
+ "rand_core 0.9.3",
]
[[package]]
@@ -1151,7 +1896,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
- "rand_core",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.9.3",
]
[[package]]
@@ -1163,6 +1918,24 @@ dependencies = [
"getrandom 0.2.16",
]
+[[package]]
+name = "rand_core"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
+dependencies = [
+ "getrandom 0.3.3",
+]
+
+[[package]]
+name = "raw-cpuid"
+version = "11.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146"
+dependencies = [
+ "bitflags",
+]
+
[[package]]
name = "redox_syscall"
version = "0.5.17"
@@ -1243,13 +2016,48 @@ dependencies = [
"num-traits",
"pkcs1",
"pkcs8",
- "rand_core",
+ "rand_core 0.6.4",
"signature",
"spki",
"subtle",
"zeroize",
]
+[[package]]
+name = "rust-embed"
+version = "8.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a"
+dependencies = [
+ "rust-embed-impl",
+ "rust-embed-utils",
+ "walkdir",
+]
+
+[[package]]
+name = "rust-embed-impl"
+version = "8.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "rust-embed-utils",
+ "syn",
+ "walkdir",
+]
+
+[[package]]
+name = "rust-embed-utils"
+version = "8.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594"
+dependencies = [
+ "globset",
+ "sha2",
+ "walkdir",
+]
+
[[package]]
name = "rustc-demangle"
version = "0.1.26"
@@ -1266,36 +2074,40 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
- "windows-sys 0.60.2",
+ "windows-sys 0.59.0",
]
[[package]]
name = "rustls"
-version = "0.21.12"
+version = "0.23.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
+checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc"
dependencies = [
+ "once_cell",
"ring",
+ "rustls-pki-types",
"rustls-webpki",
- "sct",
+ "subtle",
+ "zeroize",
]
[[package]]
-name = "rustls-pemfile"
-version = "1.0.4"
+name = "rustls-pki-types"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
+checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
dependencies = [
- "base64",
+ "zeroize",
]
[[package]]
name = "rustls-webpki"
-version = "0.101.7"
+version = "0.103.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
+checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc"
dependencies = [
"ring",
+ "rustls-pki-types",
"untrusted",
]
@@ -1311,6 +2123,33 @@ version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+[[package]]
+name = "salsa20"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "schannel"
+version = "0.1.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
[[package]]
name = "scopeguard"
version = "1.2.0"
@@ -1318,13 +2157,56 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
-name = "sct"
-version = "0.7.1"
+name = "scrypt"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
+checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f"
dependencies = [
- "ring",
- "untrusted",
+ "password-hash",
+ "pbkdf2",
+ "salsa20",
+ "sha2",
+]
+
+[[package]]
+name = "secp256k1"
+version = "0.28.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10"
+dependencies = [
+ "secp256k1-sys",
+]
+
+[[package]]
+name = "secp256k1-sys"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "security-framework"
+version = "2.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
+dependencies = [
+ "bitflags",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
]
[[package]]
@@ -1344,7 +2226,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.105",
+ "syn",
]
[[package]]
@@ -1434,7 +2316,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
dependencies = [
"digest",
- "rand_core",
+ "rand_core 0.6.4",
]
[[package]]
@@ -1448,6 +2330,9 @@ name = "smallvec"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+dependencies = [
+ "serde",
+]
[[package]]
name = "socket2"
@@ -1469,30 +2354,29 @@ dependencies = [
]
[[package]]
-name = "spki"
-version = "0.7.3"
+name = "spinning_top"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
+checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300"
dependencies = [
- "base64ct",
- "der",
+ "lock_api",
]
[[package]]
-name = "sqlformat"
-version = "0.2.6"
+name = "spki"
+version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790"
+checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
dependencies = [
- "nom",
- "unicode_categories",
+ "base64ct",
+ "der",
]
[[package]]
name = "sqlx"
-version = "0.7.4"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa"
+checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc"
dependencies = [
"sqlx-core",
"sqlx-macros",
@@ -1503,64 +2387,58 @@ dependencies = [
[[package]]
name = "sqlx-core"
-version = "0.7.4"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6"
+checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6"
dependencies = [
- "ahash",
- "atoi",
- "byteorder",
+ "base64",
"bytes",
"crc",
"crossbeam-queue",
"either",
"event-listener",
- "futures-channel",
"futures-core",
"futures-intrusive",
"futures-io",
"futures-util",
+ "hashbrown 0.15.5",
"hashlink",
- "hex",
"indexmap",
"log",
"memchr",
"once_cell",
- "paste",
"percent-encoding",
"rustls",
- "rustls-pemfile",
"serde",
"serde_json",
"sha2",
"smallvec",
- "sqlformat",
- "thiserror",
+ "thiserror 2.0.14",
"tokio",
"tokio-stream",
"tracing",
"url",
- "webpki-roots",
+ "webpki-roots 0.26.11",
]
[[package]]
name = "sqlx-macros"
-version = "0.7.4"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127"
+checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d"
dependencies = [
"proc-macro2",
"quote",
"sqlx-core",
"sqlx-macros-core",
- "syn 1.0.109",
+ "syn",
]
[[package]]
name = "sqlx-macros-core"
-version = "0.7.4"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8"
+checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b"
dependencies = [
"dotenvy",
"either",
@@ -1574,18 +2452,18 @@ dependencies = [
"sha2",
"sqlx-core",
"sqlx-mysql",
+ "sqlx-postgres",
"sqlx-sqlite",
- "syn 1.0.109",
- "tempfile",
+ "syn",
"tokio",
"url",
]
[[package]]
name = "sqlx-mysql"
-version = "0.7.4"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418"
+checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526"
dependencies = [
"atoi",
"base64",
@@ -1610,7 +2488,7 @@ dependencies = [
"memchr",
"once_cell",
"percent-encoding",
- "rand",
+ "rand 0.8.5",
"rsa",
"serde",
"sha1",
@@ -1618,16 +2496,16 @@ dependencies = [
"smallvec",
"sqlx-core",
"stringprep",
- "thiserror",
+ "thiserror 2.0.14",
"tracing",
"whoami",
]
[[package]]
name = "sqlx-postgres"
-version = "0.7.4"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e"
+checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46"
dependencies = [
"atoi",
"base64",
@@ -1638,7 +2516,6 @@ dependencies = [
"etcetera",
"futures-channel",
"futures-core",
- "futures-io",
"futures-util",
"hex",
"hkdf",
@@ -1649,23 +2526,23 @@ dependencies = [
"md-5",
"memchr",
"once_cell",
- "rand",
+ "rand 0.8.5",
"serde",
"serde_json",
"sha2",
"smallvec",
"sqlx-core",
"stringprep",
- "thiserror",
+ "thiserror 2.0.14",
"tracing",
"whoami",
]
[[package]]
name = "sqlx-sqlite"
-version = "0.7.4"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa"
+checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea"
dependencies = [
"atoi",
"flume",
@@ -1678,10 +2555,11 @@ dependencies = [
"log",
"percent-encoding",
"serde",
+ "serde_urlencoded",
"sqlx-core",
+ "thiserror 2.0.14",
"tracing",
"url",
- "urlencoding",
]
[[package]]
@@ -1690,6 +2568,19 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+[[package]]
+name = "stacker"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cddb07e32ddb770749da91081d8d0ac3a16f1a569a18b20348cd371f5dead06b"
+dependencies = [
+ "cc",
+ "cfg-if",
+ "libc",
+ "psm",
+ "windows-sys 0.59.0",
+]
+
[[package]]
name = "stringprep"
version = "0.1.5"
@@ -1702,21 +2593,16 @@ dependencies = [
]
[[package]]
-name = "subtle"
-version = "2.6.1"
+name = "strsim"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
-name = "syn"
-version = "1.0.109"
+name = "subtle"
+version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
+checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "syn"
@@ -1743,14 +2629,14 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.105",
+ "syn",
]
[[package]]
name = "tempfile"
-version = "3.20.0"
+version = "3.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
+checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e"
dependencies = [
"fastrand",
"getrandom 0.3.3",
@@ -1765,7 +2651,16 @@ version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
dependencies = [
- "thiserror-impl",
+ "thiserror-impl 1.0.69",
+]
+
+[[package]]
+name = "thiserror"
+version = "2.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e"
+dependencies = [
+ "thiserror-impl 2.0.14",
]
[[package]]
@@ -1776,7 +2671,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.105",
+ "syn",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "2.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
]
[[package]]
@@ -1840,7 +2746,17 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.105",
+ "syn",
+]
+
+[[package]]
+name = "tokio-native-tls"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
+dependencies = [
+ "native-tls",
+ "tokio",
]
[[package]]
@@ -1854,6 +2770,48 @@ dependencies = [
"tokio",
]
+[[package]]
+name = "tokio-util"
+version = "0.7.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tonic"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67ac5a8627ada0968acec063a4746bf79588aa03ccb66db2f75d7dce26722a40"
+dependencies = [
+ "async-trait",
+ "axum",
+ "base64",
+ "bytes",
+ "h2",
+ "http",
+ "http-body",
+ "http-body-util",
+ "hyper",
+ "hyper-timeout",
+ "hyper-util",
+ "percent-encoding",
+ "pin-project",
+ "socket2",
+ "sync_wrapper",
+ "tokio",
+ "tokio-stream",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
[[package]]
name = "tower"
version = "0.5.2"
@@ -1862,14 +2820,36 @@ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
dependencies = [
"futures-core",
"futures-util",
+ "indexmap",
"pin-project-lite",
+ "slab",
"sync_wrapper",
"tokio",
+ "tokio-util",
"tower-layer",
"tower-service",
"tracing",
]
+[[package]]
+name = "tower-http"
+version = "0.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
+dependencies = [
+ "async-compression",
+ "bitflags",
+ "bytes",
+ "futures-core",
+ "http",
+ "http-body",
+ "pin-project-lite",
+ "tokio",
+ "tokio-util",
+ "tower-layer",
+ "tower-service",
+]
+
[[package]]
name = "tower-layer"
version = "0.3.3"
@@ -1882,6 +2862,23 @@ version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
+[[package]]
+name = "tower_governor"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44de9b94d849d3c46e06a883d72d408c2de6403367b39df2b1c9d9e7b6736fe6"
+dependencies = [
+ "axum",
+ "forwarded-header-value",
+ "governor",
+ "http",
+ "pin-project",
+ "thiserror 2.0.14",
+ "tonic",
+ "tower",
+ "tracing",
+]
+
[[package]]
name = "tracing"
version = "0.1.41"
@@ -1902,7 +2899,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.105",
+ "syn",
]
[[package]]
@@ -1944,12 +2941,24 @@ dependencies = [
"tracing-log",
]
+[[package]]
+name = "try-lock"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+
[[package]]
name = "typenum"
version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
+[[package]]
+name = "ucd-trie"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
+
[[package]]
name = "unicode-bidi"
version = "0.3.18"
@@ -1977,18 +2986,6 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0"
-[[package]]
-name = "unicode-segmentation"
-version = "1.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
-
-[[package]]
-name = "unicode_categories"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
-
[[package]]
name = "untrusted"
version = "0.9.0"
@@ -2006,12 +3003,6 @@ dependencies = [
"percent-encoding",
]
-[[package]]
-name = "urlencoding"
-version = "2.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
-
[[package]]
name = "utf8_iter"
version = "1.0.4"
@@ -2036,6 +3027,25 @@ version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+[[package]]
+name = "walkdir"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "want"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+dependencies = [
+ "try-lock",
+]
+
[[package]]
name = "wasi"
version = "0.11.1+wasi-snapshot-preview1"
@@ -2057,11 +3067,101 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "web-time"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
[[package]]
name = "webpki-roots"
-version = "0.25.4"
+version = "0.26.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
+checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9"
+dependencies = [
+ "webpki-roots 1.0.2",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2"
+dependencies = [
+ "rustls-pki-types",
+]
[[package]]
name = "whoami"
@@ -2089,18 +3189,80 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+[[package]]
+name = "winapi-util"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+[[package]]
+name = "windows-core"
+version = "0.61.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-link",
+ "windows-result",
+ "windows-strings",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.60.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.59.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
[[package]]
name = "windows-link"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
+[[package]]
+name = "windows-result"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
+dependencies = [
+ "windows-link",
+]
+
[[package]]
name = "windows-sys"
version = "0.48.0"
@@ -2128,15 +3290,6 @@ dependencies = [
"windows-targets 0.52.6",
]
-[[package]]
-name = "windows-sys"
-version = "0.60.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
-dependencies = [
- "windows-targets 0.53.3",
-]
-
[[package]]
name = "windows-targets"
version = "0.48.5"
@@ -2161,30 +3314,13 @@ dependencies = [
"windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.6",
- "windows_i686_gnullvm 0.52.6",
+ "windows_i686_gnullvm",
"windows_i686_msvc 0.52.6",
"windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc 0.52.6",
]
-[[package]]
-name = "windows-targets"
-version = "0.53.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91"
-dependencies = [
- "windows-link",
- "windows_aarch64_gnullvm 0.53.0",
- "windows_aarch64_msvc 0.53.0",
- "windows_i686_gnu 0.53.0",
- "windows_i686_gnullvm 0.53.0",
- "windows_i686_msvc 0.53.0",
- "windows_x86_64_gnu 0.53.0",
- "windows_x86_64_gnullvm 0.53.0",
- "windows_x86_64_msvc 0.53.0",
-]
-
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.5"
@@ -2197,12 +3333,6 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
-
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
@@ -2215,12 +3345,6 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
-
[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
@@ -2233,24 +3357,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
-[[package]]
-name = "windows_i686_gnu"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
-
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
-[[package]]
-name = "windows_i686_gnullvm"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
-
[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
@@ -2263,12 +3375,6 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
-[[package]]
-name = "windows_i686_msvc"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
-
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
@@ -2281,12 +3387,6 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
-
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
@@ -2299,12 +3399,6 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
-
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
@@ -2317,12 +3411,6 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
-
[[package]]
name = "wit-bindgen-rt"
version = "0.39.0"
@@ -2358,7 +3446,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.105",
+ "syn",
"synstructure",
]
@@ -2379,7 +3467,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.105",
+ "syn",
]
[[package]]
@@ -2399,7 +3487,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.105",
+ "syn",
"synstructure",
]
@@ -2408,6 +3496,20 @@ name = "zeroize"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
+dependencies = [
+ "zeroize_derive",
+]
+
+[[package]]
+name = "zeroize_derive"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
[[package]]
name = "zerotrie"
@@ -2439,5 +3541,33 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.105",
+ "syn",
+]
+
+[[package]]
+name = "zstd"
+version = "0.13.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a"
+dependencies = [
+ "zstd-safe",
+]
+
+[[package]]
+name = "zstd-safe"
+version = "7.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d"
+dependencies = [
+ "zstd-sys",
+]
+
+[[package]]
+name = "zstd-sys"
+version = "2.0.15+zstd.1.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237"
+dependencies = [
+ "cc",
+ "pkg-config",
]
diff --git a/Cargo.toml b/Cargo.toml
index 2488b08..796b7b5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,14 +1,24 @@
[package]
-name = "pds_bells_and_whistles"
+name = "pds_gatekeeper"
version = "0.1.0"
edition = "2024"
[dependencies]
-axum = { version = "0.7", features = ["macros", "json"] }
-tokio = { version = "1.39", features = ["rt-multi-thread", "macros", "signal"] }
-sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "sqlite"] }
+axum = { version = "0.8.4", features = ["macros", "json"] }
+tokio = { version = "1.47.1", features = ["rt-multi-thread", "macros", "signal"] }
+sqlx = { version = "0.8.6", features = ["runtime-tokio-rustls", "sqlite", "migrate"] }
dotenvy = "0.15.7"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] }
+hyper-util = { version = "0.1.16", features = ["client", "client-legacy"] }
+tower-http = { version = "0.6", features = ["cors", "compression-zstd"] }
+tower_governor = "0.8.0"
+hex = "0.4"
+jwt-compact = { version = "0.8.0", features = ["es256k"] }
+scrypt = "0.11"
+lettre = { version = "0.11.18", features = ["tokio1", "pool", "tokio1-native-tls"] }
+handlebars = { version = "6.3.2", features = ["rust-embed"] }
+rust-embed = "8.7.2"
+axum-template = { version = "3.0.0", features = ["handlebars"] }
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1902fc2
--- /dev/null
+++ b/README.md
@@ -0,0 +1,49 @@
+# PDS gatekeeper
+
+A microservice that sits on the same server as the PDS to add some of the security that the entryway does.
+
+
+
+PDS gatekeeper works by overriding some of the PDS endpoints inside your Caddyfile to provide gatekeeping to certain
+endpoints. Mainly, the ability to have 2FA on a self hosted PDS like it does on a Bluesky mushroom(PDS). Most of the
+logic of these endpoints still happens on the PDS via a proxied request, just some are gatekept.
+
+# Features
+
+## 2FA
+
+- [x] Ability to turn on/off 2FA
+- [x] getSession overwrite to set the `emailAuthFactor` flag if the user has 2FA turned on
+- [x] send an email using the `PDS_EMAIL_SMTP_URL` with a handlebar email template like Bluesky's 2FA sign in email.
+- [ ] generate a 2FA code
+- [ ] createSession gatekeeping (It does stop logins, just eh, doesn't actually send a real code or check it yet)
+- [ ] oauth endpoint gatekeeping
+
+## Captcha on Create Account
+
+Future feature?
+
+# Setup
+
+Nothing here yet! If you are brave enough to try before full release, let me know and I'll help you set it up.
+But I want to run it locally on my own PDS first to test run it a bit.
+
+Example Caddyfile (mostly so I don't lose it for now. Will have a better one in the future)
+
+```caddyfile
+http://localhost {
+
+ @gatekeeper {
+ path /xrpc/com.atproto.server.getSession
+ path /xrpc/com.atproto.server.updateEmail
+ path /xrpc/com.atproto.server.createSession
+ }
+
+ handle @gatekeeper {
+ reverse_proxy http://localhost:8080
+ }
+
+ reverse_proxy /* http://localhost:3000
+}
+
+```
\ No newline at end of file
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..d506869
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,5 @@
+// generated by `sqlx migrate build-script`
+fn main() {
+ // trigger recompilation when a new migration is added
+ println!("cargo:rerun-if-changed=migrations");
+}
diff --git a/email_templates/two_factor_code.hbs b/email_templates/two_factor_code.hbs
new file mode 100644
index 0000000..1e37ed3
--- /dev/null
+++ b/email_templates/two_factor_code.hbs
@@ -0,0 +1,159 @@
+
+
+
+
+
+ Sign in to Bluesky
+
+
+We received a sign-in request for the account @{{handle}}. Use the code below to sign in
+
+
+
+
+
+
+
+
+
+
+
+
+
+  |
+
+
+
+
+
+
+
+ Sign in to Bluesky
+ We received a sign-in request for the account @{{handle}}. Use the code below to sign in.
+ {{token}}
+
+ If this wasn't you, we recommend taking steps to
+ protect your account by
+ changing
+ your password.
+
+
+
+
+
+
+
+
+ |
+ Bluesky, the social internet
+ |
+  |
+
+
+
+ |
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+
+
\ No newline at end of file
diff --git a/images/gate.jpg b/images/gate.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..26830f2b9f5f40631ad98c5c855c93c1979749e7
GIT binary patch
literal 461496
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 M0_DxtO&id&BzmI~8>sjwz?`0)k)*Q8MyQ#Ue
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 ZFb
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 |