From 2dd404a95784edf04a2d2ac58d5cdc3f59f415a6 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Tue, 23 Jun 2026 15:30:19 +0000 Subject: [PATCH 01/37] Update actions/cache action to v6 --- .forgejo/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml index 3b88b05..fac13f6 100644 --- a/.forgejo/workflows/build.yml +++ b/.forgejo/workflows/build.yml @@ -20,7 +20,7 @@ jobs: submodules: recursive - name: Cache container storage - uses: actions/cache@v5 + uses: actions/cache@v6 with: path: | /var/lib/containers/storage From 2c7767124eea0770ec2e37c508255cb095fe13e7 Mon Sep 17 00:00:00 2001 From: Maple Nebel Date: Sun, 5 Jul 2026 22:13:51 +0200 Subject: [PATCH 02/37] switch to using nex-account for nex account management --- .cargo/config.toml | 5 +- Cargo.lock | 1992 +++++++++++++++++++--------------- Cargo.toml | 1 + src/nnid/people.rs | 349 +++--- src/nnid/pid_distribution.rs | 6 +- src/nnid/provider.rs | 129 +-- 6 files changed, 1390 insertions(+), 1092 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index c615b9f..cf2985e 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,2 +1,5 @@ [target.'cfg(target_arch = "x86_64")'] -rustflags = ["-C", "target-feature=+aes,+sse2"] \ No newline at end of file +rustflags = ["-C", "target-feature=+aes,+sse2"] + +[registries] +spbr = { index = "sparse+https://crates.spbr.net/api/v1/crates/" } diff --git a/Cargo.lock b/Cargo.lock index 381b6fc..5c7ba4e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,7 +6,7 @@ version = 4 name = "account" version = "0.1.0" dependencies = [ - "aes", + "aes 0.8.4", "argon2", "base64", "bcrypt", @@ -28,12 +28,13 @@ dependencies = [ "lettre", "log", "md-5", + "nex-account", "once_cell", "openssl", "p256", "prost", "quick-xml", - "rand 0.10.1", + "rand 0.10.2", "reqwest", "rocket", "rocket_cors", @@ -67,33 +68,29 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.12.1" +version = "3.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93acb4a42f64936f9b8cae4a433b237599dd6eb6ed06124eb67132ef8cc90662" +checksum = "48e2faa3e7418ed780cca54829d32782a4008a077230f67457caa063415e99c2" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", - "base64", "bitflags", "bytes", "bytestring", "derive_more", "encoding_rs", - "foldhash 0.1.4", + "foldhash 0.2.0", "futures-core", "http 0.2.12", "httparse", "httpdate", "itoa", "language-tags", - "local-channel", "mime", "percent-encoding", "pin-project-lite", - "rand 0.10.1", - "sha1", "smallvec", "tokio", "tokio-util", @@ -102,9 +99,9 @@ dependencies = [ [[package]] name = "actix-router" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +checksum = "14f8c75c51892f18d9c46150c5ac7beb81c95f78c8b83a634d49f4ca32551fe7" dependencies = [ "bytestring", "cfg-if", @@ -116,9 +113,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" +checksum = "92589714878ca59a7626ea19734f0e07a6a875197eec751bb5d3f99e64998c63" dependencies = [ "futures-core", "tokio", @@ -136,7 +133,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "socket2 0.5.8", + "socket2 0.5.10", "tokio", "tracing", ] @@ -163,9 +160,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.10.2" +version = "4.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2e3b15b3dc6c6ed996e4032389e9849d4ab002b1e92fbfe85b5f307d1479b4d" +checksum = "df09e2d9239703dd64056359c920c7f3fba6535ec61a0059e0f44e095ffe02b4" dependencies = [ "actix-codec", "actix-http", @@ -179,7 +176,7 @@ dependencies = [ "cfg-if", "derive_more", "encoding_rs", - "foldhash 0.1.4", + "foldhash 0.2.0", "futures-core", "futures-util", "impl-more", @@ -194,7 +191,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.5.8", + "socket2 0.6.4", "time", "tracing", "url", @@ -202,18 +199,18 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aes" @@ -227,10 +224,21 @@ dependencies = [ ] [[package]] -name = "aho-corasick" -version = "1.1.3" +name = "aes" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "f1fc76eaeac4c9164506c466d4ffdd8ec9d0c5bf57ee97177c4d8eceb3a0e138" +dependencies = [ + "cipher 0.5.2", + "cpubits", + "cpufeatures 0.3.0", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -250,20 +258,11 @@ dependencies = [ "libc", ] -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - [[package]] name = "anyhow" -version = "1.0.97" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "arcstr" @@ -313,9 +312,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.86" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", @@ -339,9 +338,9 @@ checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" [[package]] name = "atomic" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" +checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" dependencies = [ "bytemuck", ] @@ -354,9 +353,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "auto_enums" -version = "0.8.7" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c170965892137a3a9aeb000b4524aa3cc022a310e709d848b6e1cdce4ab4781" +checksum = "2e4487600931c9a89f8db7ffbdf3fbdd45bb7bd85e26861f659a463cd0dff966" dependencies = [ "derive_utils", "proc-macro2", @@ -366,15 +365,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.16.3" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec6fb3fe69024a75fa7e1bfb48aa6cf59706a101658ea01bfd33b2b248a038f" +checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" dependencies = [ "aws-lc-sys", "zeroize", @@ -382,21 +381,65 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.40.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50037ee5e1e41e7b8f9d161680a725bd1626cb6f8c7e901f91f942850852fe7" +checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" dependencies = [ "cc", "cmake", "dunce", "fs_extra", + "pkg-config", +] + +[[package]] +name = "axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "bytes", + "futures-util", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", ] [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -404,7 +447,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -421,9 +464,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bcrypt" @@ -433,7 +476,7 @@ checksum = "7f3c067aa24dd4ed5c79cf222a38f260c8f23d3b82a062fba3f28c6fe563b753" dependencies = [ "base64", "blowfish", - "getrandom 0.4.2", + "getrandom 0.4.3", "subtle", "zeroize", ] @@ -470,9 +513,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.11.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" dependencies = [ "serde_core", ] @@ -497,9 +540,9 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" dependencies = [ "hybrid-array", ] @@ -513,6 +556,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + [[package]] name = "blowfish" version = "0.10.0" @@ -520,29 +572,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62ce3946557b35e71d1bbe07ec385073ce9eda05043f95de134eb578fcf1a298" dependencies = [ "byteorder", - "cipher 0.5.1", + "cipher 0.5.2", ] [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytemuck" -version = "1.23.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.8.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", @@ -557,15 +609,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" [[package]] name = "bytestring" -version = "1.4.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" +checksum = "86566c496f2f47d9b8147a4c8b02ffdb69c919fe0c2b2e7195d22cbba0e635c9" dependencies = [ "bytes", ] @@ -590,9 +642,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.61" +version = "1.2.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" +checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996" dependencies = [ "find-msvc-tools", "jobserver", @@ -602,9 +654,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -614,9 +666,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chacha20" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" dependencies = [ "cfg-if", "cpufeatures 0.3.0", @@ -634,7 +686,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -643,17 +695,17 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "crypto-common 0.1.6", + "crypto-common 0.1.7", "inout 0.1.4", ] [[package]] name = "cipher" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34d8227fe1ba289043aeb13792056ff80fd6de1a9f49137a5f499de8e8c78ea" +checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c" dependencies = [ - "crypto-common 0.2.1", + "crypto-common 0.2.2", "inout 0.2.2", ] @@ -668,9 +720,9 @@ dependencies = [ [[package]] name = "cmov" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f88a43d011fc4a6876cb7344703e297c71dda42494fee094d5f7c76bf13f746" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" [[package]] name = "combine" @@ -684,9 +736,9 @@ dependencies = [ [[package]] name = "compact_str" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" +checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" dependencies = [ "castaway", "cfg-if", @@ -717,6 +769,15 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "cookie" version = "0.18.1" @@ -754,6 +815,12 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cpubits" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -774,18 +841,18 @@ dependencies = [ [[package]] name = "crc" -version = "3.2.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" [[package]] name = "crc32fast" @@ -825,9 +892,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -835,9 +902,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ "hybrid-array", ] @@ -869,9 +936,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid 0.9.6", "pem-rfc7468 0.7.0", @@ -896,30 +963,32 @@ checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" [[package]] name = "derive_more" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ "derive_more-impl", ] [[package]] name = "derive_more-impl" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ + "convert_case", "proc-macro2", "quote", + "rustc_version", "syn", "unicode-xid", ] [[package]] name = "derive_utils" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccfae181bab5ab6c5478b2ccb69e4c68a02f8c3ec72f6616bfec9dbc599d2ee0" +checksum = "362f47930db19fe7735f527e6595e4900316b893ebf6d48ad3d31be928d57dd6" dependencies = [ "proc-macro2", "quote", @@ -967,27 +1036,37 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "const-oid 0.9.6", - "crypto-common 0.1.6", + "crypto-common 0.1.7", "subtle", ] [[package]] name = "digest" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ - "block-buffer 0.12.0", + "block-buffer 0.12.1", "const-oid 0.10.2", - "crypto-common 0.2.1", + "crypto-common 0.2.2", "ctutils", ] [[package]] -name = "displaydoc" -version = "0.2.5" +name = "dispatch2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", @@ -1028,7 +1107,7 @@ version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der 0.7.9", + "der 0.7.10", "digest 0.10.7", "elliptic-curve", "rfc6979", @@ -1038,9 +1117,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" dependencies = [ "serde", ] @@ -1110,12 +1189,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -1130,9 +1209,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -1141,9 +1220,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "ff" @@ -1161,7 +1240,7 @@ version = "0.10.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" dependencies = [ - "atomic 0.6.0", + "atomic 0.6.1", "pear", "serde", "toml", @@ -1187,6 +1266,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + [[package]] name = "flume" version = "0.12.0" @@ -1206,9 +1291,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foldhash" @@ -1248,9 +1333,9 @@ checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -1358,56 +1443,54 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.13.3+wasi-0.2.2", - "wasm-bindgen", - "windows-targets 0.52.6", -] - -[[package]] -name = "getrandom" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "r-efi", - "rand_core 0.10.1", + "r-efi 5.3.0", "wasip2", - "wasip3", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", ] [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "group" @@ -1431,9 +1514,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -1450,16 +1533,16 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.8" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.2.0", + "http 1.4.2", "indexmap", "slab", "tokio", @@ -1469,11 +1552,11 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash 0.1.4", + "foldhash 0.1.5", ] [[package]] @@ -1488,10 +1571,16 @@ dependencies = [ ] [[package]] -name = "hashlink" -version = "0.11.0" +name = "hashbrown" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea0b22561a9c04a7cb1a302c013e0259cd3b4bb619f145b32f72b8b4bcbed230" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hashlink" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824e001ac4f3012dd16a264bec811403a67ca9deb6c102fc5049b32c4574b35f" dependencies = [ "hashbrown 0.16.1", ] @@ -1504,15 +1593,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -1536,7 +1619,7 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand 0.8.5", + "rand 0.8.6", "thiserror 1.0.69", "tinyvec", "tokio", @@ -1557,7 +1640,7 @@ dependencies = [ "lru-cache", "once_cell", "parking_lot", - "rand 0.8.5", + "rand 0.8.6", "resolv-conf", "smallvec", "thiserror 1.0.69", @@ -1589,18 +1672,18 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" dependencies = [ - "digest 0.11.2", + "digest 0.11.3", ] [[package]] name = "hostname" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" +checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd" dependencies = [ "cfg-if", "libc", - "windows-link 0.1.1", + "windows-link", ] [[package]] @@ -1616,12 +1699,11 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -1643,27 +1725,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http 1.4.2", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", - "http 1.2.0", + "futures-core", + "http 1.4.2", "http-body 1.0.1", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1673,10 +1755,11 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hybrid-array" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d46837a0ed51fe95bd3b05de33cd64a1ee88fc797477ca48446872504507c5" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" dependencies = [ + "bytemuck", "typenum", ] @@ -1690,14 +1773,14 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.8", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -1706,18 +1789,19 @@ dependencies = [ [[package]] name = "hyper" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", - "h2 0.4.8", - "http 1.2.0", + "h2 0.4.15", + "http 1.4.2", "http-body 1.0.1", "httparse", + "httpdate", "itoa", "pin-project-lite", "smallvec", @@ -1727,21 +1811,32 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "futures-util", - "http 1.2.0", - "hyper 1.9.0", + "http 1.4.2", + "hyper 1.10.1", "hyper-util", "rustls", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", ] +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper 1.10.1", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.6.0" @@ -1750,7 +1845,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.9.0", + "hyper 1.10.1", "hyper-util", "native-tls", "tokio", @@ -1768,14 +1863,14 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.2.0", + "http 1.4.2", "http-body 1.0.1", - "hyper 1.9.0", + "hyper 1.10.1", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.3", + "socket2 0.6.4", "system-configuration", "tokio", "tower-service", @@ -1785,14 +1880,15 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", "windows-core", ] @@ -1808,21 +1904,23 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", + "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1831,110 +1929,66 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ - "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", + "icu_locale_core", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1943,9 +1997,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -1953,19 +2007,20 @@ dependencies = [ [[package]] name = "impl-more" -version = "0.1.9" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" +checksum = "35a84fd5aa25fae5c0f4a33d9cac2ca017fc622cbd089be2229993514990f870" [[package]] name = "indexmap" -version = "2.7.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.17.1", "serde", + "serde_core", ] [[package]] @@ -1999,7 +2054,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" dependencies = [ - "socket2 0.6.3", + "socket2 0.6.4", "widestring", "windows-registry", "windows-result", @@ -2008,9 +2063,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "ipnetwork" @@ -2018,25 +2073,15 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf370abdafd54d13e54a620e8c3e1145f28e46cc9d704bc6d94414559df41763" -[[package]] -name = "iri-string" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "is-terminal" -version = "0.4.15" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ - "hermit-abi 0.4.0", + "hermit-abi", "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2050,9 +2095,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jni" @@ -2068,7 +2113,7 @@ dependencies = [ "simd_cesu8", "thiserror 2.0.18", "walkdir", - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -2105,20 +2150,22 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] @@ -2202,12 +2249,6 @@ dependencies = [ "spin", ] -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "lettre" version = "0.11.22" @@ -2227,7 +2268,7 @@ dependencies = [ "nom", "percent-encoding", "quoted_printable", - "socket2 0.6.3", + "socket2 0.6.4", "tokio", "url", ] @@ -2240,15 +2281,15 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libm" -version = "0.2.11" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libsqlite3-sys" -version = "0.30.1" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +checksum = "b1f111c8c41e7c61a49cd34e44c7619462967221a6443b0ec299e0ac30cfb9b1" dependencies = [ "pkg-config", "vcpkg", @@ -2262,26 +2303,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" - -[[package]] -name = "local-channel" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" -dependencies = [ - "futures-core", - "futures-sink", - "local-waker", -] +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "local-waker" @@ -2291,25 +2321,24 @@ checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.32" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "loom" -version = "0.5.2" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b9df80a3804094bf49bb29881d18f6f05048db72127e84e09c26fc7c2324f5" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ "cfg-if", "generator", @@ -2317,7 +2346,7 @@ dependencies = [ "serde", "serde_json", "tracing", - "tracing-subscriber 0.2.25", + "tracing-subscriber", ] [[package]] @@ -2337,13 +2366,19 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "matchers" -version = "0.0.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + [[package]] name = "md-5" version = "0.11.0" @@ -2351,14 +2386,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ "cfg-if", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] name = "memchr" -version = "2.7.4" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" [[package]] name = "mime" @@ -2368,22 +2403,22 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.61.2", ] @@ -2396,7 +2431,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http 1.2.0", + "http 1.4.2", "httparse", "memchr", "mime", @@ -2406,6 +2441,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + [[package]] name = "native-tls" version = "0.2.18" @@ -2423,6 +2464,40 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nex-account" +version = "0.2.3" +source = "sparse+https://crates.spbr.net/api/v1/crates/" +checksum = "2dd9e8b23a09bb5ab8aeb5f39ed5ed1861549e4294757c9be30eb281c4ad11d0" +dependencies = [ + "base64", + "bytemuck", + "hmac 0.13.0", + "log", + "md-5", + "prost", + "simplelog", + "spbr-common", + "sqlx", + "thiserror 2.0.18", + "tokio", + "tonic", + "tonic-prost", + "tonic-prost-build", +] + +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "nom" version = "8.0.0" @@ -2433,18 +2508,26 @@ dependencies = [ ] [[package]] -name = "num-bigint-dig" -version = "0.8.4" +name = "nu-ansi-term" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ - "byteorder", "lazy_static", "libm", "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand 0.8.6", "smallvec", "zeroize", ] @@ -2486,19 +2569,187 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", ] [[package]] -name = "object" -version = "0.36.7" +name = "num_threads" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -2542,9 +2793,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-src" -version = "300.6.0+3.6.2" +version = "300.6.1+3.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8e8cbfd3a4a8c8f089147fd7aaa33cf8c7450c4d09f8f80698a0cf093abeff4" +checksum = "46eb8fb9fb3b61ce1c0f8a026c4c1a0714d3a9e138e7fbde78753ce2babc3846" dependencies = [ "cc", ] @@ -2564,13 +2815,18 @@ dependencies = [ [[package]] name = "os_info" -version = "3.10.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a604e53c24761286860eba4e2c8b23a0161526476b1de520139d69cdb85a6b5" +checksum = "9cf20a545b305cf1da722b236b5155c9bb35f1d5ceb28c048bd96ca842f41b5b" dependencies = [ + "android_system_properties", "log", + "nix", + "objc2", + "objc2-foundation", + "objc2-ui-kit", "serde", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2599,9 +2855,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -2609,15 +2865,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -2674,15 +2930,46 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkcs8" @@ -2690,15 +2977,24 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.7.9", + "der 0.7.10", "spki", ] [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] [[package]] name = "powerfmt" @@ -2708,18 +3004,18 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] [[package]] name = "prettyplease" -version = "0.2.30" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1ccf34da56fc294e7d4ccf69a85992b7dfb826b7cf57bac6a70bba3494cc08a" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", "syn", @@ -2736,9 +3032,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -2758,19 +3054,40 @@ dependencies = [ [[package]] name = "prost" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" dependencies = [ "bytes", "prost-derive", ] [[package]] -name = "prost-derive" -version = "0.14.3" +name = "prost-build" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" +dependencies = [ + "heck", + "itertools", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "pulldown-cmark", + "pulldown-cmark-to-cmark", + "regex", + "syn", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", "itertools", @@ -2779,6 +3096,35 @@ dependencies = [ "syn", ] +[[package]] +name = "prost-types" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" +dependencies = [ + "prost", +] + +[[package]] +name = "pulldown-cmark" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e" +dependencies = [ + "bitflags", + "memchr", + "unicase", +] + +[[package]] +name = "pulldown-cmark-to-cmark" +version = "22.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90" +dependencies = [ + "pulldown-cmark", +] + [[package]] name = "quick-xml" version = "0.40.1" @@ -2791,9 +3137,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -2802,7 +3148,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.3", + "socket2 0.6.4", "thiserror 2.0.18", "tokio", "tracing", @@ -2811,15 +3157,16 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ "aws-lc-rs", "bytes", - "getrandom 0.3.1", + "getrandom 0.4.3", "lru-slab", - "rand 0.9.4", + "rand 0.10.2", + "rand_pcg", "ring", "rustc-hash", "rustls", @@ -2833,32 +3180,38 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.3", + "socket2 0.6.4", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] [[package]] name = "quoted_printable" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "640c9bd8497b02465aeef5375144c26062e0dcd5939dfcbb0f5db76cb8c17c73" +checksum = "478e0585659a122aa407eb7e3c0e1fa51b1d8a870038bd29f0cf4a8551eea972" + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "r-efi" @@ -2868,9 +3221,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -2884,17 +3237,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] name = "rand" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ "chacha20", - "getrandom 0.4.2", + "getrandom 0.4.3", "rand_core 0.10.1", ] @@ -2915,7 +3268,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -2924,16 +3277,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.4", ] [[package]] @@ -2943,28 +3296,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] -name = "redox_syscall" -version = "0.5.9" +name = "rand_pcg" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] [[package]] name = "ref-cast" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", @@ -2973,53 +3335,38 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.1.10" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] name = "regex-lite" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "reqwest" @@ -3033,11 +3380,11 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.8", - "http 1.2.0", + "h2 0.4.15", + "http 1.4.2", "http-body 1.0.1", "http-body-util", - "hyper 1.9.0", + "hyper 1.10.1", "hyper-rustls", "hyper-tls", "hyper-util", @@ -3084,13 +3431,13 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.11" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -3117,7 +3464,7 @@ dependencies = [ "num_cpus", "parking_lot", "pin-project-lite", - "rand 0.8.5", + "rand 0.8.6", "ref-cast", "rocket_codegen", "rocket_http", @@ -3197,15 +3544,15 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc_version" @@ -3218,22 +3565,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.44" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" dependencies = [ "aws-lc-rs", "once_cell", @@ -3245,9 +3592,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -3257,11 +3604,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" dependencies = [ "web-time", + "zeroize", ] [[package]] @@ -3293,9 +3641,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", @@ -3305,15 +3653,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "same-file" @@ -3352,7 +3700,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", - "der 0.7.9", + "der 0.7.10", "generic-array", "pkcs8", "subtle", @@ -3384,15 +3732,15 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "sentry" -version = "0.48.2" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "931a20b0da02350676e3d6d3c9028d58eaa448cf42a866712eec5845a505421e" +checksum = "1975064d9f3d9d87a7c8f0371f7fac10d876906ca3e39faad72e61c263ff9b87" dependencies = [ "cfg_aliases", "httpdate", @@ -3411,9 +3759,9 @@ dependencies = [ [[package]] name = "sentry-actix" -version = "0.48.2" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffb8fd78b8f4527146013ab52293e03242770a31dcd97eee4b82b7f770ffab3" +checksum = "488b43adc03f07b01563ea078c33285c5a9bbbc34d07aaa483d82922db959637" dependencies = [ "actix-http", "actix-web", @@ -3424,9 +3772,9 @@ dependencies = [ [[package]] name = "sentry-backtrace" -version = "0.48.2" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "911ee36abf5b7fa335fccd5f54361ba9c16baea5f0c3bb361a687b6c195c21cf" +checksum = "134f552b6b147f77aeee46ece875d67a8bfc1d56fe3860d78446ed4c25bb5f9f" dependencies = [ "backtrace", "regex", @@ -3435,9 +3783,9 @@ dependencies = [ [[package]] name = "sentry-contexts" -version = "0.48.2" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b9d7d469e9e22741c17ca23fb8b42d79861590eb7cf330f3da34fc1e4bc1bc6" +checksum = "98482b938fb1f31ecd23506fb7f08b2ba20d60b9cc72581b1205a9acd31d32fa" dependencies = [ "hostname", "libc", @@ -3449,9 +3797,9 @@ dependencies = [ [[package]] name = "sentry-core" -version = "0.48.2" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545dc562b6758d646ac19e1407f4ebc26d452111386743e03323464bc48bb2e0" +checksum = "7cff96247f4dc36867511d108709e703eb354143e7893319d763d2dd1edb4f48" dependencies = [ "rand 0.9.4", "sentry-types", @@ -3462,9 +3810,9 @@ dependencies = [ [[package]] name = "sentry-debug-images" -version = "0.48.2" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "660e9def38a573a869a182f7e90f58aaaa460f38b92b31fd1755ec537193bb48" +checksum = "b603a51b083141062a142d73e36391b14244b4bd0bfe28bcd80e8327bb1d7698" dependencies = [ "findshlibs", "sentry-core", @@ -3472,9 +3820,9 @@ dependencies = [ [[package]] name = "sentry-panic" -version = "0.48.2" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772d9de150c8ca910c835353c85f434457348fdd21208f9b3da3574202b1dc5d" +checksum = "61de3f4a1fc77d4c57e8bacd8ef064c26aaa88ea5b2541a761d37c7c3703b9a9" dependencies = [ "sentry-backtrace", "sentry-core", @@ -3482,22 +3830,22 @@ dependencies = [ [[package]] name = "sentry-tracing" -version = "0.48.2" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51ec9620a4d398dcdf7ee90effbf8d8691cfa24e91978bfa8565cac039d4980" +checksum = "bc59b27dae3bb495e37e6d62d252214840a2e7e1875531ee9fa2953df8985537" dependencies = [ "bitflags", "sentry-backtrace", "sentry-core", "tracing-core", - "tracing-subscriber 0.3.23", + "tracing-subscriber", ] [[package]] name = "sentry-types" -version = "0.48.2" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "041359745a44dd2e14fe21b7510fe7ca8b5beffce6636a0b52e5bc7d5f736887" +checksum = "8d7e78132ccfb4a1c777b959fb2944d1f6d5145bffe6be2a98ee6b25d244f72c" dependencies = [ "debugid", "hex", @@ -3555,9 +3903,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -3582,7 +3930,7 @@ checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", "cpufeatures 0.3.0", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -3604,7 +3952,7 @@ checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", "cpufeatures 0.3.0", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -3631,16 +3979,17 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] @@ -3671,28 +4020,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] -name = "slab" -version = "0.4.9" +name = "simplelog" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "16257adbfaef1ee58b1363bdc0664c9b8e1e30aed86049635fb5f147d065a9c0" dependencies = [ - "autocfg", + "log", + "termcolor", + "time", ] [[package]] -name = "smallvec" -version = "1.14.0" +name = "slab" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" dependencies = [ "serde", ] [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -3700,14 +4057,30 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ "libc", "windows-sys 0.61.2", ] +[[package]] +name = "spbr-common" +version = "0.1.0" +source = "sparse+https://crates.spbr.net/api/v1/crates/" +checksum = "04f4e4710d23bb730a95d00b853e304a4c1c9e86276792cd32a92057e9833452" +dependencies = [ + "aes 0.9.1", + "base64", + "bytemuck", + "hmac 0.13.0", + "hybrid-array", + "md-5", + "rand 0.10.2", + "thiserror 2.0.18", +] + [[package]] name = "spin" version = "0.9.8" @@ -3724,7 +4097,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der 0.7.9", + "der 0.7.10", ] [[package]] @@ -3827,7 +4200,7 @@ dependencies = [ "bytes", "chrono", "crc", - "digest 0.11.2", + "digest 0.11.3", "dotenvy", "either", "futures-core", @@ -3868,7 +4241,7 @@ dependencies = [ "log", "md-5", "memchr", - "rand 0.10.1", + "rand 0.10.2", "serde", "serde_json", "sha2 0.11.0", @@ -3916,9 +4289,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "state" @@ -3954,9 +4327,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.98" +version = "2.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" dependencies = [ "proc-macro2", "quote", @@ -3974,9 +4347,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -4006,16 +4379,24 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.17.1" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ - "cfg-if", "fastrand", - "getrandom 0.3.1", + "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", ] [[package]] @@ -4060,22 +4441,23 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] name = "time" -version = "0.3.49" +version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711a53c2d47bbd818258c498c8dbfe186a2526c631495cfe7e078567f86b8469" +checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" dependencies = [ "deranged", + "libc", "num-conv", + "num_threads", "powerfmt", "serde_core", "time-core", @@ -4090,9 +4472,9 @@ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.29" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71c652a3727a9cbb9a02f707f530b618ce00d0ccd762009c8c23bd191df3c17d" +checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" dependencies = [ "num-conv", "time-core", @@ -4100,9 +4482,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -4110,9 +4492,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -4135,7 +4517,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.3", + "socket2 0.6.4", "tokio-macros", "windows-sys 0.61.2", ] @@ -4163,9 +4545,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -4173,9 +4555,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -4184,9 +4566,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -4197,9 +4579,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", @@ -4209,57 +4591,136 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", + "toml_write", "winnow", ] [[package]] -name = "tower" -version = "0.5.2" +name = "toml_write" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tonic" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" +dependencies = [ + "async-trait", + "axum", + "base64", + "bytes", + "h2 0.4.15", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", + "hyper 1.10.1", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "socket2 0.6.4", + "sync_wrapper", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68f61875ac5293cf72e6c8cf0158086428c82c37229e98c840878f1706b0322" +dependencies = [ + "prettyplease", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tonic-prost" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0" +dependencies = [ + "bytes", + "prost", + "tonic", +] + +[[package]] +name = "tonic-prost-build" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "654e5643eff75d7f8c99197ce1440ed19a3474eada74c12bbac488b2cafdae27" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn", + "tempfile", + "tonic-build", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" 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.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ "bitflags", "bytes", "futures-util", - "http 1.2.0", + "http 1.4.2", "http-body 1.0.1", - "iri-string", "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -4276,9 +4737,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -4288,9 +4749,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -4309,54 +4770,31 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.4" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ "log", "once_cell", "tracing-core", ] -[[package]] -name = "tracing-serde" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" -dependencies = [ - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "ansi_term", - "chrono", - "lazy_static", - "matchers", - "regex", - "serde", - "serde_json", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", - "tracing-serde", -] - [[package]] name = "tracing-subscriber" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", "tracing-core", + "tracing-log", ] [[package]] @@ -4367,9 +4805,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.20.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ubyte" @@ -4401,9 +4839,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicase_serde" @@ -4423,24 +4861,30 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.17" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-normalization" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-xid" @@ -4478,29 +4922,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" dependencies = [ "base64", - "http 1.2.0", + "http 1.4.2", "httparse", "log", ] [[package]] name = "url" -version = "2.5.4" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", + "serde_derive", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8-zero" version = "0.8.1" @@ -4515,11 +4954,13 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.16.0" +version = "1.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53" dependencies = [ - "serde", + "js-sys", + "serde_core", + "wasm-bindgen", ] [[package]] @@ -4561,81 +5002,47 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.13.3+wasi-0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" -dependencies = [ - "wit-bindgen-rt", -] +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.3+wasi-0.2.9" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ - "wit-bindgen 0.57.1", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" 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-futures" -version = "0.4.50" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ - "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4643,65 +5050,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags", - "hashbrown 0.15.2", - "indexmap", - "semver", -] - [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -4719,9 +5092,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" dependencies = [ "rustls-pki-types", ] @@ -4780,18 +5153,38 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-targets 0.52.6", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] -name = "windows-link" -version = "0.1.1" +name = "windows-implement" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "windows-link" @@ -4805,7 +5198,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ - "windows-link 0.2.1", + "windows-link", "windows-result", "windows-strings", ] @@ -4816,7 +5209,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -4825,7 +5218,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -4837,22 +5230,13 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -4978,127 +5362,24 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.3" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" dependencies = [ "memchr", ] -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" -dependencies = [ - "bitflags", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "prettyplease", - "syn", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "yansi" @@ -5111,11 +5392,10 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -5123,9 +5403,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -5135,19 +5415,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" dependencies = [ "proc-macro2", "quote", @@ -5156,18 +5435,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -5177,15 +5456,26 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -5194,9 +5484,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index d72c1e8..a894704 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,3 +55,4 @@ dsa = "0.6.3" openssl = {version = "0.10.78", features = ["vendored"]} time = "0.3.47" hickory-resolver = { version = "0.24", features = ["tokio-runtime"] } +nex-account = { version = "0.2.3", registry = "spbr" } diff --git a/src/nnid/people.rs b/src/nnid/people.rs index 3c46925..211293a 100644 --- a/src/nnid/people.rs +++ b/src/nnid/people.rs @@ -1,31 +1,30 @@ #![allow(unused)] -use chrono::{NaiveDate, NaiveDateTime}; -use gxhash::{gxhash32, gxhash64}; -use rocket::{get, post, put, State}; -use rocket::serde::{Deserialize, Serialize}; +use crate::Pool; use crate::account::account::{Auth, User, generate_nex_password, generate_password}; use crate::dsresponse::Ds; -use crate::error::{Error, Errors}; -use crate::nnid::pid_distribution::next_pid; -use crate::nnid::timezones::{OFFSET_FROM_TIMEZONE}; -use crate::Pool; -use crate::xml::{Xml, YesNoVal}; use crate::email::send_verification_email; -use rand::prelude::*; +use crate::error::{Error, Errors}; use crate::mii_util::get_mii_img_url; +use crate::nnid::timezones::OFFSET_FROM_TIMEZONE; +use crate::xml::{Xml, YesNoVal}; +use chrono::{NaiveDate, NaiveDateTime}; +use gxhash::{gxhash32, gxhash64}; +use nex_account::grpc::{ActStageInfo, ActStageReturn}; +use nex_account::grpc_client; +use rand::prelude::*; +use rocket::serde::{Deserialize, Serialize}; +use rocket::{State, get, post, put}; -const DATABASE_ERROR: Errors = Errors{ - error: &[ - Error{ - code: "9999", - message: "Internal server error" - } - ] +const DATABASE_ERROR: Errors = Errors { + error: &[Error { + code: "9999", + message: "Internal server error", + }], }; #[derive(Deserialize)] -pub struct Email{ - address: Box +pub struct Email { + address: Box, } #[derive(Deserialize)] @@ -36,7 +35,7 @@ pub struct UpdateMiiData { } #[derive(Deserialize, Serialize)] -pub struct Mii{ +pub struct Mii { name: Box, primary: YesNoVal, data: Box, @@ -44,7 +43,7 @@ pub struct Mii{ #[derive(Deserialize)] #[serde(rename(serialize = "person"))] -pub struct AccountCreationData{ +pub struct AccountCreationData { birth_date: NaiveDate, user_id: Box, password: Box, @@ -56,24 +55,38 @@ pub struct AccountCreationData{ gender: Box, marketing_flag: YesNoVal, off_device_flag: YesNoVal, - region: i32 + region: i32, } #[derive(Serialize)] #[serde(rename(serialize = "person"))] -pub struct AccountCreationResponseData{ - pid: i32 +pub struct AccountCreationResponseData { + pid: i32, } -#[post("/v1/api/people", data="")] -pub async fn create_account(database: &State, data: Xml) -> Result, Option>>{ +#[post("/v1/api/people", data = "")] +pub async fn create_account( + database: &State, + data: Xml, +) -> Result, Option>> { let database = database.inner(); + let nex_password = generate_nex_password(); + + let mut client = grpc_client().await.expect("unable to connect to grpc"); + + let Ok(ret) = client + .stage_new_account(ActStageInfo { + password: nex_password.clone().into_bytes(), + }) + .await + else { + return Err(Some(DATABASE_ERROR)); + }; + let ActStageReturn { pid, .. } = ret.into_inner(); // its fine to crash here if we cant get the next pid as that is in my opinion a dead state // anyways as noone can register anymore, EVER - let pid = next_pid(database).await; - let verification_code: i32 = rand::rng().random_range(100_000..1_000_000); let AccountCreationData { @@ -82,14 +95,8 @@ pub async fn create_account(database: &State, data: Xml, data: Xml, data: Xml, data: Xml + validated_date: Option, } #[derive(Serialize)] -struct EmailInfoOwnOAuthProfileData{ +struct EmailInfoOwnOAuthProfileData { address: String, id: u32, parent: bool, @@ -191,40 +198,37 @@ struct EmailInfoOwnOAuthProfileData{ email_type: String, updated_by: String, validated: bool, - validated_date: Option + validated_date: Option, } #[derive(Serialize)] -struct MiiImage{ +struct MiiImage { cached_url: String, id: u32, url: String, #[serde(rename = "type")] - image_type: String -} - - -#[derive(Serialize)] -struct MiiImages{ - mii_image: MiiImage + image_type: String, } #[derive(Serialize)] -struct MiiDataOwnProfileData{ +struct MiiImages { + mii_image: MiiImage, +} + +#[derive(Serialize)] +struct MiiDataOwnProfileData { status: String, data: String, id: u32, mii_hash: String, mii_images: MiiImages, name: String, - primary: YesNoVal + primary: YesNoVal, } - - #[derive(Serialize)] #[serde(rename(serialize = "person"))] -pub struct GetOwnProfileData{ +pub struct GetOwnProfileData { active_flag: YesNoVal, birth_date: NaiveDate, country: String, @@ -246,7 +250,7 @@ pub struct GetOwnProfileData{ #[derive(Serialize)] #[serde(rename(serialize = "person"))] -pub struct GetOwnOAuthProfileData{ +pub struct GetOwnOAuthProfileData { active_flag: bool, birth_date: NaiveDate, country: String, @@ -270,17 +274,17 @@ pub struct GetOwnOAuthProfileData{ } #[get("/v1/api/people/@me/profile")] -pub fn get_own_profile(user: Auth) -> Ds>{ +pub fn get_own_profile(user: Auth) -> Ds> { Ds(Xml(build_profile(user.into()))) } #[get("/v1/api/people/@me/devices/owner")] -pub fn get_device_owner(user: Auth) -> Ds>{ +pub fn get_device_owner(user: Auth) -> Ds> { Ds(Xml(build_profile(user.into()))) } #[post("/v1/api/people/@me/devices")] -pub fn get_own_device(user: Auth) -> Ds>{ +pub fn get_own_device(user: Auth) -> Ds> { Ds(Xml(build_profile(user.into()))) } @@ -314,59 +318,58 @@ pub fn build_profile(user: User) -> GetOwnProfileData { .replace("\r", "") .replace(" ", ""); - - GetOwnProfileData { - active_flag: YesNoVal(true), - pid, - user_id: username, - gender, - birth_date: birthdate, - country, - create_date: creation_date, - tz_name: timezone, - language, - updated, - marketing_flag: YesNoVal(marketing_allowed), - email: EmailInfoOwnProfileData { - id: gxhash32(email.as_bytes(), 0), - address: email, - validated: YesNoVal(email_verified_since.is_some()), - validated_date: email_verified_since, - email_type: "DEFAULT".to_string(), - updated_by: "USER".to_string(), - reachable: YesNoVal(true), - primary: YesNoVal(true), - parent: YesNoVal(false), - }, - mii: MiiDataOwnProfileData { - id: gxhash32(mii_data.as_bytes(), 0), - mii_hash: hex::encode(bytemuck::bytes_of( - &(gxhash64(mii_data.as_bytes(), 1) & !(0x1000000000000000)) - )), - name: crate::mii_util::MiiData::read(&mii_data) + GetOwnProfileData { + active_flag: YesNoVal(true), + pid, + user_id: username, + gender, + birth_date: birthdate, + country, + create_date: creation_date, + tz_name: timezone, + language, + updated, + marketing_flag: YesNoVal(marketing_allowed), + email: EmailInfoOwnProfileData { + id: gxhash32(email.as_bytes(), 0), + address: email, + validated: YesNoVal(email_verified_since.is_some()), + validated_date: email_verified_since, + email_type: "DEFAULT".to_string(), + updated_by: "USER".to_string(), + reachable: YesNoVal(true), + primary: YesNoVal(true), + parent: YesNoVal(false), + }, + mii: MiiDataOwnProfileData { + id: gxhash32(mii_data.as_bytes(), 0), + mii_hash: hex::encode(bytemuck::bytes_of( + &(gxhash64(mii_data.as_bytes(), 1) & !(0x1000000000000000)), + )), + name: crate::mii_util::MiiData::read(&mii_data) .map(|v| v.name) .unwrap_or_else(|| "INVALID".to_string()), - primary: YesNoVal(true), - data: mii_data, - status: "COMPLETED".to_string(), - mii_images: MiiImages { - mii_image: { - let image_url = get_mii_img_url(pid, "tga"); - let url_hash = gxhash32(image_url.as_bytes(), 0); - MiiImage { - image_type: "standard".to_string(), - id: url_hash, - url: image_url.clone(), - cached_url: image_url, - } + primary: YesNoVal(true), + data: mii_data, + status: "COMPLETED".to_string(), + mii_images: MiiImages { + mii_image: { + let image_url = get_mii_img_url(pid, "tga"); + let url_hash = gxhash32(image_url.as_bytes(), 0); + MiiImage { + image_type: "standard".to_string(), + id: url_hash, + url: image_url.clone(), + cached_url: image_url, } - } + }, }, - off_device_flag: YesNoVal(off_device_allowed), - region, - utc_offset: timezone_offset, - account_level, - } + }, + off_device_flag: YesNoVal(off_device_allowed), + region, + utc_offset: timezone_offset, + account_level, + } } pub fn build_oauth_profile(user: User) -> GetOwnOAuthProfileData { @@ -404,62 +407,61 @@ pub fn build_oauth_profile(user: User) -> GetOwnOAuthProfileData { .replace("\r", "") .replace(" ", ""); - - GetOwnOAuthProfileData { - id, - sub, - uid, - active_flag: true, - pid, - user_id: username, - gender, - birth_date: birthdate, - country, - create_date: creation_date, - tz_name: timezone, - language, - updated, - marketing_flag: marketing_allowed, - email: EmailInfoOwnOAuthProfileData { - id: gxhash32(email.as_bytes(), 0), - address: email, - validated: email_verified_since.is_some(), - validated_date: email_verified_since, - email_type: "DEFAULT".to_string(), - updated_by: "USER".to_string(), - reachable: true, - primary: true, - parent: false, - }, - mii: MiiDataOwnProfileData { - id: gxhash32(mii_data.as_bytes(), 0), - mii_hash: hex::encode(bytemuck::bytes_of( - &(gxhash64(mii_data.as_bytes(), 1) & !(0x1000000000000000)) - )), - name: crate::mii_util::MiiData::read(&mii_data) + GetOwnOAuthProfileData { + id, + sub, + uid, + active_flag: true, + pid, + user_id: username, + gender, + birth_date: birthdate, + country, + create_date: creation_date, + tz_name: timezone, + language, + updated, + marketing_flag: marketing_allowed, + email: EmailInfoOwnOAuthProfileData { + id: gxhash32(email.as_bytes(), 0), + address: email, + validated: email_verified_since.is_some(), + validated_date: email_verified_since, + email_type: "DEFAULT".to_string(), + updated_by: "USER".to_string(), + reachable: true, + primary: true, + parent: false, + }, + mii: MiiDataOwnProfileData { + id: gxhash32(mii_data.as_bytes(), 0), + mii_hash: hex::encode(bytemuck::bytes_of( + &(gxhash64(mii_data.as_bytes(), 1) & !(0x1000000000000000)), + )), + name: crate::mii_util::MiiData::read(&mii_data) .map(|v| v.name) .unwrap_or_else(|| "INVALID".to_string()), - primary: YesNoVal(true), - data: mii_data, - status: "COMPLETED".to_string(), - mii_images: MiiImages { - mii_image: { - let image_url = get_mii_img_url(pid, "png"); - let url_hash = gxhash32(image_url.as_bytes(), 0); - MiiImage { - image_type: "standard".to_string(), - id: url_hash, - url: image_url.clone(), - cached_url: image_url, - } + primary: YesNoVal(true), + data: mii_data, + status: "COMPLETED".to_string(), + mii_images: MiiImages { + mii_image: { + let image_url = get_mii_img_url(pid, "png"); + let url_hash = gxhash32(image_url.as_bytes(), 0); + MiiImage { + image_type: "standard".to_string(), + id: url_hash, + url: image_url.clone(), + cached_url: image_url, } - } + }, }, - off_device_flag: off_device_allowed, - region, - utc_offset: timezone_offset, - account_level, - } + }, + off_device_flag: off_device_allowed, + region, + utc_offset: timezone_offset, + account_level, + } } #[put("/v1/api/people/@me/miis/@primary", data = "")] @@ -479,8 +481,8 @@ pub async fn change_mii( mii_data, pid ) - .execute(db) - .await; + .execute(db) + .await; if let Err(e) = result { println!("Failed to update Mii data for PID {}: {:?}", pid, e); @@ -492,8 +494,5 @@ pub async fn change_mii( Ok(()) } - #[post("/v1/api/people/@me/agreements")] -pub async fn thing(){ - -} +pub async fn thing() {} diff --git a/src/nnid/pid_distribution.rs b/src/nnid/pid_distribution.rs index eb6ad00..4e7c48b 100644 --- a/src/nnid/pid_distribution.rs +++ b/src/nnid/pid_distribution.rs @@ -1,5 +1,6 @@ +#![deprecated = "handled by nex-account now"] +/* use crate::Pool; - pub async fn next_pid(pool: &Pool) -> i32{ loop { let next_pid = sqlx::query!("SELECT nextval('pid_counter') as pid") @@ -26,4 +27,5 @@ pub async fn next_pid(pool: &Pool) -> i32{ -} \ No newline at end of file +} +*/ diff --git a/src/nnid/provider.rs b/src/nnid/provider.rs index 96809f1..088f8cb 100644 --- a/src/nnid/provider.rs +++ b/src/nnid/provider.rs @@ -1,69 +1,65 @@ -use std::net::Ipv4Addr; -use rocket::{get, State}; -use serde::Serialize; -use sqlx::types::ipnetwork::IpNetwork::V4; +use crate::Pool; use crate::account::account::Auth; use crate::error::{Error, Errors}; -use crate::nnid::oauth::generate_token::{create_token}; +use crate::nnid::oauth::generate_token::create_token; use crate::nnid::oauth::generate_token::token_type::NEX_TOKEN; -use crate::Pool; use crate::xml::Xml; +use nex_account::grpc::Pid; +use reqwest::header::SERVER; +use rocket::{State, get}; +use serde::Serialize; +use sqlx::types::ipnetwork::IpNetwork::V4; +use std::net::Ipv4Addr; -const NO_IPV4_ERROR: Errors = Errors{ - error: &[ - Error{ - code: "1022", - message: "Server is not a valid IPv4 address" - } - ] +const NO_IPV4_ERROR: Errors = Errors { + error: &[Error { + code: "1022", + message: "Server is not a valid IPv4 address", + }], }; -const SERVER_ERROR: Errors = Errors{ - error: &[ - Error{ - code: "9999", - message: "Internal Server Error" - } - ] +const SERVER_ERROR: Errors = Errors { + error: &[Error { + code: "9999", + message: "Internal Server Error", + }], }; -const NO_SERVER_ERROR: Errors = Errors{ - error: &[ - Error{ - code: "1021", - message: "The requested game server was not found" - } - ] +const NO_SERVER_ERROR: Errors = Errors { + error: &[Error { + code: "1021", + message: "The requested game server was not found", + }], }; -const MAINTENANCE_ERROR: Errors = Errors{ - error: &[ - Error{ - code: "2002", - message: "The requested game server is under maintenance" - } - ] +const MAINTENANCE_ERROR: Errors = Errors { + error: &[Error { + code: "2002", + message: "The requested game server is under maintenance", + }], }; - #[derive(Serialize)] #[serde(rename = "nex_token")] -pub struct NexToken{ +pub struct NexToken { host: Ipv4Addr, nex_password: String, pid: i32, port: u16, - token: String + token: Box, } #[derive(Serialize)] #[serde(rename = "service_token")] -pub struct ServiceToken{ - token: String +pub struct ServiceToken { + token: String, } #[get("/v1/api/provider/service_token/@me")] -pub async fn get_service_token(pool: &State, auth: Auth) -> Result, Option>>{ +pub async fn get_service_token( + pool: &State, + auth: Auth, +) -> Result, Option>> { // just gonna put this here as a side note for the future: // we could also be using key derivation to derive the nex token as if it were a key // that way we could reduce the data the database needs to store and also reduce the transfer @@ -75,17 +71,15 @@ pub async fn get_service_token(pool: &State, auth: Auth) -> R let token = create_token(pool, auth.pid, NEX_TOKEN, None).await; - Ok( - Xml( - ServiceToken{ - token - } - ) - ) + Ok(Xml(ServiceToken { token })) } #[get("/v1/api/provider/nex_token/@me?")] -pub async fn get_nex_token(pool: &State, auth: Auth, game_server_id: &str) -> Result, Option>>{ +pub async fn get_nex_token( + pool: &State, + auth: Auth, + game_server_id: &str, +) -> Result, Option>> { // just gonna put this here as a side note for the future: // we could also be using key derivation to derive the nex token as if it were a key // that way we could reduce the data the database needs to store and also reduce the transfer @@ -108,12 +102,10 @@ pub async fn get_nex_token(pool: &State, auth: Auth, game_ser Some(row) => row, None => return Err(Some(NO_SERVER_ERROR)), }; // only crash on db failure (not missing row) - - if server.maintenance_mode { - return Err(Some(MAINTENANCE_ERROR)) - } - let token = create_token(pool, auth.pid, NEX_TOKEN, None).await; + if server.maintenance_mode { + return Err(Some(MAINTENANCE_ERROR)); + } let V4(host) = server.address else { return Err(Some(NO_IPV4_ERROR)); @@ -121,15 +113,26 @@ pub async fn get_nex_token(pool: &State, auth: Auth, game_ser let host = host.ip(); - Ok( - Xml( - NexToken{ - host, - port: server.port as u16, - nex_password: auth.nex_password.clone(), - pid: auth.pid, - token - } - ) + let mut client = nex_account::grpc_client().await.unwrap(); + let Ok(key) = client.get_nex_key_by_pid(Pid { pid: auth.pid }).await else { + println!("account does not exist on nex-account server"); + return Err(Some(SERVER_ERROR)); + }; + + let token = nex_account::gen_nexact_token( + auth.pid, + key.into_inner() + .key + .try_into() + .map_err(|_| Some(SERVER_ERROR))?, ) + .expect("NEX_ACCOUNT_KEYPAIR not set"); + + Ok(Xml(NexToken { + host, + port: server.port as u16, + nex_password: auth.nex_password.clone(), + pid: auth.pid, + token, + })) } From 1576062160d1c05fb6379644e830507124b25412 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Sun, 5 Jul 2026 20:30:56 +0000 Subject: [PATCH 03/37] Update Rust crate ecdsa to 0.17.0 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index a894704..832368b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,7 +47,7 @@ lettre = "0.11.15" rand = { version = "0.10.0", features = ["std"] } reqwest = "0.13.0" binrw = "0.15.1" -ecdsa = { version = "0.16.9", features = ["pem", "std", "verifying"] } +ecdsa = { version = "0.17.0", features = ["pem", "std", "verifying"] } sha256 = "1.6.0" p256 = "0.13.2" k256 = "0.13.4" From ace476b66be6f08c48327244c0695265dd03f9aa Mon Sep 17 00:00:00 2001 From: Spacebot Date: Sun, 5 Jul 2026 20:31:12 +0000 Subject: [PATCH 04/37] Update Rust crate p256 to 0.14.0 --- Cargo.lock | 239 ++++++++++++++++++++++++++++++++++++++++++++++------- Cargo.toml | 2 +- 2 files changed, 210 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c7ba4e..3fd2810 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,7 +17,7 @@ dependencies = [ "crc32fast", "dotenvy", "dsa", - "ecdsa", + "ecdsa 0.16.9", "gxhash", "hex", "hickory-resolver", @@ -456,6 +456,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base16ct" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" + [[package]] name = "base64" version = "0.22.1" @@ -890,6 +896,22 @@ dependencies = [ "zeroize", ] +[[package]] +name = "crypto-bigint" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a52aa3fcda4e6302a9f48734f234d35d4721b96f8fe07d073f07ce9df4f0271" +dependencies = [ + "cpubits", + "ctutils", + "getrandom 0.4.3", + "hybrid-array", + "num-traits", + "rand_core 0.10.1", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.7" @@ -906,7 +928,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ + "getrandom 0.4.3", "hybrid-array", + "rand_core 0.10.1", ] [[package]] @@ -916,6 +940,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" dependencies = [ "cmov", + "subtle", ] [[package]] @@ -951,6 +976,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" dependencies = [ + "const-oid 0.10.2", "pem-rfc7468 1.0.0", "zeroize", ] @@ -1088,10 +1114,10 @@ dependencies = [ "digest 0.10.7", "num-bigint-dig", "num-traits", - "pkcs8", - "rfc6979", + "pkcs8 0.10.2", + "rfc6979 0.4.0", "sha2 0.10.9", - "signature", + "signature 2.2.0", "zeroize", ] @@ -1109,10 +1135,25 @@ checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der 0.7.10", "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "signature 2.2.0", + "spki 0.7.3", +] + +[[package]] +name = "ecdsa" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0681a4fc24c767085329728d8dfba959af91228aa4610cca4f8ce317ba46ae0" +dependencies = [ + "der 0.8.0", + "digest 0.11.3", + "elliptic-curve 0.14.1", + "rfc6979 0.6.0", + "signature 3.0.0", + "spki 0.8.0", + "zeroize", ] [[package]] @@ -1130,16 +1171,37 @@ version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "base16ct", - "crypto-bigint", + "base16ct 0.2.0", + "crypto-bigint 0.5.5", "digest 0.10.7", - "ff", + "ff 0.13.1", "generic-array", - "group", + "group 0.13.0", "pem-rfc7468 0.7.0", - "pkcs8", + "pkcs8 0.10.2", "rand_core 0.6.4", - "sec1", + "sec1 0.7.3", + "subtle", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d65aa39b3a5c1c9c1b745c9a019234bb7a21b77abcb4f4d266d706e2d577d65" +dependencies = [ + "base16ct 1.0.0", + "crypto-bigint 0.7.5", + "crypto-common 0.2.2", + "digest 0.11.3", + "ff 0.14.0", + "group 0.14.0", + "hybrid-array", + "pem-rfc7468 1.0.0", + "pkcs8 0.11.0", + "rand_core 0.10.1", + "sec1 0.8.1", "subtle", "zeroize", ] @@ -1234,6 +1296,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "ff" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f686ab92a9fb0eaf188f6c6c87b89490baa6fdb0db4544ba4dc47f7942489f" +dependencies = [ + "rand_core 0.10.1", + "subtle", +] + [[package]] name = "figment" version = "0.10.19" @@ -1498,11 +1570,22 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff", + "ff 0.13.1", "rand_core 0.6.4", "subtle", ] +[[package]] +name = "group" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4" +dependencies = [ + "ff 0.14.0", + "rand_core 0.10.1", + "subtle", +] + [[package]] name = "gxhash" version = "3.5.0" @@ -1760,7 +1843,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" dependencies = [ "bytemuck", + "subtle", "typenum", + "zeroize", ] [[package]] @@ -2227,11 +2312,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", - "ecdsa", - "elliptic-curve", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", "once_cell", "sha2 0.10.9", - "signature", + "signature 2.2.0", ] [[package]] @@ -2837,14 +2922,15 @@ checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" [[package]] name = "p256" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +checksum = "d2c9239b2dbc807adbbe147e8cf72ea7450c3a0aabe62cb8e75ff4ec22e1f72a" dependencies = [ - "ecdsa", - "elliptic-curve", + "ecdsa 0.17.0", + "elliptic-curve 0.14.1", + "primefield", "primeorder", - "sha2 0.10.9", + "sha2 0.11.0", ] [[package]] @@ -2978,7 +3064,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der 0.7.10", - "spki", + "spki 0.7.3", +] + +[[package]] +name = "pkcs8" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" +dependencies = [ + "der 0.8.0", + "spki 0.8.0", ] [[package]] @@ -3022,12 +3118,30 @@ dependencies = [ ] [[package]] -name = "primeorder" -version = "0.13.6" +name = "primefield" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +checksum = "c555a6e4eb7d4e158fcb028c835c3b8642206ddc279b5c6b202ef9a8bdb592f4" dependencies = [ - "elliptic-curve", + "crypto-bigint 0.7.5", + "crypto-common 0.2.2", + "ff 0.14.0", + "rand_core 0.10.1", + "subtle", + "zeroize", +] + +[[package]] +name = "primeorder" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c9f42978c78a00e3d68f69fc03e57a234debae69da4020a4fb588fcdcd07b06" +dependencies = [ + "elliptic-curve 0.14.1", + "once_cell", + "primefield", + "serdect", + "wnaf", ] [[package]] @@ -3429,6 +3543,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "rfc6979" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a459cddafb3fe76b31fd8f1108007566c40301feb64dc7b54656eb7388172b" +dependencies = [ + "crypto-bigint 0.7.5", + "hmac 0.13.0", +] + [[package]] name = "ring" version = "0.17.14" @@ -3699,10 +3823,24 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct", + "base16ct 0.2.0", "der 0.7.10", "generic-array", - "pkcs8", + "pkcs8 0.10.2", + "subtle", + "zeroize", +] + +[[package]] +name = "sec1" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4d" +dependencies = [ + "base16ct 1.0.0", + "ctutils", + "der 0.8.0", + "hybrid-array", "subtle", "zeroize", ] @@ -3922,6 +4060,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serdect" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" +dependencies = [ + "base16ct 1.0.0", + "serde", +] + [[package]] name = "sha1" version = "0.11.0" @@ -4003,6 +4151,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "signature" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5" +dependencies = [ + "digest 0.11.3", + "rand_core 0.10.1", +] + [[package]] name = "simd_cesu8" version = "1.1.1" @@ -4100,6 +4258,16 @@ dependencies = [ "der 0.7.10", ] +[[package]] +name = "spki" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6f" +dependencies = [ + "base64ct", + "der 0.8.0", +] + [[package]] name = "sqlx" version = "0.9.0" @@ -5375,6 +5543,17 @@ version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +[[package]] +name = "wnaf" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab12e7090f27e2ffd9322651492942d50c2926094af30601e1964337db39daf1" +dependencies = [ + "ff 0.14.0", + "group 0.14.0", + "hybrid-array", +] + [[package]] name = "writeable" version = "0.6.3" diff --git a/Cargo.toml b/Cargo.toml index a894704..8d3d115 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,7 +49,7 @@ reqwest = "0.13.0" binrw = "0.15.1" ecdsa = { version = "0.16.9", features = ["pem", "std", "verifying"] } sha256 = "1.6.0" -p256 = "0.13.2" +p256 = "0.14.0" k256 = "0.13.4" dsa = "0.6.3" openssl = {version = "0.10.78", features = ["vendored"]} From 35a3e27591ce6a4653b0b5a85317fd119a9f0ef9 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Sun, 5 Jul 2026 20:31:27 +0000 Subject: [PATCH 05/37] Update Rust crate quick-xml to 0.41.0 --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c7ba4e..3ff186b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3127,9 +3127,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.40.1" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2474bd2e5029e7ccb6abb2ba48cf2383a333851dedf495901544281590c7da7f" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" dependencies = [ "memchr", "serde", diff --git a/Cargo.toml b/Cargo.toml index a894704..6776692 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ incremental = false rocket = { version = "0.5.1", features = ["json"] } serde = { version = "1.0.218", features = ["derive"] } log = "0.4.26" -quick-xml = { version = "0.40.0", features = ["serialize"] } +quick-xml = { version = "0.41.0", features = ["serialize"] } tokio = "1.43.0" dotenvy = "0.15.7" once_cell = "1.20.3" From c47a3fb5fcb68c34998de4fecde6b9448e3ee77f Mon Sep 17 00:00:00 2001 From: Maple Nebel Date: Tue, 7 Jul 2026 08:13:42 +0200 Subject: [PATCH 06/37] fix accidentally forcing nex-accounts to be fully created before using nex provider --- Cargo.lock | 24 ++++++++++++------------ Cargo.toml | 2 +- src/nnid/provider.rs | 5 ++++- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c0a96fb..693cca8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1256,7 +1256,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -1955,7 +1955,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.4", + "socket2 0.5.10", "system-configuration", "tokio", "tower-service", @@ -2166,7 +2166,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -2551,9 +2551,9 @@ dependencies = [ [[package]] name = "nex-account" -version = "0.2.3" +version = "0.2.4" source = "sparse+https://crates.spbr.net/api/v1/crates/" -checksum = "2dd9e8b23a09bb5ab8aeb5f39ed5ed1861549e4294757c9be30eb281c4ad11d0" +checksum = "6f1cfe935e71c764dfd6bad9b23372396f785408536c0a23fba379ef405117d3" dependencies = [ "base64", "bytemuck", @@ -3262,7 +3262,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.4", + "socket2 0.5.10", "thiserror 2.0.18", "tokio", "tracing", @@ -3301,9 +3301,9 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.4", + "socket2 0.5.10", "tracing", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -3697,7 +3697,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -3754,7 +3754,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -4555,7 +4555,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -5301,7 +5301,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 7eb5c37..42135b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,4 +55,4 @@ dsa = "0.6.3" openssl = {version = "0.10.78", features = ["vendored"]} time = "0.3.47" hickory-resolver = { version = "0.24", features = ["tokio-runtime"] } -nex-account = { version = "0.2.3", registry = "spbr" } +nex-account = { version = "0.2.4", registry = "spbr" } diff --git a/src/nnid/provider.rs b/src/nnid/provider.rs index 088f8cb..850b47e 100644 --- a/src/nnid/provider.rs +++ b/src/nnid/provider.rs @@ -114,7 +114,10 @@ pub async fn get_nex_token( let host = host.ip(); let mut client = nex_account::grpc_client().await.unwrap(); - let Ok(key) = client.get_nex_key_by_pid(Pid { pid: auth.pid }).await else { + let Ok(key) = client + .get_nex_key_by_pid_maybe_staged(Pid { pid: auth.pid }) + .await + else { println!("account does not exist on nex-account server"); return Err(Some(SERVER_ERROR)); }; From f32e69be99fa47b9c6be81761b15f93e6f3f3fb8 Mon Sep 17 00:00:00 2001 From: Maple Nebel Date: Wed, 15 Jul 2026 17:37:53 +0200 Subject: [PATCH 07/37] serial --- src/account/account.rs | 24 +++-- src/json_api/oauth/generate_token.rs | 106 ++++++++++++-------- src/nnid/oauth/generate_token.rs | 139 +++++++++++++++------------ src/nnid/provider.rs | 60 +++++++++++- 4 files changed, 219 insertions(+), 110 deletions(-) diff --git a/src/account/account.rs b/src/account/account.rs index fd58a1b..41c285a 100644 --- a/src/account/account.rs +++ b/src/account/account.rs @@ -117,7 +117,10 @@ pub fn generate_password(pid: i32, cleartext_password: &str) -> Option { bcrypt::hash(password, 10).ok() } -pub async fn read_basic_auth_token(connection: &Pool, token: &str) -> Option { +pub async fn read_basic_auth_token( + connection: &Pool, + token: &str, +) -> Option<(User, Option<[u8; 32]>)> { let data = match BASE64_STANDARD.decode(&token) { Ok(d) => d, Err(e) => { @@ -161,13 +164,16 @@ pub async fn read_basic_auth_token(connection: &Pool, token: &str) -> Option Option { +pub async fn read_bearer_auth_token( + connection: &Pool, + token: &str, +) -> Option<(User, Option<[u8; 32]>)> { let data = TokenData::decode(token)?; let token_info = sqlx::query!( @@ -189,11 +195,11 @@ pub async fn read_bearer_auth_token(connection: &Pool, token: &str) -> Option String { - let mut rng = rand::rng(); + let mut rng = rand::rng(); let mut output = String::with_capacity(16); while output.len() < 16 { @@ -214,6 +220,7 @@ pub fn generate_nex_password() -> String { pub struct Auth( pub User, + pub Option<[u8; 32]>, ); impl AsRef @@ -278,6 +285,7 @@ pub async fn link_certificate_to_pid( Ok(()) } +// todo: make this more consistent by requiring a cert to be asociated to the token if USE_CERT is set #[async_trait] impl<'r, const FORCE_BEARER_AUTH: bool, const USE_CERT: bool> FromRequest<'r> for Auth @@ -297,13 +305,13 @@ impl<'r, const FORCE_BEARER_AUTH: bool, const USE_CERT: bool> FromRequest<'r> let (auth_type, token) = request_try!(auth.split_once(' ').ok_or(INVALID_TOKEN_ERRORS)); - let user = match auth_type { + let data = match auth_type { "Basic" if !FORCE_BEARER_AUTH => read_basic_auth_token(pool, token).await, "Bearer" => read_bearer_auth_token(pool, token).await, _ => return Outcome::Error((Status::BadRequest, INVALID_TOKEN_ERRORS)), }; - let Some(user) = user else { + let Some((user, cert)) = data else { return Outcome::Error((Status::BadRequest, INVALID_TOKEN_ERRORS)); }; @@ -316,7 +324,7 @@ impl<'r, const FORCE_BEARER_AUTH: bool, const USE_CERT: bool> FromRequest<'r> // ..user // }; - Outcome::Success(Self(user)) + Outcome::Success(Self(user, cert)) } } diff --git a/src/json_api/oauth/generate_token.rs b/src/json_api/oauth/generate_token.rs index 72843d7..767e374 100644 --- a/src/json_api/oauth/generate_token.rs +++ b/src/json_api/oauth/generate_token.rs @@ -1,19 +1,18 @@ use crate::Pool; -use serde::Serialize; -use rocket::FromForm; -use sha2::{Sha256, Digest}; -use bytemuck::bytes_of; -use rocket::{post, State, form::Form, http::Status, serde::json::Json}; -use sqlx::Row; -use std::env; -use once_cell::sync::Lazy; use crate::nnid::oauth::generate_token::create_token; use crate::nnid::oauth::generate_token::token_type::AUTH_TOKEN; +use bytemuck::bytes_of; use chrono::Utc; +use once_cell::sync::Lazy; +use rocket::FromForm; +use rocket::{State, form::Form, http::Status, post, serde::json::Json}; +use serde::Serialize; +use sha2::{Digest, Sha256}; +use sqlx::Row; +use std::env; -pub static CLIENT_SECRET: Lazy = Lazy::new(|| { - env::var("OAUTH_CLIENT_SECRET").expect("OAUTH_CLIENT_SECRET not set") -}); +pub static CLIENT_SECRET: Lazy = + Lazy::new(|| env::var("OAUTH_CLIENT_SECRET").expect("OAUTH_CLIENT_SECRET not set")); #[derive(Serialize)] pub struct OAuthTokenResponse { @@ -52,17 +51,18 @@ pub struct OAuthErrorResponse { #[post("/api/v2/oauth2/generate_token", data = "")] pub async fn generate_token( - pool: &State, - form_data: Form> + pool: &State, + form_data: Form>, ) -> Result, (Status, Json)> { - match form_data.client_id { Some("account") | Some("splatnet") => { let cl_secret: String = CLIENT_SECRET.clone(); if form_data.client_secret != Some(&cl_secret) { return Err(( Status::Unauthorized, - Json(OAuthErrorResponse { error: "invalid_client".to_string() }) + Json(OAuthErrorResponse { + error: "invalid_client".to_string(), + }), )); } } @@ -72,7 +72,9 @@ pub async fn generate_token( _ => { return Err(( Status::BadRequest, - Json(OAuthErrorResponse { error: "invalid_client".to_string() }) + Json(OAuthErrorResponse { + error: "invalid_client".to_string(), + }), )); } } @@ -82,23 +84,31 @@ pub async fn generate_token( "password" => { let username = form_data.username.ok_or(( Status::BadRequest, - Json(OAuthErrorResponse { error: "invalid_request".to_string() }) + Json(OAuthErrorResponse { + error: "invalid_request".to_string(), + }), ))?; let password = form_data.password.ok_or(( Status::BadRequest, - Json(OAuthErrorResponse { error: "invalid_request".to_string() }) + Json(OAuthErrorResponse { + error: "invalid_request".to_string(), + }), ))?; let user_row = match sqlx::query("SELECT pid, password FROM users WHERE username = $1") .bind(username) .fetch_optional(pool.inner()) - .await + .await { Ok(Some(row)) => row, - _ => return Err(( - Status::BadRequest, - Json(OAuthErrorResponse { error: "invalid_grant".to_string() }) - )), + _ => { + return Err(( + Status::BadRequest, + Json(OAuthErrorResponse { + error: "invalid_grant".to_string(), + }), + )); + } }; let db_pid: i32 = user_row.get("pid"); @@ -107,31 +117,39 @@ pub async fn generate_token( if !verify_nintendo_password(db_pid, password, &db_bcrypt_hash) { return Err(( Status::Unauthorized, - Json(OAuthErrorResponse { error: "invalid_grant".to_string() }) + Json(OAuthErrorResponse { + error: "invalid_grant".to_string(), + }), )); } db_pid - }, + } "authorization_code" => { let incoming_code = form_data.code.ok_or(( - Status::BadRequest, - Json(OAuthErrorResponse { error: "invalid_request".to_string() }) + Status::BadRequest, + Json(OAuthErrorResponse { + error: "invalid_request".to_string(), + }), ))?; - + let code_row = match sqlx::query( - "SELECT pid, expires_at, used FROM oauth_auth_codes WHERE code = $1" + "SELECT pid, expires_at, used FROM oauth_auth_codes WHERE code = $1", ) .bind(incoming_code) .fetch_optional(pool.inner()) .await { Ok(Some(row)) => row, - _ => return Err(( - Status::BadRequest, - Json(OAuthErrorResponse { error: "invalid_grant".to_string() }) - )), + _ => { + return Err(( + Status::BadRequest, + Json(OAuthErrorResponse { + error: "invalid_grant".to_string(), + }), + )); + } }; let is_used: bool = code_row.get("used"); @@ -140,8 +158,10 @@ pub async fn generate_token( if is_used || expires_at < Utc::now().naive_utc() { return Err(( - Status::BadRequest, - Json(OAuthErrorResponse { error: "invalid_grant".to_string() }) + Status::BadRequest, + Json(OAuthErrorResponse { + error: "invalid_grant".to_string(), + }), )); } @@ -151,15 +171,19 @@ pub async fn generate_token( .await; target_pid - }, + } - _ => return Err(( - Status::BadRequest, - Json(OAuthErrorResponse { error: "unsupported_grant_type".to_string() }) - )) + _ => { + return Err(( + Status::BadRequest, + Json(OAuthErrorResponse { + error: "unsupported_grant_type".to_string(), + }), + )); + } }; - let token = create_token(pool.inner(), pid, AUTH_TOKEN, None).await; + let token = create_token(pool.inner(), pid, AUTH_TOKEN, None, None).await; Ok(Json(OAuthTokenResponse { access_token: token, diff --git a/src/nnid/oauth/generate_token.rs b/src/nnid/oauth/generate_token.rs index a239ab3..0f16371 100644 --- a/src/nnid/oauth/generate_token.rs +++ b/src/nnid/oauth/generate_token.rs @@ -1,50 +1,43 @@ #![allow(unused)] -use rocket::{post, FromForm, State}; -use rocket::form::Form; -use serde::{Serialize}; +use crate::Pool; use crate::account::account::{Auth, DeviceCert, User, link_certificate_to_pid}; use crate::error::{Error, Errors}; use crate::nnid::agreements::{CFIP, EVIL_AGREEMENT_THING}; -use crate::nnid::oauth::generate_token::token_type::{AUTH_REFRESH_TOKEN, AUTH_TOKEN}; use crate::nnid::oauth::TokenData; -use crate::Pool; +use crate::nnid::oauth::generate_token::token_type::{AUTH_REFRESH_TOKEN, AUTH_TOKEN}; use crate::xml::Xml; +use rocket::form::Form; +use rocket::{FromForm, State, post}; +use serde::Serialize; -pub mod token_type{ +pub mod token_type { pub const AUTH_REFRESH_TOKEN: i32 = 1; pub const AUTH_TOKEN: i32 = 0; pub const NEX_TOKEN: i32 = 2; } -const ACCOUNT_ID_OR_PASSWORD_ERRORS: Errors = Errors{ - error: &[ - Error{ - code: "0106", - message: "Invalid account ID or password" - } - ] +const ACCOUNT_ID_OR_PASSWORD_ERRORS: Errors = Errors { + error: &[Error { + code: "0106", + message: "Invalid account ID or password", + }], }; -const ACCOUNT_BANNED_ERRORS: Errors = Errors{ - error: &[ - Error{ - code: "0108", - message: "Account banned from server" - } - ] +const ACCOUNT_BANNED_ERRORS: Errors = Errors { + error: &[Error { + code: "0108", + message: "Account banned from server", + }], }; - -const REREAD_EULA_EXTRABANNED_ERRORS: Errors = Errors{ - error: &[ - Error{ - code: "0109", - message: "REREAD THE EULA LOL" - } - ] +const REREAD_EULA_EXTRABANNED_ERRORS: Errors = Errors { + error: &[Error { + code: "0109", + message: "REREAD THE EULA LOL", + }], }; #[derive(FromForm)] -pub struct TokenRequestData<'a>{ +pub struct TokenRequestData<'a> { grant_type: &'a str, user_id: &'a str, password: &'a str, @@ -55,17 +48,27 @@ pub struct TokenRequestData<'a>{ pub struct TokenReturnData { token: String, refresh_token: String, - expires_in: i32 + expires_in: i32, } -pub async fn create_token(pool: &Pool, pid: i32, token_type: i32, title_id: Option<&str>) -> String{ +pub async fn create_token( + pool: &Pool, + pid: i32, + token_type: i32, + title_id: Option<&str>, + cert_hash: Option<&[u8]>, +) -> String { let data = sqlx::query!( - "insert into tokens (token_type, pid, title_id) - values ($1, $2, $3) returning token_id, random", - token_type, pid, title_id - ) - .fetch_one(pool) - .await.unwrap(); + "insert into tokens (token_type, pid, title_id, cert_hash) + values ($1, $2, $3, $4) returning token_id, random", + token_type, + pid, + title_id, + cert_hash + ) + .fetch_one(pool) + .await + .unwrap(); let token_id = data.token_id; let random = data.random; @@ -73,61 +76,79 @@ pub async fn create_token(pool: &Pool, pid: i32, token_type: i32, title_id: Opti let token = TokenData { token_id, random, - pid + pid, }; token.encode().to_string() } - impl TokenReturnData { - async fn new(pid: i32, pool: &Pool) -> Self{ - let token = create_token(pool, pid, AUTH_TOKEN, None).await; + async fn new(pid: i32, pool: &Pool) -> Self { + let token = create_token(pool, pid, AUTH_TOKEN, None, None).await; - let refresh_token = create_token(pool, pid, AUTH_REFRESH_TOKEN, None).await; + let refresh_token = create_token(pool, pid, AUTH_REFRESH_TOKEN, None, None).await; - Self{ + Self { token, refresh_token, - expires_in: 3600 + expires_in: 3600, + } + } + async fn new_with_cert(pid: i32, cert: Option<&[u8]>, pool: &Pool) -> Self { + let token = create_token(pool, pid, AUTH_TOKEN, None, None).await; + + let refresh_token = create_token(pool, pid, AUTH_REFRESH_TOKEN, None, None).await; + + Self { + token, + refresh_token, + expires_in: 3600, } } } #[derive(Serialize)] -#[serde(rename="OAuth20")] -pub struct TokenRequestReturnData{ - access_token: TokenReturnData +#[serde(rename = "OAuth20")] +pub struct TokenRequestReturnData { + access_token: TokenReturnData, } -#[post("/v1/api/oauth20/access_token/generate", data="")] -pub async fn generate_token(pool: &State, data: Form>, ip: CFIP, cert: DeviceCert) -> Result, Option>>{ +#[post("/v1/api/oauth20/access_token/generate", data = "")] +pub async fn generate_token( + pool: &State, + data: Form>, + ip: CFIP, + cert: DeviceCert, +) -> Result, Option>> { let pool = pool.inner(); - let user = User::get_by_username(data.user_id, pool).await + let user = User::get_by_username(data.user_id, pool) + .await .ok_or(Some(ACCOUNT_ID_OR_PASSWORD_ERRORS))?; - if !user.verify_hashed_password(&data.password).is_some_and(|v| v){ + if !user + .verify_hashed_password(&data.password) + .is_some_and(|v| v) + { return Err(Some(ACCOUNT_ID_OR_PASSWORD_ERRORS)); } - if user.account_level < 0{ + if user.account_level < 0 { if user.account_level == -2 { return Err(Some(REREAD_EULA_EXTRABANNED_ERRORS)); } - if user.account_level == -3{ + if user.account_level == -3 { EVIL_AGREEMENT_THING.write().await.insert(ip.0); return Err(Some(REREAD_EULA_EXTRABANNED_ERRORS)); } return Err(Some(ACCOUNT_BANNED_ERRORS)); } - + link_certificate_to_pid(&pool, &cert.0, user.pid).await?; - let access_token = TokenReturnData::new(user.pid, pool).await; + let access_token = + TokenReturnData::new_with_cert(user.pid, Some(&cert.0.hash()[..]), pool).await; - Ok(Xml(TokenRequestReturnData{ - access_token - })) -} \ No newline at end of file + Ok(Xml(TokenRequestReturnData { access_token })) +} diff --git a/src/nnid/provider.rs b/src/nnid/provider.rs index 850b47e..bbe41d5 100644 --- a/src/nnid/provider.rs +++ b/src/nnid/provider.rs @@ -4,10 +4,14 @@ use crate::error::{Error, Errors}; use crate::nnid::oauth::generate_token::create_token; use crate::nnid::oauth::generate_token::token_type::NEX_TOKEN; use crate::xml::Xml; +use log::{info, warn}; use nex_account::grpc::Pid; use reqwest::header::SERVER; -use rocket::{State, get}; +use rocket::http::Status; +use rocket::request::{FromRequest, Outcome, Request}; +use rocket::{State, async_trait, get}; use serde::Serialize; +use sqlx::query; use sqlx::types::ipnetwork::IpNetwork::V4; use std::net::Ipv4Addr; @@ -55,10 +59,52 @@ pub struct ServiceToken { token: String, } +pub async fn store_or_check_serial(pool: &Pool, serial: &str, cert_hash: [u8; 32]) -> bool { + let Ok(res) = query!( + "select serial from certificates where hash = $1", + &cert_hash[..] + ) + .fetch_one(pool) + .await + else { + warn!( + "user tried to access a route which is locked behind a console asociated token without a console token" + ); + return false; + }; + + let Some(stored_serial) = res.serial else { + query!( + "update certificates set serial = $1 where hash = $2", + serial, + &cert_hash[..] + ); + return true; + }; + + serial == stored_serial +} + +struct Serial(String); + +#[async_trait] +impl<'r> FromRequest<'r> for Serial { + type Error = Errors<'static>; + async fn from_request(request: &'r Request<'_>) -> Outcome { + let Some(header) = request.headers().get("X-Nintendo-Serial-Number").next() else { + warn!("serial number wasnt sent on request which expected a serial number"); + return Outcome::Error((Status::BadRequest, SERVER_ERROR)); + }; + + Outcome::Success(Self(header.to_owned())) + } +} + #[get("/v1/api/provider/service_token/@me")] pub async fn get_service_token( pool: &State, auth: Auth, + serial: Serial, ) -> Result, Option>> { // just gonna put this here as a side note for the future: // we could also be using key derivation to derive the nex token as if it were a key @@ -69,7 +115,17 @@ pub async fn get_service_token( let pool = pool.inner(); - let token = create_token(pool, auth.pid, NEX_TOKEN, None).await; + let Some(cert_hash) = auth.1 else { + info!("attempt to generate service token using non wii u/certificate token"); + return Err(Some(SERVER_ERROR)); + }; + + if !store_or_check_serial(pool, &serial.0, cert_hash).await { + info!("serial mismatched with certificate"); + return Err(Some(SERVER_ERROR)); + } + + let token = create_token(pool, auth.pid, NEX_TOKEN, None, Some(&cert_hash[..])).await; Ok(Xml(ServiceToken { token })) } From 9bf06fffd694f3349027ebbedbc0a85c1042e23d Mon Sep 17 00:00:00 2001 From: red binder Date: Thu, 16 Jul 2026 02:06:51 +0200 Subject: [PATCH 08/37] serial number and cert hash route --- ...d9d3e1961530ae963f9ab5442482d81228590.json | 28 +++++++++++++ ...c1c262351465b6f102e98912f67442a1f54d9.json | 21 ---------- ...604095f71324011e7093ec37af15da8c158f4.json | 14 ++++++- ...66fc2a97ac6e25a9733d1d20faf555c67abe1.json | 14 ++++++- ...8c840f66eec4e5458d3709c0e0f09afe51377.json | 15 +++++++ ...d15f9e4bafdfca12d2130a873d44a88dd435b.json | 23 ----------- ...4dc5cd7ae99fac34ae16023f9a6a701857c9.json} | 7 ++-- src/json_api/admin/bans.rs | 6 +-- src/json_api/users/console.rs | 40 +++++++++++++++++++ src/json_api/users/mod.rs | 3 +- src/main.rs | 1 + src/nnid/provider.rs | 9 +++-- 12 files changed, 122 insertions(+), 59 deletions(-) create mode 100644 .sqlx/query-0ef5f08a84d6864291cb6125610d9d3e1961530ae963f9ab5442482d81228590.json delete mode 100644 .sqlx/query-3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9.json create mode 100644 .sqlx/query-beeeea07993ba8daac1e43c985e8c840f66eec4e5458d3709c0e0f09afe51377.json delete mode 100644 .sqlx/query-c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b.json rename .sqlx/{query-e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2.json => query-d8298703381f0e220bdbe122dbdc4dc5cd7ae99fac34ae16023f9a6a701857c9.json} (72%) create mode 100644 src/json_api/users/console.rs diff --git a/.sqlx/query-0ef5f08a84d6864291cb6125610d9d3e1961530ae963f9ab5442482d81228590.json b/.sqlx/query-0ef5f08a84d6864291cb6125610d9d3e1961530ae963f9ab5442482d81228590.json new file mode 100644 index 0000000..64e253e --- /dev/null +++ b/.sqlx/query-0ef5f08a84d6864291cb6125610d9d3e1961530ae963f9ab5442482d81228590.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "select serial from certificates where hash = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "serial", + "type_info": "Varchar", + "origin": { + "Table": { + "table": "certificates", + "name": "serial" + } + } + } + ], + "parameters": { + "Left": [ + "Bytea" + ] + }, + "nullable": [ + true + ] + }, + "hash": "0ef5f08a84d6864291cb6125610d9d3e1961530ae963f9ab5442482d81228590" +} diff --git a/.sqlx/query-3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9.json b/.sqlx/query-3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9.json deleted file mode 100644 index 9607895..0000000 --- a/.sqlx/query-3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT nextval('pid_counter') as pid", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "pid", - "type_info": "Int8", - "origin": "Expression" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - null - ] - }, - "hash": "3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9" -} diff --git a/.sqlx/query-48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4.json b/.sqlx/query-48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4.json index 88cc28a..96c9316 100644 --- a/.sqlx/query-48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4.json +++ b/.sqlx/query-48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4.json @@ -68,6 +68,17 @@ "name": "expires" } } + }, + { + "ordinal": 6, + "name": "cert_hash", + "type_info": "Bytea", + "origin": { + "Table": { + "table": "tokens", + "name": "cert_hash" + } + } } ], "parameters": { @@ -83,7 +94,8 @@ false, false, true, - false + false, + true ] }, "hash": "48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4" diff --git a/.sqlx/query-9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1.json b/.sqlx/query-9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1.json index b5366a8..fd3faba 100644 --- a/.sqlx/query-9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1.json +++ b/.sqlx/query-9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1.json @@ -68,6 +68,17 @@ "name": "expires" } } + }, + { + "ordinal": 6, + "name": "cert_hash", + "type_info": "Bytea", + "origin": { + "Table": { + "table": "tokens", + "name": "cert_hash" + } + } } ], "parameters": { @@ -83,7 +94,8 @@ false, false, true, - false + false, + true ] }, "hash": "9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1" diff --git a/.sqlx/query-beeeea07993ba8daac1e43c985e8c840f66eec4e5458d3709c0e0f09afe51377.json b/.sqlx/query-beeeea07993ba8daac1e43c985e8c840f66eec4e5458d3709c0e0f09afe51377.json new file mode 100644 index 0000000..9d62095 --- /dev/null +++ b/.sqlx/query-beeeea07993ba8daac1e43c985e8c840f66eec4e5458d3709c0e0f09afe51377.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "update certificates set serial = $1 where hash = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Bytea" + ] + }, + "nullable": [] + }, + "hash": "beeeea07993ba8daac1e43c985e8c840f66eec4e5458d3709c0e0f09afe51377" +} diff --git a/.sqlx/query-c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b.json b/.sqlx/query-c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b.json deleted file mode 100644 index 103f7d7..0000000 --- a/.sqlx/query-c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT EXISTS(select 1 from users where pid = $1)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool", - "origin": "Expression" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - null - ] - }, - "hash": "c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b" -} diff --git a/.sqlx/query-e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2.json b/.sqlx/query-d8298703381f0e220bdbe122dbdc4dc5cd7ae99fac34ae16023f9a6a701857c9.json similarity index 72% rename from .sqlx/query-e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2.json rename to .sqlx/query-d8298703381f0e220bdbe122dbdc4dc5cd7ae99fac34ae16023f9a6a701857c9.json index c190306..d7473a0 100644 --- a/.sqlx/query-e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2.json +++ b/.sqlx/query-d8298703381f0e220bdbe122dbdc4dc5cd7ae99fac34ae16023f9a6a701857c9.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "insert into tokens (token_type, pid, title_id)\n values ($1, $2, $3) returning token_id, random", + "query": "insert into tokens (token_type, pid, title_id, cert_hash)\n values ($1, $2, $3, $4) returning token_id, random", "describe": { "columns": [ { @@ -30,7 +30,8 @@ "Left": [ "Int4", "Int4", - "Varchar" + "Varchar", + "Bytea" ] }, "nullable": [ @@ -38,5 +39,5 @@ false ] }, - "hash": "e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2" + "hash": "d8298703381f0e220bdbe122dbdc4dc5cd7ae99fac34ae16023f9a6a701857c9" } diff --git a/src/json_api/admin/bans.rs b/src/json_api/admin/bans.rs index 94ebef5..fa211c6 100644 --- a/src/json_api/admin/bans.rs +++ b/src/json_api/admin/bans.rs @@ -1,11 +1,7 @@ -use rocket::serde::json::Json; use rocket::{post, FromForm, State}; use rocket::form::Form; -use rocket::futures::TryFutureExt; use rocket::http::Status; use crate::account::account::Auth; -use crate::json_api::oauth::generate_token::TokenRequest; -use crate::nnid::people::{build_oauth_profile, GetOwnOAuthProfileData}; use crate::Pool; #[derive(FromForm)] @@ -21,7 +17,7 @@ pub async fn ban_user(pool: &State, auth: Auth, request: Form, auth: Auth) -> Result, (Status, &'static str)> { + let hash = auth.1.ok_or((Status::BadRequest, "token needs cert hash"))?; + + let row = sqlx::query!( + "select serial from certificates where hash = $1", + &hash[..] + ) + .fetch_one(pool.inner()) + .await + .map_err(|e| { + log::error!("failed to execute query: {:?}", e); + (Status::InternalServerError, "error in database query") + })?; + + let hex_hash = hex::encode(hash); + let serial = row.serial.ok_or((Status::BadRequest, "we had no serial"))?; + + Ok( + Json ( + ConsoleData { + serial, + cert_hash: hex_hash + } + ) + ) +} \ No newline at end of file diff --git a/src/json_api/users/mod.rs b/src/json_api/users/mod.rs index b284f7e..a71fca3 100644 --- a/src/json_api/users/mod.rs +++ b/src/json_api/users/mod.rs @@ -1,3 +1,4 @@ pub mod profile; pub mod mii; -pub mod delete; \ No newline at end of file +pub mod delete; +pub mod console; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 35a48df..1ad5ca5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -119,6 +119,7 @@ async fn launch() -> _ { json_api::oauth::authorize::authorize_page, json_api::oauth::authorize::authorize_submit, json_api::admin::bans::ban_user, + json_api::users::console::get_own_console, nnid::people::thing, // graphql::graphiql, // graphql::playground, diff --git a/src/nnid/provider.rs b/src/nnid/provider.rs index bbe41d5..316d003 100644 --- a/src/nnid/provider.rs +++ b/src/nnid/provider.rs @@ -6,7 +6,6 @@ use crate::nnid::oauth::generate_token::token_type::NEX_TOKEN; use crate::xml::Xml; use log::{info, warn}; use nex_account::grpc::Pid; -use reqwest::header::SERVER; use rocket::http::Status; use rocket::request::{FromRequest, Outcome, Request}; use rocket::{State, async_trait, get}; @@ -74,18 +73,20 @@ pub async fn store_or_check_serial(pool: &Pool, serial: &str, cert_hash: [u8; 32 }; let Some(stored_serial) = res.serial else { - query!( + let _row = query!( "update certificates set serial = $1 where hash = $2", serial, &cert_hash[..] - ); + ).execute(pool) + .await + .ok(); return true; }; serial == stored_serial } -struct Serial(String); +pub struct Serial(pub String); #[async_trait] impl<'r> FromRequest<'r> for Serial { From 19505b43484e6d586bfa32d141166521e12dfda7 Mon Sep 17 00:00:00 2001 From: Maple Nebel Date: Thu, 16 Jul 2026 03:40:05 +0200 Subject: [PATCH 09/37] actually asociate cert hash with token --- src/nnid/oauth/generate_token.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nnid/oauth/generate_token.rs b/src/nnid/oauth/generate_token.rs index 0f16371..9383359 100644 --- a/src/nnid/oauth/generate_token.rs +++ b/src/nnid/oauth/generate_token.rs @@ -97,7 +97,7 @@ impl TokenReturnData { async fn new_with_cert(pid: i32, cert: Option<&[u8]>, pool: &Pool) -> Self { let token = create_token(pool, pid, AUTH_TOKEN, None, None).await; - let refresh_token = create_token(pool, pid, AUTH_REFRESH_TOKEN, None, None).await; + let refresh_token = create_token(pool, pid, AUTH_REFRESH_TOKEN, None, cert).await; Self { token, From 51602061472141fb383cc4da309b305c71ca235f Mon Sep 17 00:00:00 2001 From: Maple Nebel Date: Thu, 16 Jul 2026 03:54:06 +0200 Subject: [PATCH 10/37] actually actually asociate cert hash with token --- src/nnid/oauth/generate_token.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nnid/oauth/generate_token.rs b/src/nnid/oauth/generate_token.rs index 9383359..012627f 100644 --- a/src/nnid/oauth/generate_token.rs +++ b/src/nnid/oauth/generate_token.rs @@ -95,7 +95,7 @@ impl TokenReturnData { } } async fn new_with_cert(pid: i32, cert: Option<&[u8]>, pool: &Pool) -> Self { - let token = create_token(pool, pid, AUTH_TOKEN, None, None).await; + let token = create_token(pool, pid, AUTH_TOKEN, None, cert).await; let refresh_token = create_token(pool, pid, AUTH_REFRESH_TOKEN, None, cert).await; From 9037439d9eb7262db812f06157f2495904dfe9c1 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Sat, 18 Jul 2026 23:45:29 +0000 Subject: [PATCH 11/37] Update Rust crate serde to v1.0.229 --- Cargo.lock | 101 +++++++++++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 45 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 693cca8..315053b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -307,7 +307,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -318,7 +318,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -360,7 +360,7 @@ dependencies = [ "derive_utils", "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -514,7 +514,7 @@ dependencies = [ "owo-colors", "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -604,7 +604,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -1006,7 +1006,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn", + "syn 2.0.118", "unicode-xid", ] @@ -1018,7 +1018,7 @@ checksum = "362f47930db19fe7735f527e6595e4900316b893ebf6d48ad3d31be928d57dd6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -1051,7 +1051,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -1096,7 +1096,7 @@ checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -1240,7 +1240,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -2211,7 +2211,7 @@ dependencies = [ "quote", "rustc_version", "simd_cesu8", - "syn", + "syn 2.0.118", ] [[package]] @@ -2230,7 +2230,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -2285,7 +2285,7 @@ dependencies = [ "derive_more", "proc-macro2", "quote", - "syn", + "syn 2.0.118", "url", ] @@ -2867,7 +2867,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -2993,7 +2993,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -3048,7 +3048,7 @@ checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -3114,7 +3114,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.118", ] [[package]] @@ -3161,7 +3161,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", "version_check", "yansi", ] @@ -3193,7 +3193,7 @@ dependencies = [ "pulldown-cmark", "pulldown-cmark-to-cmark", "regex", - "syn", + "syn 2.0.118", "tempfile", ] @@ -3207,7 +3207,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -3444,7 +3444,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -3617,7 +3617,7 @@ dependencies = [ "proc-macro2", "quote", "rocket_http", - "syn", + "syn 2.0.118", "unicode-xid", "version_check", ] @@ -3998,9 +3998,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -4008,22 +4008,22 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.0", ] [[package]] @@ -4328,7 +4328,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn", + "syn 2.0.118", ] [[package]] @@ -4351,7 +4351,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn", + "syn 2.0.118", "thiserror 2.0.18", "tokio", "url", @@ -4504,6 +4504,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fac314a64dc9a36e61a9eb4261a5e9bbfbc922b27e518af97bc32b926cf967" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "sync_wrapper" version = "1.0.2" @@ -4521,7 +4532,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -4593,7 +4604,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -4604,7 +4615,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -4698,7 +4709,7 @@ checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -4824,7 +4835,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -4849,7 +4860,7 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn", + "syn 2.0.118", "tempfile", "tonic-build", ] @@ -4923,7 +4934,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -5225,7 +5236,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.118", "wasm-bindgen-shared", ] @@ -5340,7 +5351,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -5351,7 +5362,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -5588,7 +5599,7 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", "synstructure", ] @@ -5609,7 +5620,7 @@ checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -5629,7 +5640,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", "synstructure", ] @@ -5669,7 +5680,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] From 4621679bf5f3180964b4e36961f142942e6d15df Mon Sep 17 00:00:00 2001 From: Spacebot Date: Sun, 19 Jul 2026 19:45:35 +0000 Subject: [PATCH 12/37] Update Rust crate bytemuck to v1.25.2 --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 693cca8..8586d5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -589,9 +589,9 @@ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytemuck" -version = "1.25.0" +version = "1.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" dependencies = [ "bytemuck_derive", ] From f2a5997dab30723c34dd33a5473a7ada1a66ad55 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Mon, 20 Jul 2026 06:15:34 +0000 Subject: [PATCH 13/37] Update Rust crate serde_json to v1.0.151 --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 693cca8..b48b3b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4028,9 +4028,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", From 08146a3604d4a6c99604be8a2999c1653c6d7379 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Mon, 20 Jul 2026 08:45:40 +0000 Subject: [PATCH 14/37] Update Rust crate time to v0.3.54 --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 693cca8..f9e6e47 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4618,9 +4618,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.53" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" dependencies = [ "deranged", "libc", @@ -4640,9 +4640,9 @@ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.31" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", From 44b380e6c1e0127c69b4facf6202e8ec5dbdaf67 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Mon, 20 Jul 2026 17:45:57 +0000 Subject: [PATCH 15/37] Update Rust crate tokio to v1.53.1 --- Cargo.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 693cca8..a29ebb1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1256,7 +1256,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2166,7 +2166,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3303,7 +3303,7 @@ dependencies = [ "once_cell", "socket2 0.5.10", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3697,7 +3697,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3754,7 +3754,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -4555,7 +4555,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -4675,9 +4675,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.3" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -5301,7 +5301,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] From 08a789bd643e0fe3fb9ef71853cf716b95f49ea7 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Tue, 28 Jul 2026 13:55:06 +0000 Subject: [PATCH 16/37] Update Rust crate dsa to 0.7.0 --- Cargo.lock | 96 ++++++++++++++++++------------------------------------ Cargo.toml | 2 +- 2 files changed, 33 insertions(+), 65 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 693cca8..1f0dc7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -908,6 +908,7 @@ dependencies = [ "hybrid-array", "num-traits", "rand_core 0.10.1", + "serdect", "subtle", "zeroize", ] @@ -933,6 +934,16 @@ dependencies = [ "rand_core 0.10.1", ] +[[package]] +name = "crypto-primes" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3633a51a39c69ebbaa4feaa694bd83d241e4093901c84a0963b19d9bb3f0cf8f" +dependencies = [ + "crypto-bigint 0.7.5", + "rand_core 0.10.1", +] + [[package]] name = "ctutils" version = "0.4.2" @@ -1107,17 +1118,19 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "dsa" -version = "0.6.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48bc224a9084ad760195584ce5abb3c2c34a225fa312a128ad245a6b412b7689" +checksum = "5c8573b60d07b5b5cecadc1f978c9b71d5504151e703cbb0439ee4ad301338f3" dependencies = [ - "digest 0.10.7", - "num-bigint-dig", - "num-traits", - "pkcs8 0.10.2", - "rfc6979 0.4.0", - "sha2 0.10.9", - "signature 2.2.0", + "crypto-bigint 0.7.5", + "crypto-common 0.2.2", + "crypto-primes", + "der 0.8.0", + "digest 0.11.3", + "pkcs8 0.11.0", + "rfc6979 0.6.0", + "sha2 0.11.0", + "signature 3.0.0", "zeroize", ] @@ -1256,7 +1269,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -1955,7 +1968,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.6.4", "system-configuration", "tokio", "tower-service", @@ -2166,7 +2179,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2330,9 +2343,6 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] [[package]] name = "lettre" @@ -2364,12 +2374,6 @@ version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - [[package]] name = "libsqlite3-sys" version = "0.37.0" @@ -2601,48 +2605,12 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "num-bigint-dig" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" -dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.6", - "smallvec", - "zeroize", -] - [[package]] name = "num-conv" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -3262,7 +3230,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.5.10", + "socket2 0.6.4", "thiserror 2.0.18", "tokio", "tracing", @@ -3301,9 +3269,9 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.4", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3697,7 +3665,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3754,7 +3722,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -4555,7 +4523,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -5301,7 +5269,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 42135b7..33d5270 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -51,7 +51,7 @@ ecdsa = { version = "0.16.9", features = ["pem", "std", "verifying"] } sha256 = "1.6.0" p256 = "0.14.0" k256 = "0.13.4" -dsa = "0.6.3" +dsa = "0.7.0" openssl = {version = "0.10.78", features = ["vendored"]} time = "0.3.47" hickory-resolver = { version = "0.24", features = ["tokio-runtime"] } From 9b7d7928a3bb4854902f98c19b6c6a324d42fcc5 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 29 Jul 2026 11:16:02 +0000 Subject: [PATCH 17/37] Update Rust crate sentry to 0.49.0 --- Cargo.lock | 70 ++++++++++++++++++++++++++++++++---------------------- Cargo.toml | 2 +- 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 693cca8..46294e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1256,7 +1256,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -1955,7 +1955,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.6.4", "system-configuration", "tokio", "tower-service", @@ -2166,7 +2166,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3262,7 +3262,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.5.10", + "socket2 0.6.4", "thiserror 2.0.18", "tokio", "tracing", @@ -3301,9 +3301,9 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.4", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3697,7 +3697,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3754,7 +3754,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3876,9 +3876,9 @@ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "sentry" -version = "0.48.3" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1975064d9f3d9d87a7c8f0371f7fac10d876906ca3e39faad72e61c263ff9b87" +checksum = "d91e4790d8c2f43a6645ee2cb12aac2db79221fddd035b94c8166b88ea094408" dependencies = [ "cfg_aliases", "httpdate", @@ -3889,6 +3889,7 @@ dependencies = [ "sentry-contexts", "sentry-core", "sentry-debug-images", + "sentry-log", "sentry-panic", "sentry-tracing", "tokio", @@ -3897,9 +3898,9 @@ dependencies = [ [[package]] name = "sentry-actix" -version = "0.48.3" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488b43adc03f07b01563ea078c33285c5a9bbbc34d07aaa483d82922db959637" +checksum = "5a12b26925e70eba6c346588650f8b346d9e78a83249970b706068456005cd61" dependencies = [ "actix-http", "actix-web", @@ -3910,9 +3911,9 @@ dependencies = [ [[package]] name = "sentry-backtrace" -version = "0.48.3" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134f552b6b147f77aeee46ece875d67a8bfc1d56fe3860d78446ed4c25bb5f9f" +checksum = "326e106874a7ea90636f1ca42e2f7b912929d29307982cab37f81208c16cf043" dependencies = [ "backtrace", "regex", @@ -3921,9 +3922,9 @@ dependencies = [ [[package]] name = "sentry-contexts" -version = "0.48.3" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98482b938fb1f31ecd23506fb7f08b2ba20d60b9cc72581b1205a9acd31d32fa" +checksum = "3ab62ebc8076326e509c71a7424d2aaeff63fba9bc4e5b55074cd33f356c759f" dependencies = [ "hostname", "libc", @@ -3935,9 +3936,9 @@ dependencies = [ [[package]] name = "sentry-core" -version = "0.48.3" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cff96247f4dc36867511d108709e703eb354143e7893319d763d2dd1edb4f48" +checksum = "2f9efafefbb78d7e02cb06c10aec08b77e7500428389eabbf6d5a668325265e8" dependencies = [ "rand 0.9.4", "sentry-types", @@ -3948,19 +3949,30 @@ dependencies = [ [[package]] name = "sentry-debug-images" -version = "0.48.3" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b603a51b083141062a142d73e36391b14244b4bd0bfe28bcd80e8327bb1d7698" +checksum = "cee1e7c19e715ae9538114bbd09c2442689a481e2adbc8245c9e06b20d2bd2be" dependencies = [ "findshlibs", "sentry-core", ] [[package]] -name = "sentry-panic" -version = "0.48.3" +name = "sentry-log" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61de3f4a1fc77d4c57e8bacd8ef064c26aaa88ea5b2541a761d37c7c3703b9a9" +checksum = "ba08897af468a109afafba1f00c25d40070ef76309759833cccb83151a5be73d" +dependencies = [ + "bitflags", + "log", + "sentry-core", +] + +[[package]] +name = "sentry-panic" +version = "0.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fc536a3e1fc68d626ae8dd18b628cafd474d9d36fea74e4bbb4d038877f003" dependencies = [ "sentry-backtrace", "sentry-core", @@ -3968,9 +3980,9 @@ dependencies = [ [[package]] name = "sentry-tracing" -version = "0.48.3" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc59b27dae3bb495e37e6d62d252214840a2e7e1875531ee9fa2953df8985537" +checksum = "96be2253fe14b3fa10c1ba047af2d3e58ce85c8cb297bbd19d6fa81b604e7877" dependencies = [ "bitflags", "sentry-backtrace", @@ -3981,9 +3993,9 @@ dependencies = [ [[package]] name = "sentry-types" -version = "0.48.3" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d7e78132ccfb4a1c777b959fb2944d1f6d5145bffe6be2a98ee6b25d244f72c" +checksum = "f967748632cd4c5405dbed45426b27b407c0e53ac59b7df1c163e7f5aa57a77c" dependencies = [ "debugid", "hex", @@ -4555,7 +4567,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -5301,7 +5313,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 42135b7..b629b91 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ md-5 = "0.11.0" cbc = "0.1.2" crc32fast = "1.4.2" gxhash = "3.4.1" -sentry = "0.48.0" +sentry = "0.49.0" rocket_cors = "0.6.0" juniper = { version = "0.17.0", features = ["chrono"] } From 02a4b2b50420633b999bcc9e492f80c8fd431ff2 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 29 Jul 2026 14:00:54 +0000 Subject: [PATCH 18/37] Update Rust crate binrw to v0.15.2 --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 394b1a7..77ba662 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -495,9 +495,9 @@ checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" [[package]] name = "binrw" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53195f985e88ab94d1cc87e80049dd2929fd39e4a772c5ae96a7e5c4aad3642" +checksum = "6ad120d555272286c1017d25165ab8bd74806f13fc85b258484ec7e4ce75458f" dependencies = [ "array-init", "binrw_derive", @@ -506,9 +506,9 @@ dependencies = [ [[package]] name = "binrw_derive" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5910da05ee556b789032c8ff5a61fb99239580aa3fd0bfaa8f4d094b2aee00ad" +checksum = "6df92e0e9baae4dc82c7bad7715ca40c0a5c71539057bf2ea04a5c29c980410b" dependencies = [ "either", "owo-colors", From 579ba418c18e9d387f8b77c0e5364f70e891cb5b Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 29 Jul 2026 14:01:04 +0000 Subject: [PATCH 19/37] Update Rust crate thiserror to v2.0.19 --- Cargo.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 394b1a7..4e3f082 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,7 +44,7 @@ dependencies = [ "sha2 0.11.0", "sha256", "sqlx", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", "tokio", ] @@ -2209,7 +2209,7 @@ dependencies = [ "jni-sys", "log", "simd_cesu8", - "thiserror 2.0.18", + "thiserror 2.0.19", "walkdir", "windows-link", ] @@ -2568,7 +2568,7 @@ dependencies = [ "simplelog", "spbr-common", "sqlx", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tonic", "tonic-prost", @@ -3231,7 +3231,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.6.4", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tracing", "web-time", @@ -3254,7 +3254,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.18", + "thiserror 2.0.19", "tinyvec", "tracing", "web-time", @@ -3970,7 +3970,7 @@ dependencies = [ "rand 0.9.4", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", "url", "uuid", @@ -4216,7 +4216,7 @@ dependencies = [ "hybrid-array", "md-5", "rand 0.10.2", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] @@ -4291,7 +4291,7 @@ dependencies = [ "serde_json", "sha2 0.10.9", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tokio-stream", "tracing", @@ -4332,7 +4332,7 @@ dependencies = [ "sqlx-postgres", "sqlx-sqlite", "syn 2.0.118", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "url", ] @@ -4360,7 +4360,7 @@ dependencies = [ "sha1", "sha2 0.11.0", "sqlx-core", - "thiserror 2.0.18", + "thiserror 2.0.19", "tracing", ] @@ -4396,7 +4396,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.18", + "thiserror 2.0.19", "tracing", "whoami", ] @@ -4421,7 +4421,7 @@ dependencies = [ "percent-encoding", "serde", "sqlx-core", - "thiserror 2.0.18", + "thiserror 2.0.19", "tracing", "url", ] @@ -4569,11 +4569,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.19", ] [[package]] @@ -4589,13 +4589,13 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.0", ] [[package]] From e7c94f30cd7810742108ffb3189a725dfecb8255 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 29 Jul 2026 14:01:10 +0000 Subject: [PATCH 20/37] Update Rust crate base64 to 0.23.0 --- Cargo.lock | 32 +++++++++++++++++++------------- Cargo.toml | 2 +- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 394b1a7..8ae7f65 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.1.0" dependencies = [ "aes 0.8.4", "argon2", - "base64", + "base64 0.23.0", "bcrypt", "binrw", "bytemuck", @@ -468,6 +468,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b25655df2c3cdd83c5e5b293b88acd880332b2ddadd7c30ac43144fdc0033da9" + [[package]] name = "base64ct" version = "1.8.3" @@ -480,7 +486,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f3c067aa24dd4ed5c79cf222a38f260c8f23d3b82a062fba3f28c6fe563b753" dependencies = [ - "base64", + "base64 0.22.1", "blowfish", "getrandom 0.4.3", "subtle", @@ -1225,7 +1231,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6" dependencies = [ - "base64", + "base64 0.22.1", "memchr", ] @@ -1957,7 +1963,7 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-channel", "futures-util", @@ -2350,7 +2356,7 @@ version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0da65617f6cb926332d039cb578aad56178da86e128db6a1b09f4c94fa5b3349" dependencies = [ - "base64", + "base64 0.22.1", "email-encoding", "email_address", "fastrand", @@ -2559,7 +2565,7 @@ version = "0.2.4" source = "sparse+https://crates.spbr.net/api/v1/crates/" checksum = "6f1cfe935e71c764dfd6bad9b23372396f785408536c0a23fba379ef405117d3" dependencies = [ - "base64", + "base64 0.22.1", "bytemuck", "hmac 0.13.0", "log", @@ -3456,7 +3462,7 @@ version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "encoding_rs", "futures-channel", @@ -4210,7 +4216,7 @@ source = "sparse+https://crates.spbr.net/api/v1/crates/" checksum = "04f4e4710d23bb730a95d00b853e304a4c1c9e86276792cd32a92057e9833452" dependencies = [ "aes 0.9.1", - "base64", + "base64 0.22.1", "bytemuck", "hmac 0.13.0", "hybrid-array", @@ -4267,7 +4273,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b44e85bf579a8eeb4ceaa77a3a523baf2bf0e9bac7e40f405d537b5d2d5ccb" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "cfg-if", "chrono", @@ -4371,7 +4377,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87a2bdd6e83f6b3ea525ca9fee568030508b58355a43d0b2c1674d5f79dcd65e" dependencies = [ "atoi", - "base64", + "base64 0.22.1", "bitflags", "byteorder", "chrono", @@ -4785,7 +4791,7 @@ checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" dependencies = [ "async-trait", "axum", - "base64", + "base64 0.22.1", "bytes", "h2 0.4.15", "http 1.4.2", @@ -5063,7 +5069,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" dependencies = [ - "base64", + "base64 0.22.1", "der 0.8.0", "log", "native-tls", @@ -5080,7 +5086,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" dependencies = [ - "base64", + "base64 0.22.1", "http 1.4.2", "httparse", "log", diff --git a/Cargo.toml b/Cargo.toml index c15fcd1..74d75b1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,7 @@ chrono = { version = "0.4.39", features = ["serde"] } argon2 = "0.5.3" sha2 = "0.11.0" bytemuck = { version = "1.21.0", features = ["derive"] } -base64 = "0.22.1" +base64 = "0.23.0" hex = "0.4.3" thiserror = "2.0.11" bcrypt = "0.19.0" From 68b5f2251d07e6e9527ea706a01d99a89364fc4b Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 29 Jul 2026 14:01:24 +0000 Subject: [PATCH 21/37] Update Rust crate k256 to 0.14.0 --- Cargo.lock | 53 +++++++++++++++++------------------------------------ Cargo.toml | 2 +- 2 files changed, 18 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 394b1a7..f9d7798 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,7 +21,7 @@ dependencies = [ "gxhash", "hex", "hickory-resolver", - "hmac 0.13.0", + "hmac", "juniper", "juniper_rocket", "k256", @@ -1128,7 +1128,7 @@ dependencies = [ "der 0.8.0", "digest 0.11.3", "pkcs8 0.11.0", - "rfc6979 0.6.0", + "rfc6979", "sha2 0.11.0", "signature 3.0.0", "zeroize", @@ -1149,7 +1149,6 @@ dependencies = [ "der 0.7.10", "digest 0.10.7", "elliptic-curve 0.13.8", - "rfc6979 0.4.0", "signature 2.2.0", "spki 0.7.3", ] @@ -1163,7 +1162,7 @@ dependencies = [ "der 0.8.0", "digest 0.11.3", "elliptic-curve 0.14.1", - "rfc6979 0.6.0", + "rfc6979", "signature 3.0.0", "spki 0.8.0", "zeroize", @@ -1750,16 +1749,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4aaa26c720c68b866f2c96ef5c1264b3e6f473fe5d4ce61cd44bbe913e553018" dependencies = [ - "hmac 0.13.0", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", + "hmac", ] [[package]] @@ -2320,16 +2310,17 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.4" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +checksum = "93f50113171a713f4a4231ef82eb26703607139b35dcb56241f0ceab2ae1f7d8" dependencies = [ - "cfg-if", - "ecdsa 0.16.9", - "elliptic-curve 0.13.8", - "once_cell", - "sha2 0.10.9", - "signature 2.2.0", + "cpubits", + "ecdsa 0.17.0", + "elliptic-curve 0.14.1", + "primeorder", + "sha2 0.11.0", + "signature 3.0.0", + "wnaf", ] [[package]] @@ -2561,7 +2552,7 @@ checksum = "6f1cfe935e71c764dfd6bad9b23372396f785408536c0a23fba379ef405117d3" dependencies = [ "base64", "bytemuck", - "hmac 0.13.0", + "hmac", "log", "md-5", "prost", @@ -3501,16 +3492,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac 0.12.1", - "subtle", -] - [[package]] name = "rfc6979" version = "0.6.0" @@ -3518,7 +3499,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4a459cddafb3fe76b31fd8f1108007566c40301feb64dc7b54656eb7388172b" dependencies = [ "crypto-bigint 0.7.5", - "hmac 0.13.0", + "hmac", ] [[package]] @@ -4212,7 +4193,7 @@ dependencies = [ "aes 0.9.1", "base64", "bytemuck", - "hmac 0.13.0", + "hmac", "hybrid-array", "md-5", "rand 0.10.2", @@ -4383,7 +4364,7 @@ dependencies = [ "futures-util", "hex", "hkdf", - "hmac 0.13.0", + "hmac", "ipnetwork", "itoa", "log", diff --git a/Cargo.toml b/Cargo.toml index c15fcd1..0fb1259 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,7 +50,7 @@ binrw = "0.15.1" ecdsa = { version = "0.16.9", features = ["pem", "std", "verifying"] } sha256 = "1.6.0" p256 = "0.14.0" -k256 = "0.13.4" +k256 = "0.14.0" dsa = "0.7.0" openssl = {version = "0.10.78", features = ["vendored"]} time = "0.3.47" From 9951c60327ac42898aa8cb8a20c9b5a4545dacc8 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 29 Jul 2026 14:30:30 +0000 Subject: [PATCH 22/37] Update Rust crate bcrypt to v0.19.3 --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 066f478..62a3ad1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -482,11 +482,11 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bcrypt" -version = "0.19.2" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3c067aa24dd4ed5c79cf222a38f260c8f23d3b82a062fba3f28c6fe563b753" +checksum = "a0cd0bd35a28836d528d2b58ad499bc3c5641d59379421b1be9eeb0c2f2b912a" dependencies = [ - "base64 0.22.1", + "base64 0.23.0", "blowfish", "getrandom 0.4.3", "subtle", @@ -4530,7 +4530,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.3", + "getrandom 0.3.4", "once_cell", "rustix", "windows-sys 0.61.2", From d76175fbeaee961f81841dabcceeeab7436a6131 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 29 Jul 2026 15:00:37 +0000 Subject: [PATCH 23/37] Update Rust crate nex-account to v0.2.5 --- Cargo.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 62a3ad1..01022cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1274,7 +1274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -1964,7 +1964,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.4", + "socket2 0.5.10", "system-configuration", "tokio", "tower-service", @@ -2175,7 +2175,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -2552,11 +2552,11 @@ dependencies = [ [[package]] name = "nex-account" -version = "0.2.4" +version = "0.2.5" source = "sparse+https://crates.spbr.net/api/v1/crates/" -checksum = "6f1cfe935e71c764dfd6bad9b23372396f785408536c0a23fba379ef405117d3" +checksum = "7cb5867c4f4771dd7125dce1f911753cc9291b65cd7908c0e7ca182e7b2a57a3" dependencies = [ - "base64 0.22.1", + "base64 0.23.0", "bytemuck", "hmac", "log", @@ -3227,7 +3227,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.4", + "socket2 0.5.10", "thiserror 2.0.19", "tokio", "tracing", @@ -3266,9 +3266,9 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.4", + "socket2 0.5.10", "tracing", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -3652,7 +3652,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -3709,7 +3709,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -4530,10 +4530,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -5279,7 +5279,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] From 66e8e689af026c53edcf65f9969da46f769d4b08 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Sat, 1 Aug 2026 08:30:31 +0000 Subject: [PATCH 24/37] Update Rust crate time to v0.3.55 --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01022cc..cf200d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4596,9 +4596,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.54" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", "libc", From e3489f4eaaa1e6f1825935f1bf1ac35363b14897 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Mon, 3 Aug 2026 11:45:27 +0000 Subject: [PATCH 25/37] Update Rust crate lettre to v0.11.23 --- Cargo.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01022cc..f807ab9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1274,7 +1274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2175,7 +2175,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2343,11 +2343,11 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lettre" -version = "0.11.22" +version = "0.11.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da65617f6cb926332d039cb578aad56178da86e128db6a1b09f4c94fa5b3349" +checksum = "f2c646bd5cc763b1087b15493e29a64be6147ba8f19342004fa52048ee596eae" dependencies = [ - "base64 0.22.1", + "base64 0.23.0", "email-encoding", "email_address", "fastrand", @@ -3268,7 +3268,7 @@ dependencies = [ "once_cell", "socket2 0.5.10", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3652,7 +3652,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3709,7 +3709,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -4533,7 +4533,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -5279,7 +5279,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] From b814887461c2d8db6c53c39e0b21427e33b1a497 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Mon, 3 Aug 2026 15:00:41 +0000 Subject: [PATCH 26/37] Update Rust crate sentry to v0.49.1 --- Cargo.lock | 60 +++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01022cc..e8c08df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1274,7 +1274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -1964,7 +1964,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.6.4", "system-configuration", "tokio", "tower-service", @@ -2175,7 +2175,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3227,7 +3227,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.5.10", + "socket2 0.6.4", "thiserror 2.0.19", "tokio", "tracing", @@ -3266,9 +3266,9 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.4", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3652,7 +3652,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3709,7 +3709,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3831,9 +3831,9 @@ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "sentry" -version = "0.49.0" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91e4790d8c2f43a6645ee2cb12aac2db79221fddd035b94c8166b88ea094408" +checksum = "63207365db50cb817402f0ec8097d6dad3d644ef3fffd6ba30c75b3077e514da" dependencies = [ "cfg_aliases", "httpdate", @@ -3853,9 +3853,9 @@ dependencies = [ [[package]] name = "sentry-actix" -version = "0.49.0" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a12b26925e70eba6c346588650f8b346d9e78a83249970b706068456005cd61" +checksum = "4a0eb1ed18478fb48db007aeaa672a3de176055357feb768eee0c3471802d0ce" dependencies = [ "actix-http", "actix-web", @@ -3866,9 +3866,9 @@ dependencies = [ [[package]] name = "sentry-backtrace" -version = "0.49.0" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "326e106874a7ea90636f1ca42e2f7b912929d29307982cab37f81208c16cf043" +checksum = "e3bcc2497c2327998146207b7600599ef7592233920f4d4e1d41ddeeba0e4210" dependencies = [ "backtrace", "regex", @@ -3877,9 +3877,9 @@ dependencies = [ [[package]] name = "sentry-contexts" -version = "0.49.0" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab62ebc8076326e509c71a7424d2aaeff63fba9bc4e5b55074cd33f356c759f" +checksum = "1cb04cba225b38f59d08f9e3c29ab7259d9cc94fbb2c46d613a51cb0a4a7ee05" dependencies = [ "hostname", "libc", @@ -3891,9 +3891,9 @@ dependencies = [ [[package]] name = "sentry-core" -version = "0.49.0" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f9efafefbb78d7e02cb06c10aec08b77e7500428389eabbf6d5a668325265e8" +checksum = "48759bc392fb5e3b36b4efcb485f51074c0ba8479711cd5c8cf79e86f9f75d41" dependencies = [ "rand 0.9.4", "sentry-types", @@ -3904,9 +3904,9 @@ dependencies = [ [[package]] name = "sentry-debug-images" -version = "0.49.0" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee1e7c19e715ae9538114bbd09c2442689a481e2adbc8245c9e06b20d2bd2be" +checksum = "0a5bd325059b70b21ca6e42b0f2409821272dddc1cf37923de37269af55389b5" dependencies = [ "findshlibs", "sentry-core", @@ -3914,9 +3914,9 @@ dependencies = [ [[package]] name = "sentry-log" -version = "0.49.0" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba08897af468a109afafba1f00c25d40070ef76309759833cccb83151a5be73d" +checksum = "f9553a2f0f75bc8550137ebc753e8d2161af63ff780ca59983935f8df8f01655" dependencies = [ "bitflags", "log", @@ -3925,9 +3925,9 @@ dependencies = [ [[package]] name = "sentry-panic" -version = "0.49.0" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fc536a3e1fc68d626ae8dd18b628cafd474d9d36fea74e4bbb4d038877f003" +checksum = "a685d22f672b1562ebeff3f2affceb5960595648cc936dae73da3e1d6a55fbd1" dependencies = [ "sentry-backtrace", "sentry-core", @@ -3935,9 +3935,9 @@ dependencies = [ [[package]] name = "sentry-tracing" -version = "0.49.0" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96be2253fe14b3fa10c1ba047af2d3e58ce85c8cb297bbd19d6fa81b604e7877" +checksum = "8aa7d8e0db4cccddbac01ddabd5344ad03b7c2f954b3ff850cecb1d9cf5d4758" dependencies = [ "bitflags", "sentry-backtrace", @@ -3948,9 +3948,9 @@ dependencies = [ [[package]] name = "sentry-types" -version = "0.49.0" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f967748632cd4c5405dbed45426b27b407c0e53ac59b7df1c163e7f5aa57a77c" +checksum = "fab146d15a30ab4897a95fd15d6a038b8d7fbf2661c5f8b13738ce8df7a095b7" dependencies = [ "debugid", "hex", @@ -4533,7 +4533,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -5279,7 +5279,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] From 282b1c34cf5bbcaa85233eaaaa060b4f43349144 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Tue, 4 Aug 2026 13:00:36 +0000 Subject: [PATCH 27/37] Update Rust crate base64 to v0.23.1 --- Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01022cc..20be14d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.1.0" dependencies = [ "aes 0.8.4", "argon2", - "base64 0.23.0", + "base64 0.23.1", "bcrypt", "binrw", "bytemuck", @@ -470,9 +470,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b25655df2c3cdd83c5e5b293b88acd880332b2ddadd7c30ac43144fdc0033da9" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" [[package]] name = "base64ct" @@ -486,7 +486,7 @@ version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0cd0bd35a28836d528d2b58ad499bc3c5641d59379421b1be9eeb0c2f2b912a" dependencies = [ - "base64 0.23.0", + "base64 0.23.1", "blowfish", "getrandom 0.4.3", "subtle", @@ -2556,7 +2556,7 @@ version = "0.2.5" source = "sparse+https://crates.spbr.net/api/v1/crates/" checksum = "7cb5867c4f4771dd7125dce1f911753cc9291b65cd7908c0e7ca182e7b2a57a3" dependencies = [ - "base64 0.23.0", + "base64 0.23.1", "bytemuck", "hmac", "log", From b934df85314962421db36ecc48bd7ffdb5095713 Mon Sep 17 00:00:00 2001 From: redbinder0526 Date: Wed, 5 Aug 2026 14:31:15 +0200 Subject: [PATCH 28/37] Update Cargo.toml --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 832368b..f435181 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,7 +47,7 @@ lettre = "0.11.15" rand = { version = "0.10.0", features = ["std"] } reqwest = "0.13.0" binrw = "0.15.1" -ecdsa = { version = "0.17.0", features = ["pem", "std", "verifying"] } +ecdsa = { version = "0.17.0", features = ["pem", "std", "algorithm", "digest"] } sha256 = "1.6.0" p256 = "0.13.2" k256 = "0.13.4" From e00913e7a35efdfe9436d6c7d9a00b58089b5494 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Sat, 8 Aug 2026 13:16:13 +0000 Subject: [PATCH 29/37] Update Rust crate thiserror to v2.0.20 --- Cargo.lock | 258 ++++++++++++----------------------------------------- 1 file changed, 57 insertions(+), 201 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1c44e7f..2864314 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,7 +17,7 @@ dependencies = [ "crc32fast", "dotenvy", "dsa", - "ecdsa 0.16.9", + "ecdsa", "gxhash", "hex", "hickory-resolver", @@ -44,7 +44,7 @@ dependencies = [ "sha2 0.11.0", "sha256", "sqlx", - "thiserror 2.0.19", + "thiserror 2.0.20", "time", "tokio", ] @@ -450,12 +450,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - [[package]] name = "base16ct" version = "1.0.0" @@ -769,12 +763,6 @@ 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 = "const-oid" version = "0.10.2" @@ -890,18 +878,6 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.7.5" @@ -946,7 +922,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3633a51a39c69ebbaa4feaa694bd83d241e4093901c84a0963b19d9bb3f0cf8f" dependencies = [ - "crypto-bigint 0.7.5", + "crypto-bigint", "rand_core 0.10.1", ] @@ -976,25 +952,14 @@ dependencies = [ "uuid", ] -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid 0.9.6", - "pem-rfc7468 0.7.0", - "zeroize", -] - [[package]] name = "der" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" dependencies = [ - "const-oid 0.10.2", - "pem-rfc7468 1.0.0", + "const-oid", + "pem-rfc7468", "zeroize", ] @@ -1078,7 +1043,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", - "const-oid 0.9.6", "crypto-common 0.1.7", "subtle", ] @@ -1090,7 +1054,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.1", - "const-oid 0.10.2", + "const-oid", "crypto-common 0.2.2", "ctutils", ] @@ -1128,15 +1092,15 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8573b60d07b5b5cecadc1f978c9b71d5504151e703cbb0439ee4ad301338f3" dependencies = [ - "crypto-bigint 0.7.5", + "crypto-bigint", "crypto-common 0.2.2", "crypto-primes", - "der 0.8.0", + "der", "digest 0.11.3", - "pkcs8 0.11.0", + "pkcs8", "rfc6979", "sha2 0.11.0", - "signature 3.0.0", + "signature", "zeroize", ] @@ -1146,31 +1110,18 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der 0.7.10", - "digest 0.10.7", - "elliptic-curve 0.13.8", - "signature 2.2.0", - "spki 0.7.3", -] - [[package]] name = "ecdsa" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0681a4fc24c767085329728d8dfba959af91228aa4610cca4f8ce317ba46ae0" dependencies = [ - "der 0.8.0", + "der", "digest 0.11.3", - "elliptic-curve 0.14.1", + "elliptic-curve", "rfc6979", - "signature 3.0.0", - "spki 0.8.0", + "signature", + "spki", "zeroize", ] @@ -1183,43 +1134,23 @@ dependencies = [ "serde", ] -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.5", - "digest 0.10.7", - "ff 0.13.1", - "generic-array", - "group 0.13.0", - "pem-rfc7468 0.7.0", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sec1 0.7.3", - "subtle", - "zeroize", -] - [[package]] name = "elliptic-curve" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d65aa39b3a5c1c9c1b745c9a019234bb7a21b77abcb4f4d266d706e2d577d65" dependencies = [ - "base16ct 1.0.0", - "crypto-bigint 0.7.5", + "base16ct", + "crypto-bigint", "crypto-common 0.2.2", "digest 0.11.3", - "ff 0.14.0", - "group 0.14.0", + "ff", + "group", "hybrid-array", - "pem-rfc7468 1.0.0", - "pkcs8 0.11.0", + "pem-rfc7468", + "pkcs8", "rand_core 0.10.1", - "sec1 0.8.1", + "sec1", "subtle", "zeroize", ] @@ -1304,16 +1235,6 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "ff" version = "0.14.0" @@ -1528,7 +1449,6 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", - "zeroize", ] [[package]] @@ -1582,24 +1502,13 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff 0.13.1", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "group" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4" dependencies = [ - "ff 0.14.0", + "ff", "rand_core 0.10.1", "subtle", ] @@ -2205,7 +2114,7 @@ dependencies = [ "jni-sys", "log", "simd_cesu8", - "thiserror 2.0.19", + "thiserror 2.0.20", "walkdir", "windows-link", ] @@ -2321,11 +2230,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f50113171a713f4a4231ef82eb26703607139b35dcb56241f0ceab2ae1f7d8" dependencies = [ "cpubits", - "ecdsa 0.17.0", - "elliptic-curve 0.14.1", + "ecdsa", + "elliptic-curve", "primeorder", "sha2 0.11.0", - "signature 3.0.0", + "signature", "wnaf", ] @@ -2347,7 +2256,7 @@ version = "0.11.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2c646bd5cc763b1087b15493e29a64be6147ba8f19342004fa52048ee596eae" dependencies = [ - "base64 0.23.0", + "base64 0.23.1", "email-encoding", "email_address", "fastrand", @@ -2565,7 +2474,7 @@ dependencies = [ "simplelog", "spbr-common", "sqlx", - "thiserror 2.0.19", + "thiserror 2.0.20", "tokio", "tonic", "tonic-prost", @@ -2891,8 +2800,8 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2c9239b2dbc807adbbe147e8cf72ea7450c3a0aabe62cb8e75ff4ec22e1f72a" dependencies = [ - "ecdsa 0.17.0", - "elliptic-curve 0.14.1", + "ecdsa", + "elliptic-curve", "primefield", "primeorder", "sha2 0.11.0", @@ -2961,15 +2870,6 @@ dependencies = [ "syn 2.0.118", ] -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - [[package]] name = "pem-rfc7468" version = "1.0.0" @@ -3022,24 +2922,14 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der 0.7.10", - "spki 0.7.3", -] - [[package]] name = "pkcs8" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" dependencies = [ - "der 0.8.0", - "spki 0.8.0", + "der", + "spki", ] [[package]] @@ -3088,9 +2978,9 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c555a6e4eb7d4e158fcb028c835c3b8642206ddc279b5c6b202ef9a8bdb592f4" dependencies = [ - "crypto-bigint 0.7.5", + "crypto-bigint", "crypto-common 0.2.2", - "ff 0.14.0", + "ff", "rand_core 0.10.1", "subtle", "zeroize", @@ -3102,7 +2992,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c9f42978c78a00e3d68f69fc03e57a234debae69da4020a4fb588fcdcd07b06" dependencies = [ - "elliptic-curve 0.14.1", + "elliptic-curve", "once_cell", "primefield", "serdect", @@ -3228,7 +3118,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.6.4", - "thiserror 2.0.19", + "thiserror 2.0.20", "tokio", "tracing", "web-time", @@ -3251,7 +3141,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.19", + "thiserror 2.0.20", "tinyvec", "tracing", "web-time", @@ -3504,7 +3394,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4a459cddafb3fe76b31fd8f1108007566c40301feb64dc7b54656eb7388172b" dependencies = [ - "crypto-bigint 0.7.5", + "crypto-bigint", "hmac", ] @@ -3772,29 +3662,15 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct 0.2.0", - "der 0.7.10", - "generic-array", - "pkcs8 0.10.2", - "subtle", - "zeroize", -] - [[package]] name = "sec1" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4d" dependencies = [ - "base16ct 1.0.0", + "base16ct", "ctutils", - "der 0.8.0", + "der", "hybrid-array", "subtle", "zeroize", @@ -3957,7 +3833,7 @@ dependencies = [ "rand 0.9.4", "serde", "serde_json", - "thiserror 2.0.19", + "thiserror 2.0.20", "time", "url", "uuid", @@ -4033,7 +3909,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" dependencies = [ - "base16ct 1.0.0", + "base16ct", "serde", ] @@ -4108,16 +3984,6 @@ dependencies = [ "libc", ] -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - [[package]] name = "signature" version = "3.0.0" @@ -4203,7 +4069,7 @@ dependencies = [ "hybrid-array", "md-5", "rand 0.10.2", - "thiserror 2.0.19", + "thiserror 2.0.20", ] [[package]] @@ -4215,16 +4081,6 @@ dependencies = [ "lock_api", ] -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der 0.7.10", -] - [[package]] name = "spki" version = "0.8.0" @@ -4232,7 +4088,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6f" dependencies = [ "base64ct", - "der 0.8.0", + "der", ] [[package]] @@ -4278,7 +4134,7 @@ dependencies = [ "serde_json", "sha2 0.10.9", "smallvec", - "thiserror 2.0.19", + "thiserror 2.0.20", "tokio", "tokio-stream", "tracing", @@ -4319,7 +4175,7 @@ dependencies = [ "sqlx-postgres", "sqlx-sqlite", "syn 2.0.118", - "thiserror 2.0.19", + "thiserror 2.0.20", "tokio", "url", ] @@ -4347,7 +4203,7 @@ dependencies = [ "sha1", "sha2 0.11.0", "sqlx-core", - "thiserror 2.0.19", + "thiserror 2.0.20", "tracing", ] @@ -4383,7 +4239,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.19", + "thiserror 2.0.20", "tracing", "whoami", ] @@ -4408,7 +4264,7 @@ dependencies = [ "percent-encoding", "serde", "sqlx-core", - "thiserror 2.0.19", + "thiserror 2.0.20", "tracing", "url", ] @@ -4556,11 +4412,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.19" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ - "thiserror-impl 2.0.19", + "thiserror-impl 2.0.20", ] [[package]] @@ -4576,9 +4432,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.19" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", @@ -5051,7 +4907,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" dependencies = [ "base64 0.22.1", - "der 0.8.0", + "der", "log", "native-tls", "percent-encoding", @@ -5527,8 +5383,8 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab12e7090f27e2ffd9322651492942d50c2926094af30601e1964337db39daf1" dependencies = [ - "ff 0.14.0", - "group 0.14.0", + "ff", + "group", "hybrid-array", ] From 8c01e2d5fd12e180116e98b674e555ff9b6d7619 Mon Sep 17 00:00:00 2001 From: red binder Date: Sat, 8 Aug 2026 21:11:30 +0200 Subject: [PATCH 30/37] log redirect uri --- src/json_api/oauth/authorize.rs | 3 ++- src/json_api/oauth/generate_token.rs | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/json_api/oauth/authorize.rs b/src/json_api/oauth/authorize.rs index 07be2e9..6ade152 100644 --- a/src/json_api/oauth/authorize.rs +++ b/src/json_api/oauth/authorize.rs @@ -65,12 +65,13 @@ pub async fn authorize_submit( let expires_at = Utc::now().naive_utc() + Duration::minutes(5); if let Err(db_err) = sqlx::query( - "INSERT INTO oauth_auth_codes (code, pid, redirect_uri, expires_at) VALUES ($1, $2, $3, $4)" + "INSERT INTO oauth_auth_codes (code, pid, redirect_uri, expires_at, client_id) VALUES ($1, $2, $3, $4, $5)" ) .bind(&secure_auth_code) .bind(pid) .bind(form_data.redirect_uri) .bind(expires_at) + .bind(form_data.client_id) .execute(pool.inner()) .await { eprintln!("failed to save auth code: {:?}", db_err); diff --git a/src/json_api/oauth/generate_token.rs b/src/json_api/oauth/generate_token.rs index 767e374..091a99f 100644 --- a/src/json_api/oauth/generate_token.rs +++ b/src/json_api/oauth/generate_token.rs @@ -33,8 +33,6 @@ pub struct TokenRequest<'r> { } pub fn verify_nintendo_password(pid: i32, text_password: &str, db_bcrypt_hash: &str) -> bool { - // maple: binder, there's already a function for this, why duplicate code? - // binder: dear maple, with this function i can just hand it a pid, the password from the user and the db_bcrypt_hash and it gives me a true/false value. let mut sha = Sha256::new(); sha.update(bytes_of(&pid)); sha.update(&[0x02, 0x65, 0x43, 0x46]); @@ -54,6 +52,8 @@ pub async fn generate_token( pool: &State, form_data: Form>, ) -> Result, (Status, Json)> { + println!("redirect URI is: {:?}", form_data.redirect_uri); + match form_data.client_id { Some("account") | Some("splatnet") => { let cl_secret: String = CLIENT_SECRET.clone(); From d7c226b5a1f234a48d239dffa4912e53b8a4e843 Mon Sep 17 00:00:00 2001 From: red binder Date: Sun, 9 Aug 2026 14:52:45 +0200 Subject: [PATCH 31/37] add eula versioning --- res/agreement/EVIL.xml | 0 src/account/account.rs | 55 +++++++++++++++ src/nnid/agreements.rs | 111 ++++++++++++++++++------------- src/nnid/oauth/generate_token.rs | 25 ++++--- src/nnid/people.rs | 38 ++++++++++- 5 files changed, 168 insertions(+), 61 deletions(-) delete mode 100644 res/agreement/EVIL.xml diff --git a/res/agreement/EVIL.xml b/res/agreement/EVIL.xml deleted file mode 100644 index e69de29..0000000 diff --git a/src/account/account.rs b/src/account/account.rs index 41c285a..5dd5fe0 100644 --- a/src/account/account.rs +++ b/src/account/account.rs @@ -64,6 +64,7 @@ pub struct User { pub updated: NaiveDateTime, pub nex_password: String, pub verification_code: Option, + pub eula_version: i32, } #[derive(sqlx::FromRow)] @@ -170,6 +171,59 @@ pub async fn read_basic_auth_token( } } +pub async fn read_hashed_basic_auth_token( + connection: &Pool, + token: &str, +) -> Option<(User, Option<[u8; 32]>)> { + let data = match BASE64_STANDARD.decode(token) { + Ok(d) => d, + Err(e) => { + println!("Failed to decode base64: {:?}", e); + return None; + } + }; + + let decoded_token = match String::from_utf8(data) { + Ok(s) => s, + Err(e) => { + println!("Failed to convert decoded bytes to UTF-8 string: {:?}", e); + return None; + } + }; + + let (login_username, login_hash) = match decoded_token.split_once(' ') { + Some(parts) => parts, + None => { + println!("Failed to split hashed basic token into username and hash"); + return None; + } + }; + + let user_result = sqlx::query_as!( + User, + "SELECT * FROM users WHERE username = $1", + login_username + ) + .fetch_one(connection) + .await; + + let user = match user_result { + Ok(u) => u, + Err(e) => { + println!("Failed to fetch user from database: {:?}", e); + return None; + } + }; + + let password_valid = user.verify_hashed_password(login_hash); + + if password_valid == Some(true) { + Some((user, None)) + } else { + None + } +} + pub async fn read_bearer_auth_token( connection: &Pool, token: &str, @@ -307,6 +361,7 @@ impl<'r, const FORCE_BEARER_AUTH: bool, const USE_CERT: bool> FromRequest<'r> let data = match auth_type { "Basic" if !FORCE_BEARER_AUTH => read_basic_auth_token(pool, token).await, + "HashedBasic" if !FORCE_BEARER_AUTH => read_hashed_basic_auth_token(pool, token).await, "Bearer" => read_bearer_auth_token(pool, token).await, _ => return Outcome::Error((Status::BadRequest, INVALID_TOKEN_ERRORS)), }; diff --git a/src/nnid/agreements.rs b/src/nnid/agreements.rs index cc97c70..4fa2d59 100644 --- a/src/nnid/agreements.rs +++ b/src/nnid/agreements.rs @@ -1,37 +1,64 @@ -use std::{env, io}; -use std::collections::HashSet; +use std::{env, io, fs}; +use serde::Deserialize; use once_cell::sync::Lazy; use rocket::fs::NamedFile; -use rocket::{get, Request}; -use rocket::http::Status; -use rocket::request::{FromRequest, Outcome}; +use rocket::get; use rocket::response::content::RawXml; use tokio::fs::try_exists; -use tokio::sync::RwLock; -use rocket::async_trait; use crate::dsresponse::Ds; -pub static EVIL_AGREEMENT_THING: Lazy>> = Lazy::new(|| Default::default()); +// pub static EVIL_AGREEMENT_THING: Lazy>> = Lazy::new(|| Default::default()); -pub struct CFIP(pub String); +// pub struct CFIP(pub String); -#[async_trait] -impl<'r> FromRequest<'r> for CFIP{ - type Error = (); +// #[async_trait] +// impl<'r> FromRequest<'r> for CFIP{ +// type Error = (); - async fn from_request(request: &'r Request<'_>) -> Outcome { - match request.headers().get("CF-Connecting-IP").next(){ - Some(v) => Outcome::Success(Self(v.to_owned())), - None => Outcome::Error((Status::ImATeapot, ())) - } - } +// async fn from_request(request: &'r Request<'_>) -> Outcome { +// match request.headers().get("CF-Connecting-IP").next(){ +// Some(v) => Outcome::Success(Self(v.to_owned())), +// None => Outcome::Error((Status::ImATeapot, ())) +// } +// } +// } + +#[derive(Debug, Deserialize)] +struct Agreement { + version: String, } +#[derive(Debug, Deserialize)] +struct Agreements { + #[serde(rename = "agreement")] + agreements: Vec, +} + +pub fn get_latest_eula_version() -> Result> { + let mut path = std::env::current_dir()?; + path.push("res"); + path.push("agreement"); + path.push("DEFAULT.xml"); + + let content = fs::read_to_string(path)?; + let parsed: Agreements = quick_xml::de::from_str(&content)?; + + parsed + .agreements + .first() + .map(|a| a.version.clone()) + .ok_or_else(|| "No agreement found in XML".into()) +} + +pub static LATEST_EULA_VERSION: Lazy = Lazy::new(|| { + get_latest_eula_version() + .ok() + .and_then(|v| v.parse::().ok()) + .unwrap_or(300) +}); #[get("/v1/api/content/agreements/Nintendo-Network-EULA//@latest")] -pub async fn get_agreement(lang: &str, ip: CFIP) -> io::Result>>{ - - +pub async fn get_agreement(lang: &str) -> io::Result>>{ let base_path = { // if this crashes then something is wrong with the server setup so crashing here is fine imo let mut path = env::current_dir().unwrap(); @@ -42,38 +69,26 @@ pub async fn get_agreement(lang: &str, ip: CFIP) -> io::Result, data: Form>, - ip: CFIP, cert: DeviceCert, ) -> Result, Option>> { let pool = pool.inner(); @@ -133,14 +139,13 @@ pub async fn generate_token( return Err(Some(ACCOUNT_ID_OR_PASSWORD_ERRORS)); } + if user.eula_version != *LATEST_EULA_VERSION { + return Err(Some(REREAD_EULA_ERRORS)); + } + if user.account_level < 0 { if user.account_level == -2 { - return Err(Some(REREAD_EULA_EXTRABANNED_ERRORS)); - } - if user.account_level == -3 { - EVIL_AGREEMENT_THING.write().await.insert(ip.0); - - return Err(Some(REREAD_EULA_EXTRABANNED_ERRORS)); + return Err(Some(ACCOUNT_TEMPBANNED_ERRORS)); } return Err(Some(ACCOUNT_BANNED_ERRORS)); } diff --git a/src/nnid/people.rs b/src/nnid/people.rs index 211293a..8154392 100644 --- a/src/nnid/people.rs +++ b/src/nnid/people.rs @@ -17,7 +17,7 @@ use rocket::{State, get, post, put}; const DATABASE_ERROR: Errors = Errors { error: &[Error { - code: "9999", + code: "2001", message: "Internal server error", }], }; @@ -494,5 +494,37 @@ pub async fn change_mii( Ok(()) } -#[post("/v1/api/people/@me/agreements")] -pub async fn thing() {} +#[derive(Deserialize, Debug)] +pub struct AgreedEulaData { + pub agreement_date: NaiveDateTime, + pub country: Box, + pub location: Box, + pub version: i32 +} + +#[post("/v1/api/people/@me/agreements", data = "")] +pub async fn thing( + database: &State, + auth: Auth, + data: Xml, +) -> Result<(), Option>> { + let db = database.inner(); + let version = data.version; + let pid = auth.pid; + println!("eula data: {:?}", data.version); + + let result = sqlx::query!( + "UPDATE users SET eula_version = $1 WHERE pid = $2", + version, + pid + ) + .execute(db) + .await; + + if let Err(e) = result { + println!("Failed to update EULA version for PID {}: {:?}", pid, e); + return Err(Some(DATABASE_ERROR)); + } + + Ok(()) +} From b0221e55d58984066656d4faee92e997dac3f319 Mon Sep 17 00:00:00 2001 From: red binder Date: Sun, 9 Aug 2026 14:55:51 +0200 Subject: [PATCH 32/37] run sqlx prepare --- ...6c32b3d302d083ec5333f3a5ce04113c38a041100.json | 12 ++++++++++++ ...6411f73f1d281a736aa5a838ad3e72fce0e9a109e.json | 15 +++++++++++++++ ...95fc52257c0ef596eee2d9a0e6a7d0aad03de4421.json | 12 ++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 .sqlx/query-7e74c28ce6daa8155e268756411f73f1d281a736aa5a838ad3e72fce0e9a109e.json diff --git a/.sqlx/query-606364c79e0990deb07dfbe6c32b3d302d083ec5333f3a5ce04113c38a041100.json b/.sqlx/query-606364c79e0990deb07dfbe6c32b3d302d083ec5333f3a5ce04113c38a041100.json index 3604678..c5e2c51 100644 --- a/.sqlx/query-606364c79e0990deb07dfbe6c32b3d302d083ec5333f3a5ce04113c38a041100.json +++ b/.sqlx/query-606364c79e0990deb07dfbe6c32b3d302d083ec5333f3a5ce04113c38a041100.json @@ -211,6 +211,17 @@ "name": "verification_code" } } + }, + { + "ordinal": 19, + "name": "eula_version", + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "eula_version" + } + } } ], "parameters": { @@ -237,6 +248,7 @@ false, false, false, + false, false ] }, diff --git a/.sqlx/query-7e74c28ce6daa8155e268756411f73f1d281a736aa5a838ad3e72fce0e9a109e.json b/.sqlx/query-7e74c28ce6daa8155e268756411f73f1d281a736aa5a838ad3e72fce0e9a109e.json new file mode 100644 index 0000000..f088075 --- /dev/null +++ b/.sqlx/query-7e74c28ce6daa8155e268756411f73f1d281a736aa5a838ad3e72fce0e9a109e.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE users SET eula_version = $1 WHERE pid = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "7e74c28ce6daa8155e268756411f73f1d281a736aa5a838ad3e72fce0e9a109e" +} diff --git a/.sqlx/query-93960465bbf8f670891d49b95fc52257c0ef596eee2d9a0e6a7d0aad03de4421.json b/.sqlx/query-93960465bbf8f670891d49b95fc52257c0ef596eee2d9a0e6a7d0aad03de4421.json index c06bdc6..d719934 100644 --- a/.sqlx/query-93960465bbf8f670891d49b95fc52257c0ef596eee2d9a0e6a7d0aad03de4421.json +++ b/.sqlx/query-93960465bbf8f670891d49b95fc52257c0ef596eee2d9a0e6a7d0aad03de4421.json @@ -211,6 +211,17 @@ "name": "verification_code" } } + }, + { + "ordinal": 19, + "name": "eula_version", + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "eula_version" + } + } } ], "parameters": { @@ -237,6 +248,7 @@ false, false, false, + false, false ] }, From acb04bd782ec1eb6b5be42406086420c7528eb43 Mon Sep 17 00:00:00 2001 From: red binder Date: Mon, 10 Aug 2026 04:39:06 +0200 Subject: [PATCH 33/37] load oauth clients from db instead of env and hardcoding --- src/json_api/oauth/generate_token.rs | 70 ++++++++++++++++++---------- 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/src/json_api/oauth/generate_token.rs b/src/json_api/oauth/generate_token.rs index 091a99f..ee5aaf9 100644 --- a/src/json_api/oauth/generate_token.rs +++ b/src/json_api/oauth/generate_token.rs @@ -3,16 +3,11 @@ use crate::nnid::oauth::generate_token::create_token; use crate::nnid::oauth::generate_token::token_type::AUTH_TOKEN; use bytemuck::bytes_of; use chrono::Utc; -use once_cell::sync::Lazy; use rocket::FromForm; use rocket::{State, form::Form, http::Status, post, serde::json::Json}; use serde::Serialize; use sha2::{Digest, Sha256}; use sqlx::Row; -use std::env; - -pub static CLIENT_SECRET: Lazy = - Lazy::new(|| env::var("OAUTH_CLIENT_SECRET").expect("OAUTH_CLIENT_SECRET not set")); #[derive(Serialize)] pub struct OAuthTokenResponse { @@ -38,10 +33,9 @@ pub fn verify_nintendo_password(pid: i32, text_password: &str, db_bcrypt_hash: & sha.update(&[0x02, 0x65, 0x43, 0x46]); sha.update(text_password.as_bytes()); let hashed_password_hex = hex::encode(sha.finalize()); - bcrypt::verify(hashed_password_hex, db_bcrypt_hash).unwrap_or_else(|_| false) + bcrypt::verify(hashed_password_hex, db_bcrypt_hash).unwrap_or(false) } -// dummy error responses #[derive(Serialize)] pub struct OAuthErrorResponse { pub error: String, @@ -54,24 +48,50 @@ pub async fn generate_token( ) -> Result, (Status, Json)> { println!("redirect URI is: {:?}", form_data.redirect_uri); - match form_data.client_id { - Some("account") | Some("splatnet") => { - let cl_secret: String = CLIENT_SECRET.clone(); - if form_data.client_secret != Some(&cl_secret) { - return Err(( - Status::Unauthorized, - Json(OAuthErrorResponse { - error: "invalid_client".to_string(), - }), - )); - } - } - Some("website") => { - // no secret for this client, cant be kept confidential in the case of the website - } + let client_id = form_data.client_id.ok_or(( + Status::BadRequest, + Json(OAuthErrorResponse { + error: "invalid_client".to_string(), + }), + ))?; + + let client_row = match sqlx::query( + "SELECT client_secret, is_confidential FROM oauth_clients WHERE client_id = $1", + ) + .bind(client_id) + .fetch_optional(pool.inner()) + .await + { + Ok(Some(row)) => row, _ => { return Err(( - Status::BadRequest, + Status::Unauthorized, + Json(OAuthErrorResponse { + error: "invalid_client".to_string(), + }), + )); + } + }; + + let db_client_secret: Option = client_row.get("client_secret"); + let is_confidential: bool = client_row.get("is_confidential"); + + if is_confidential { + let provided_secret = form_data.client_secret.ok_or(( + Status::Unauthorized, + Json(OAuthErrorResponse { + error: "invalid_client".to_string(), + }), + ))?; + + let matches = match db_client_secret { + Some(secret) => secret == provided_secret, + None => false, + }; + + if !matches { + return Err(( + Status::Unauthorized, Json(OAuthErrorResponse { error: "invalid_client".to_string(), }), @@ -79,7 +99,7 @@ pub async fn generate_token( } } - // i'm only supporting the password grant incase someone feels lazy. + // i'm only supporting the password grant for the id server. let pid: i32 = match form_data.grant_type { "password" => { let username = form_data.username.ok_or(( @@ -190,4 +210,4 @@ pub async fn generate_token( token_type: "Bearer".to_string(), expires_in: 3600, })) -} +} \ No newline at end of file From 672674f7adf01830247a737b9dff42b4a5e199cb Mon Sep 17 00:00:00 2001 From: red binder Date: Mon, 10 Aug 2026 21:39:11 +0200 Subject: [PATCH 34/37] implement missing routes --- ...e4a98b37c62d596cb0c8c3d1cc1c0199dcb2d.json | 16 + ...00b9bb8716320c6b421395a04f12bd826a469.json | 22 ++ ...192a7dfa8af98c00394978a9627b5ecdae9b5.json | 14 + res/agreement/DEFAULT.xml | 2 +- res/email/confirmationTemplate.html | 19 +- res/email/resetTemplate.html | 190 ++++++++++++ src/email.rs | 34 ++ src/main.rs | 8 + src/nnid/people.rs | 290 +++++++++++++++++- src/nnid/support.rs | 75 ++++- 10 files changed, 639 insertions(+), 31 deletions(-) create mode 100644 .sqlx/query-0edf3f60bfb92912f73b6c61962e4a98b37c62d596cb0c8c3d1cc1c0199dcb2d.json create mode 100644 .sqlx/query-8cd49b3defe144fe73bdeee1ce000b9bb8716320c6b421395a04f12bd826a469.json create mode 100644 .sqlx/query-ffef185a4db4b101477f7a78444192a7dfa8af98c00394978a9627b5ecdae9b5.json create mode 100644 res/email/resetTemplate.html diff --git a/.sqlx/query-0edf3f60bfb92912f73b6c61962e4a98b37c62d596cb0c8c3d1cc1c0199dcb2d.json b/.sqlx/query-0edf3f60bfb92912f73b6c61962e4a98b37c62d596cb0c8c3d1cc1c0199dcb2d.json new file mode 100644 index 0000000..1ae8535 --- /dev/null +++ b/.sqlx/query-0edf3f60bfb92912f73b6c61962e4a98b37c62d596cb0c8c3d1cc1c0199dcb2d.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE users SET\n email = $1,\n email_verified_since = NULL,\n verification_code = $2\n WHERE pid = $3\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "0edf3f60bfb92912f73b6c61962e4a98b37c62d596cb0c8c3d1cc1c0199dcb2d" +} diff --git a/.sqlx/query-8cd49b3defe144fe73bdeee1ce000b9bb8716320c6b421395a04f12bd826a469.json b/.sqlx/query-8cd49b3defe144fe73bdeee1ce000b9bb8716320c6b421395a04f12bd826a469.json new file mode 100644 index 0000000..6ec9f3a --- /dev/null +++ b/.sqlx/query-8cd49b3defe144fe73bdeee1ce000b9bb8716320c6b421395a04f12bd826a469.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE users SET\n gender = COALESCE($1, gender),\n region = COALESCE($2, region),\n country = COALESCE($3, country),\n language = COALESCE($4, language),\n timezone = COALESCE($5, timezone),\n marketing_allowed = COALESCE($6, marketing_allowed),\n off_device_allowed = COALESCE($7, off_device_allowed),\n password = COALESCE($8, password)\n WHERE pid = $9\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Bpchar", + "Int4", + "Varchar", + "Varchar", + "Varchar", + "Bool", + "Bool", + "Varchar", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "8cd49b3defe144fe73bdeee1ce000b9bb8716320c6b421395a04f12bd826a469" +} diff --git a/.sqlx/query-ffef185a4db4b101477f7a78444192a7dfa8af98c00394978a9627b5ecdae9b5.json b/.sqlx/query-ffef185a4db4b101477f7a78444192a7dfa8af98c00394978a9627b5ecdae9b5.json new file mode 100644 index 0000000..e9fb825 --- /dev/null +++ b/.sqlx/query-ffef185a4db4b101477f7a78444192a7dfa8af98c00394978a9627b5ecdae9b5.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM users WHERE pid = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "ffef185a4db4b101477f7a78444192a7dfa8af98c00394978a9627b5ecdae9b5" +} diff --git a/res/agreement/DEFAULT.xml b/res/agreement/DEFAULT.xml index 25d2187..e6ba92a 100644 --- a/res/agreement/DEFAULT.xml +++ b/res/agreement/DEFAULT.xml @@ -1 +1 @@ -USenEnglish2014-09-29T20:07:35NINTENDO-NETWORK-EULA0300USenEspañol2014-09-29T20:07:35NINTENDO-NETWORK-EULA0300 \ No newline at end of file +USenEnglish2014-09-29T20:07:35NINTENDO-NETWORK-EULA0300USenEspañol2014-09-29T20:07:35NINTENDO-NETWORK-EULA0300 \ No newline at end of file diff --git a/res/email/confirmationTemplate.html b/res/email/confirmationTemplate.html index 63753f8..ecb52b3 100644 --- a/res/email/confirmationTemplate.html +++ b/res/email/confirmationTemplate.html @@ -38,7 +38,7 @@ color: #B60000 !important; } img.logo { - content: url("https://spfn.net/res/img/spfn.png") !important; + content: url("https://spfn.spbr.net/res/img/spfn.png") !important; } } @media (prefers-color-scheme: dark) { @@ -91,8 +91,8 @@ @@ -122,19 +122,6 @@ Your Splatfestival Network ID activation is almost complete. - - - - - - - - - - - - -
- - + +
 
 
Enter the following 6-digit code on your console: diff --git a/res/email/resetTemplate.html b/res/email/resetTemplate.html new file mode 100644 index 0000000..84b899a --- /dev/null +++ b/res/email/resetTemplate.html @@ -0,0 +1,190 @@ + + + + + + + + +
Hello {{username}}. Your Splatfestival Network ID password reset has been processed. You may use the temporary password below to log into your account.
+ + + + +
+ + + + +
+ + + + + + +
  + + + + + + + +
 
+ + + + + + + + + + + + + + + + + + + +
+ + + +
 
+ + + + + + +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ Hello {{username}}. +
 
+ Your Splatfestival Network ID password reset has been processed. +
+ You may use the following temporary password to login: +
 
+ {{password}} +
 
+ Please change your password as soon as you can on your Wii U. (Click your mii on the top-left of the Wii U Menu and scroll to "Change Password") +
 
+ The SPFN team +
 
+
 
+
 
+ Note: this email message was auto-generated, please do not respond. For further assistance, please join our Discord server. +
 
+
+
 
+
+
+ + \ No newline at end of file diff --git a/src/email.rs b/src/email.rs index 255fe49..4008994 100644 --- a/src/email.rs +++ b/src/email.rs @@ -36,3 +36,37 @@ pub async fn send_verification_email(to: &str, code: i32, username: &str) -> Res Ok(()) } + +pub async fn send_reset_email(to: &str, pwd: &str, username: &str) -> Result<(), String> { + let smtp_user = env::var("SMTP_USER").map_err(|_| "SMTP_USER not set".to_string())?; + let smtp_pass = env::var("SMTP_PASS").map_err(|_| "SMTP_PASS not set".to_string())?; + let smtp_server = env::var("SMTP_SERVER").map_err(|_| "SMTP_SERVER not set".to_string())?; + + // Load template + let template = fs::read_to_string("res/email/resetTemplate.html") + .map_err(|e| format!("Failed to read email template: {}", e))?; + + // Replace placeholders + let body = template + .replace("{{username}}", username) + .replace("{{password}}", pwd); + + let email = Message::builder() + .from(smtp_user.parse().unwrap()) + .to(to.parse().unwrap()) + .subject("Password Reset for SPFN") + .header(lettre::message::header::ContentType::TEXT_HTML) + .body(body) + .map_err(|e| e.to_string())?; + + let creds = Credentials::new(smtp_user, smtp_pass); + + let mailer = SmtpTransport::relay(&smtp_server) + .map_err(|e| e.to_string())? + .credentials(creds) + .build(); + + mailer.send(&email).map_err(|e| e.to_string())?; + + Ok(()) +} diff --git a/src/main.rs b/src/main.rs index 1ad5ca5..cee7cc5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -101,11 +101,19 @@ async fn launch() -> _ { nnid::support::validate, nnid::support::verify_email, nnid::support::resend_email, + nnid::support::forgotten_password, nnid::people::create_account, nnid::people::get_own_profile, nnid::people::get_device_owner, nnid::people::get_own_device, nnid::people::change_mii, + nnid::people::update_account, + nnid::people::delete_account, + nnid::people::get_user_devices, + nnid::people::get_device_status, + nnid::people::inactivate_current_device, + nnid::people::get_own_emails, + nnid::people::update_primary_email, nnid::miis::get_miis, nnid::oauth::generate_token::generate_token, nnid::provider::get_nex_token, diff --git a/src/nnid/people.rs b/src/nnid/people.rs index 8154392..5f45c08 100644 --- a/src/nnid/people.rs +++ b/src/nnid/people.rs @@ -13,6 +13,7 @@ use nex_account::grpc::{ActStageInfo, ActStageReturn}; use nex_account::grpc_client; use rand::prelude::*; use rocket::serde::{Deserialize, Serialize}; +use rocket::request::{FromRequest, Outcome, Request}; use rocket::{State, get, post, put}; const DATABASE_ERROR: Errors = Errors { @@ -64,6 +65,67 @@ pub struct AccountCreationResponseData { pid: i32, } +#[derive(Serialize)] +#[serde(rename = "device")] +pub struct DeviceInfo { + pub device_id: String, + pub language: String, + pub updated: NaiveDateTime, + pub pid: i32, + pub platform_id: String, + pub region: String, + pub serial_number: String, + pub status: String, + pub system_version: String, + pub r#type: String, + pub updated_by: String, +} + +#[derive(Serialize)] +pub struct DevicesWrapper { + #[serde(rename = "device")] + pub devices: Vec, +} + +#[derive(Serialize)] +pub struct EmptyDeviceResponse { + pub device: String, +} + +#[derive(Deserialize)] +#[serde(rename = "person")] +pub struct UpdateAccountData { + pub gender: Option>, + pub region: Option, + pub country: Option>, + pub language: Option>, + pub tz_name: Option>, + pub marketing_flag: Option, + pub off_device_flag: Option, + pub password: Option>, +} + +#[derive(Serialize)] +pub struct EmailWrapper { + pub email: EmailInfoOwnProfileData, +} + +#[derive(Serialize)] +pub struct EmailsWrapper { + #[serde(rename = "email")] + pub emails: Vec, +} + +#[derive(Deserialize)] +pub struct UpdateEmailData { + pub address: Box, +} + +#[derive(Deserialize)] +pub struct UpdateEmailRequest { + pub email: UpdateEmailData, +} + #[post("/v1/api/people", data = "")] pub async fn create_account( database: &State, @@ -174,17 +236,17 @@ pub async fn create_account( // } #[derive(Serialize)] -struct EmailInfoOwnProfileData { - address: String, - id: u32, - parent: YesNoVal, - primary: YesNoVal, - reachable: YesNoVal, +pub struct EmailInfoOwnProfileData { + pub address: String, + pub id: u32, + pub parent: YesNoVal, + pub primary: YesNoVal, + pub reachable: YesNoVal, #[serde(rename = "type")] - email_type: String, - updated_by: String, - validated: YesNoVal, - validated_date: Option, + pub email_type: String, + pub updated_by: String, + pub validated: YesNoVal, + pub validated_date: Option, } #[derive(Serialize)] @@ -525,6 +587,214 @@ pub async fn thing( println!("Failed to update EULA version for PID {}: {:?}", pid, e); return Err(Some(DATABASE_ERROR)); } + + Ok(()) +} + +pub struct DeviceHeaders { + pub device_id: String, + pub accept_language: String, + pub platform_id: String, + pub region: String, + pub serial_number: String, + pub system_version: String, +} + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for DeviceHeaders { + type Error = Errors<'static>; + + async fn from_request(req: &'r Request<'_>) -> Outcome { + let headers = req.headers(); + + let get_h = |key: &str| headers.get_one(key).map(|s| s.to_string()); + + match ( + get_h("x-nintendo-device-id"), + get_h("accept-language"), + get_h("x-nintendo-platform-id"), + get_h("x-nintendo-region"), + get_h("x-nintendo-serial-number"), + get_h("x-nintendo-system-version"), + ) { + ( + Some(device_id), + Some(accept_language), + Some(platform_id), + Some(region), + Some(serial_number), + Some(system_version), + ) => Outcome::Success(DeviceHeaders { + device_id, + accept_language, + platform_id, + region, + serial_number, + system_version, + }), + _ => Outcome::Error(( + rocket::http::Status::BadRequest, + Errors { + error: &[Error { + code: "1600", + message: "Unable to process request", + }], + }, + )), + } + } +} + +#[get("/v1/api/people/@me/devices")] +pub fn get_user_devices( + auth: Auth, + headers: DeviceHeaders, +) -> Xml { + let now = chrono::Utc::now().naive_utc(); + + Xml(DevicesWrapper { + devices: vec![DeviceInfo { + device_id: headers.device_id, + language: headers.accept_language, + updated: now, + pid: auth.pid, + platform_id: headers.platform_id, + region: headers.region, + serial_number: headers.serial_number, + status: "ACTIVE".to_string(), + system_version: headers.system_version, + r#type: "RETAIL".to_string(), + updated_by: "USER".to_string(), + }], + }) +} + +#[get("/v1/api/people/@me/devices/status")] +pub fn get_device_status(_auth: Auth) -> Xml { + Xml(EmptyDeviceResponse { + device: String::new(), + }) +} + +#[put("/v1/api/people/@me/devices/@current/inactivate")] +pub fn inactivate_current_device(_auth: Auth) -> () { + // just 200 +} + +#[post("/v1/api/people/@me/deletion")] +pub async fn delete_account( + database: &State, + auth: Auth, +) -> Result<(), Option>> { + let db = database.inner(); + + let result = sqlx::query!( + "DELETE FROM users WHERE pid = $1", + auth.pid + ) + .execute(db) + .await; + + if let Err(e) = result { + println!("failed to delete PID {}: {:?}", auth.pid, e); + return Err(Some(DATABASE_ERROR)); + } Ok(()) } + +#[put("/v1/api/people/@me", data = "")] +pub async fn update_account( + database: &State, + auth: Auth, + data: Xml, +) -> Result<(), Option>> { + let db = database.inner(); + let pid = auth.pid; + let data = data.0; + + let updated_password = if let Some(ref new_pass) = data.password { + generate_password(pid, new_pass) + } else { + None + }; + + let result = sqlx::query!( + " + UPDATE users SET + gender = COALESCE($1, gender), + region = COALESCE($2, region), + country = COALESCE($3, country), + language = COALESCE($4, language), + timezone = COALESCE($5, timezone), + marketing_allowed = COALESCE($6, marketing_allowed), + off_device_allowed = COALESCE($7, off_device_allowed), + password = COALESCE($8, password) + WHERE pid = $9 + ", + data.gender.as_deref(), + data.region, + data.country.as_deref(), + data.language.as_deref(), + data.tz_name.as_deref(), + data.marketing_flag.map(|v| v.0), + data.off_device_flag.map(|v| v.0), + updated_password, + pid + ) + .execute(db) + .await; + + if let Err(e) = result { + println!("failed to update account for PID {}: {:?}", pid, e); + return Err(Some(DATABASE_ERROR)); + } + + Ok(()) +} + +#[get("/v1/api/people/@me/emails")] +pub fn get_own_emails(user: Auth) -> Xml { + let profile = build_profile(user.into()); + Xml(EmailsWrapper { + emails: vec![profile.email], + }) +} + +#[put("/v1/api/people/@me/emails/@primary", data = "")] +pub async fn update_primary_email( + database: &State, + auth: Auth, + data: Xml, +) -> Result<(), Option>> { + let db = database.inner(); + let pid = auth.pid; + let new_address = data.0.email.address.to_lowercase(); + let verification_code: i32 = rand::rng().random_range(100_000..1_000_000); + + let result = sqlx::query!( + " + UPDATE users SET + email = $1, + email_verified_since = NULL, + verification_code = $2 + WHERE pid = $3 + ", + new_address, + verification_code, + pid + ) + .execute(db) + .await; + + if let Err(e) = result { + println!("failed to update email for PID {}: {:?}", pid, e); + return Err(Some(DATABASE_ERROR)); + } + + if let Err(e) = send_verification_email(&new_address, verification_code, &auth.username).await { + println!("failed to send verification email: {e}"); + } + + Ok(()) +} \ No newline at end of file diff --git a/src/nnid/support.rs b/src/nnid/support.rs index 715ca1c..aa63349 100644 --- a/src/nnid/support.rs +++ b/src/nnid/support.rs @@ -6,6 +6,8 @@ use rocket::form::Form; use rocket::{FromForm, State, post, put, get, Request}; use rocket::request::{self, FromRequest}; use rocket::http::Status; +use rand::RngExt; +use rand::distr::Alphanumeric; const BAD_CODE_ERROR: Errors = Errors { error: &[Error { @@ -14,6 +16,13 @@ const BAD_CODE_ERROR: Errors = Errors { }], }; +const UNAUTHORIZED_DEVICE_ERROR: Errors = Errors { + error: &[Error { + code: "0113", + message: "Unauthorized device", + }], +}; + #[derive(FromForm)] pub struct ValidateEmailInput { email: String, @@ -45,7 +54,6 @@ pub async fn validate( let email = data.email.trim(); - // 1. Validate presence + basic format if email.is_empty() || !email.contains('@') { return Err(Errors { error: &[Error { @@ -55,7 +63,6 @@ pub async fn validate( }); } - // 2. Extract domain safely let domain = match email.split('@').nth(1) { Some(d) if !d.is_empty() => d, _ => { @@ -68,7 +75,7 @@ pub async fn validate( } }; - // 3. DNS resolver + // This shouldn't ever fail unless there's something wrong with the server let resolver = TokioAsyncResolver::tokio_from_system_conf() .map_err(|_| Errors { error: &[Error { @@ -77,7 +84,6 @@ pub async fn validate( }], })?; - // 4. MX lookup match resolver.mx_lookup(domain).await { Ok(mx) if mx.iter().next().is_some() => Ok(()), @@ -159,5 +165,66 @@ pub async fn resend_email( BAD_CODE_ERROR })?; + Ok(()) +} + +#[get("/v1/api/support/forgotten_password/")] +pub async fn forgotten_password( + database: &State, + pid: i32, +) -> Result<(), Errors<'static>> { + let db = database.inner(); + + let user_data = sqlx::query!( + "SELECT username, email FROM users WHERE pid = $1", + pid + ) + .fetch_optional(db) + .await + .map_err(|e| { + eprintln!("database lookup error: {e}"); + UNAUTHORIZED_DEVICE_ERROR + })?; + + let user = match user_data { + Some(u) => u, + None => return Err(UNAUTHORIZED_DEVICE_ERROR), + }; + + let cleartext_password: String = rand::rng() + .sample_iter(&Alphanumeric) + .take(10) + .map(char::from) + .collect(); + + let nintendo_hash = crate::account::account::generate_password(pid, &cleartext_password) + .ok_or(UNAUTHORIZED_DEVICE_ERROR)?; + + let hashed_password = bcrypt::hash(nintendo_hash, 10) + .map_err(|e| { + eprintln!("bcrypt error: {e}"); + UNAUTHORIZED_DEVICE_ERROR + })?; + + let update_result = sqlx::query!( + "UPDATE users SET password = $1 WHERE pid = $2", + hashed_password, + pid + ) + .execute(db) + .await; + + if let Err(e) = update_result { + eprintln!("failed to update password for PID {pid}: {e}"); + return Err(UNAUTHORIZED_DEVICE_ERROR); + } + + crate::email::send_reset_email(&user.email, &cleartext_password, &user.username) + .await + .map_err(|e| { + eprintln!("failed to send reset email: {e}"); + UNAUTHORIZED_DEVICE_ERROR + })?; + Ok(()) } \ No newline at end of file From fa063d78fb25f37df4ab476b0d404f7730f90db6 Mon Sep 17 00:00:00 2001 From: red binder Date: Mon, 10 Aug 2026 22:08:17 +0200 Subject: [PATCH 35/37] fix bug and sqlx prepare --- ...3de747bba2ce1da198dda4b6f3b78eacfebf3.json | 40 +++++++++++++++++++ ...2256be431b361cfd36754aa41b6da220618cc.json | 15 +++++++ src/nnid/support.rs | 8 +--- 3 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 .sqlx/query-48fd98db66a68865babe4ac6a453de747bba2ce1da198dda4b6f3b78eacfebf3.json create mode 100644 .sqlx/query-6c276038b92bef06b30da32dab42256be431b361cfd36754aa41b6da220618cc.json diff --git a/.sqlx/query-48fd98db66a68865babe4ac6a453de747bba2ce1da198dda4b6f3b78eacfebf3.json b/.sqlx/query-48fd98db66a68865babe4ac6a453de747bba2ce1da198dda4b6f3b78eacfebf3.json new file mode 100644 index 0000000..2619390 --- /dev/null +++ b/.sqlx/query-48fd98db66a68865babe4ac6a453de747bba2ce1da198dda4b6f3b78eacfebf3.json @@ -0,0 +1,40 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT username, email FROM users WHERE pid = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "username", + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "username" + } + } + }, + { + "ordinal": 1, + "name": "email", + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "email" + } + } + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "48fd98db66a68865babe4ac6a453de747bba2ce1da198dda4b6f3b78eacfebf3" +} diff --git a/.sqlx/query-6c276038b92bef06b30da32dab42256be431b361cfd36754aa41b6da220618cc.json b/.sqlx/query-6c276038b92bef06b30da32dab42256be431b361cfd36754aa41b6da220618cc.json new file mode 100644 index 0000000..1e5c7eb --- /dev/null +++ b/.sqlx/query-6c276038b92bef06b30da32dab42256be431b361cfd36754aa41b6da220618cc.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE users SET password = $1 WHERE pid = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "6c276038b92bef06b30da32dab42256be431b361cfd36754aa41b6da220618cc" +} diff --git a/src/nnid/support.rs b/src/nnid/support.rs index aa63349..aac67fc 100644 --- a/src/nnid/support.rs +++ b/src/nnid/support.rs @@ -200,15 +200,9 @@ pub async fn forgotten_password( let nintendo_hash = crate::account::account::generate_password(pid, &cleartext_password) .ok_or(UNAUTHORIZED_DEVICE_ERROR)?; - let hashed_password = bcrypt::hash(nintendo_hash, 10) - .map_err(|e| { - eprintln!("bcrypt error: {e}"); - UNAUTHORIZED_DEVICE_ERROR - })?; - let update_result = sqlx::query!( "UPDATE users SET password = $1 WHERE pid = $2", - hashed_password, + nintendo_hash, pid ) .execute(db) From 124916e62cff7e0a79ea7a022b49c2a1aaf962ee Mon Sep 17 00:00:00 2001 From: red binder Date: Tue, 11 Aug 2026 03:34:00 +0200 Subject: [PATCH 36/37] parental controls --- ...4f25f0636ec0e7c0beed4cdb627c419e407c4.json | 15 ++ res/email/masterKeyTemplate.html | 190 ++++++++++++++++++ res/email/parentalControlsTemplate.html | 177 ++++++++++++++++ src/email.rs | 67 ++++++ src/main.rs | 2 + src/nnid/support.rs | 105 ++++++++++ 6 files changed, 556 insertions(+) create mode 100644 .sqlx/query-7d5d57a9c0065301382767c85de4f25f0636ec0e7c0beed4cdb627c419e407c4.json create mode 100644 res/email/masterKeyTemplate.html create mode 100644 res/email/parentalControlsTemplate.html diff --git a/.sqlx/query-7d5d57a9c0065301382767c85de4f25f0636ec0e7c0beed4cdb627c419e407c4.json b/.sqlx/query-7d5d57a9c0065301382767c85de4f25f0636ec0e7c0beed4cdb627c419e407c4.json new file mode 100644 index 0000000..758b35a --- /dev/null +++ b/.sqlx/query-7d5d57a9c0065301382767c85de4f25f0636ec0e7c0beed4cdb627c419e407c4.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO device_parental_controls (serial_number, email, updated_at)\n VALUES ($1, $2, NOW())\n ON CONFLICT (serial_number)\n DO UPDATE SET email = EXCLUDED.email, updated_at = NOW()\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "7d5d57a9c0065301382767c85de4f25f0636ec0e7c0beed4cdb627c419e407c4" +} diff --git a/res/email/masterKeyTemplate.html b/res/email/masterKeyTemplate.html new file mode 100644 index 0000000..50f3f9c --- /dev/null +++ b/res/email/masterKeyTemplate.html @@ -0,0 +1,190 @@ + + + + + + + + +
Hello. You have requested a reset of parental controls on your console.
+ + + + +
+ + + + +
+ + + + + + +
  + + + + + + + +
 
+ + + + + + + + + + + + + + + + + + + +
+ + + +
 
+ + + + + + +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ Hello. +
 
+ Your email was linked to a Wii U console with serial number {{serial}} for parental controls. +
 
+ You have requested a master key to reset your parental controls PIN. The master key you must enter on your Wii U is: +
 
+ {{mkey}} +
 
+ Please make sure to change your PIN as soon as possible. +
+ The SPFN team +
 
+
 
+
 
+ Note: this email message was auto-generated, please do not respond. For further assistance, please join our Discord server. +
 
+
+
 
+
+
+ + \ No newline at end of file diff --git a/res/email/parentalControlsTemplate.html b/res/email/parentalControlsTemplate.html new file mode 100644 index 0000000..92c1cdb --- /dev/null +++ b/res/email/parentalControlsTemplate.html @@ -0,0 +1,177 @@ + + + + + + + + +
Hello. The console with the serial number {{serial}} has been linked to your email for parental controls.
+ + + + +
+ + + + +
+ + + + + + +
  + + + + + + + +
 
+ + + + + + + + + + + + + + + + + + + +
+ + + +
 
+ + + + + + +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ Hello. +
 
+ Your email was linked to a Wii U console with serial number {{serial}} for parental controls. +
 
+ If you did not authorize this, please contact our team at support@spbr.net. +
 
+ The SPFN team +
 
+
 
+
 
+ Note: this email message was auto-generated, please do not respond. For further assistance, please join our Discord server. +
 
+
+
 
+
+
+ + \ No newline at end of file diff --git a/src/email.rs b/src/email.rs index 4008994..b0ebd9f 100644 --- a/src/email.rs +++ b/src/email.rs @@ -70,3 +70,70 @@ pub async fn send_reset_email(to: &str, pwd: &str, username: &str) -> Result<(), Ok(()) } + +pub async fn send_pc_email(to: &str, serial: &str) -> Result<(), String> { + let smtp_user = env::var("SMTP_USER").map_err(|_| "SMTP_USER not set".to_string())?; + let smtp_pass = env::var("SMTP_PASS").map_err(|_| "SMTP_PASS not set".to_string())?; + let smtp_server = env::var("SMTP_SERVER").map_err(|_| "SMTP_SERVER not set".to_string())?; + + // Load template + let template = fs::read_to_string("res/email/parentalControlsTemplate.html") + .map_err(|e| format!("Failed to read email template: {}", e))?; + + // Replace placeholders + let body = template + .replace("{{serial}}", serial); + + let email = Message::builder() + .from(smtp_user.parse().unwrap()) + .to(to.parse().unwrap()) + .subject("Parental controls confirmation for SPFN") + .header(lettre::message::header::ContentType::TEXT_HTML) + .body(body) + .map_err(|e| e.to_string())?; + + let creds = Credentials::new(smtp_user, smtp_pass); + + let mailer = SmtpTransport::relay(&smtp_server) + .map_err(|e| e.to_string())? + .credentials(creds) + .build(); + + mailer.send(&email).map_err(|e| e.to_string())?; + + Ok(()) +} + +pub async fn send_reset_pin_email(to: &str, serial: &str, master_key: &str) -> Result<(), String> { + let smtp_user = env::var("SMTP_USER").map_err(|_| "SMTP_USER not set".to_string())?; + let smtp_pass = env::var("SMTP_PASS").map_err(|_| "SMTP_PASS not set".to_string())?; + let smtp_server = env::var("SMTP_SERVER").map_err(|_| "SMTP_SERVER not set".to_string())?; + + // Load template + let template = fs::read_to_string("res/email/masterKeyTemplate.html") + .map_err(|e| format!("Failed to read email template: {}", e))?; + + // Replace placeholders + let body = template + .replace("{{serial}}", serial) + .replace("{{mkey}}", master_key); + + let email = Message::builder() + .from(smtp_user.parse().unwrap()) + .to(to.parse().unwrap()) + .subject("Parental controls PIN reset for SPFN") + .header(lettre::message::header::ContentType::TEXT_HTML) + .body(body) + .map_err(|e| e.to_string())?; + + let creds = Credentials::new(smtp_user, smtp_pass); + + let mailer = SmtpTransport::relay(&smtp_server) + .map_err(|e| e.to_string())? + .credentials(creds) + .build(); + + mailer.send(&email).map_err(|e| e.to_string())?; + + Ok(()) +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index cee7cc5..622d3ed 100644 --- a/src/main.rs +++ b/src/main.rs @@ -102,6 +102,8 @@ async fn launch() -> _ { nnid::support::verify_email, nnid::support::resend_email, nnid::support::forgotten_password, + nnid::support::send_parental_controls_pin, + nnid::support::send_forgotten_pin, nnid::people::create_account, nnid::people::get_own_profile, nnid::people::get_device_owner, diff --git a/src/nnid/support.rs b/src/nnid/support.rs index aac67fc..f119ef9 100644 --- a/src/nnid/support.rs +++ b/src/nnid/support.rs @@ -220,5 +220,110 @@ pub async fn forgotten_password( UNAUTHORIZED_DEVICE_ERROR })?; + Ok(()) +} + +pub struct DeviceSerial(pub String); + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for DeviceSerial { + type Error = Errors<'static>; + + async fn from_request(req: &'r Request<'_>) -> request::Outcome { + match req.headers().get_one("x-nintendo-serial-number") { + Some(val) if !val.trim().is_empty() => { + request::Outcome::Success(DeviceSerial(val.to_string())) + } + _ => request::Outcome::Error(( + Status::BadRequest, + Errors { + error: &[Error { + code: "0130", + message: "Serial not found", + }], + }, + )), + } + } +} + +#[get("/v1/api/support/send_confirmation/pin/")] +pub async fn send_parental_controls_pin( + database: &State, + serial: DeviceSerial, + email: &str, +) -> Result<(), Errors<'static>> { + let db = database.inner(); + let serial_number = serial.0; + let email = email.trim().to_lowercase(); + + if email.is_empty() || !email.contains('@') { + return Err(Errors { + error: &[Error { + code: "0103", + message: "Email format is invalid", + }], + }); + } + + let db_result = sqlx::query!( + " + INSERT INTO device_parental_controls (serial_number, email, updated_at) + VALUES ($1, $2, NOW()) + ON CONFLICT (serial_number) + DO UPDATE SET email = EXCLUDED.email, updated_at = NOW() + ", + serial_number, + email + ) + .execute(db) + .await; + + if let Err(e) = db_result { + eprintln!("Failed to associate serial {serial_number} with email {email}: {e}"); + return Err(Errors { + error: &[Error { + code: "0130", + message: "PID has not been registered yet", + }], + }); + } + + crate::email::send_pc_email(&email, &serial_number) + .await + .map_err(|e| { + eprintln!("Failed to send parental controls email to {email}: {e}"); + Errors { + error: &[Error { + code: "0130", + message: "PID has not been registered yet", + }], + } + })?; + + Ok(()) +} + +#[get("/v1/api/support/send_forgotten/pin//")] +pub async fn send_forgotten_pin( + serial: DeviceSerial, + email: &str, + master_key: &str, +) -> Result<(), Errors<'static>> { + let serial_number = serial.0; + let email = email.trim().to_lowercase(); + + crate::email::send_reset_pin_email(&email, &serial_number, &master_key) + .await + .map_err(|e| { + eprintln!("Failed to send parental controls email to {email}: {e}"); + Errors { + error: &[Error { + code: "0130", + message: "PID has not been registered yet", + }], + } + })?; + Ok(()) } \ No newline at end of file From 82b5bb36c5fd6a05b2b2539027b2bac8472fd375 Mon Sep 17 00:00:00 2001 From: red binder Date: Tue, 11 Aug 2026 04:35:12 +0200 Subject: [PATCH 37/37] force bearer auth no idea if this is right but i want to protect accounts --- src/nnid/people.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/nnid/people.rs b/src/nnid/people.rs index 5f45c08..c81b4b2 100644 --- a/src/nnid/people.rs +++ b/src/nnid/people.rs @@ -647,7 +647,7 @@ impl<'r> FromRequest<'r> for DeviceHeaders { #[get("/v1/api/people/@me/devices")] pub fn get_user_devices( - auth: Auth, + auth: Auth, headers: DeviceHeaders, ) -> Xml { let now = chrono::Utc::now().naive_utc(); @@ -670,21 +670,21 @@ pub fn get_user_devices( } #[get("/v1/api/people/@me/devices/status")] -pub fn get_device_status(_auth: Auth) -> Xml { +pub fn get_device_status(_auth: Auth) -> Xml { Xml(EmptyDeviceResponse { device: String::new(), }) } #[put("/v1/api/people/@me/devices/@current/inactivate")] -pub fn inactivate_current_device(_auth: Auth) -> () { +pub fn inactivate_current_device(_auth: Auth) -> () { // just 200 } #[post("/v1/api/people/@me/deletion")] pub async fn delete_account( database: &State, - auth: Auth, + auth: Auth, ) -> Result<(), Option>> { let db = database.inner(); @@ -706,7 +706,7 @@ pub async fn delete_account( #[put("/v1/api/people/@me", data = "")] pub async fn update_account( database: &State, - auth: Auth, + auth: Auth, data: Xml, ) -> Result<(), Option>> { let db = database.inner(); @@ -764,7 +764,7 @@ pub fn get_own_emails(user: Auth) -> Xml { #[put("/v1/api/people/@me/emails/@primary", data = "")] pub async fn update_primary_email( database: &State, - auth: Auth, + auth: Auth, data: Xml, ) -> Result<(), Option>> { let db = database.inner();