From 61e9c2ac5cb790e182b7b8a410a34d75ecb29c05 Mon Sep 17 00:00:00 2001 From: shadow cat Date: Mon, 16 Feb 2026 23:56:07 -0500 Subject: [PATCH] ACCOUNT CREATION AND LOGIN --- Cargo.lock | 1926 ++++++++++++++++++++++++++++++- Cargo.toml | 15 +- src/bin/client/assets/orage.jpg | Bin 0 -> 151721 bytes src/bin/client/data.rs | 48 - src/bin/client/data/mod.rs | 42 + src/bin/client/data/ver.rs | 58 + src/bin/client/main.rs | 6 +- src/bin/client/net.rs | 45 +- src/bin/client/ui/color.rs | 1 + src/bin/client/ui/connect.rs | 260 ++--- src/bin/client/ui/misc.rs | 12 +- src/bin/server/main.rs | 50 +- src/bin/server/net.rs | 2 +- src/net/conversion.rs | 8 +- src/net/data.rs | 32 +- src/net/msg.rs | 20 +- src/rsc.rs | 123 +- 17 files changed, 2322 insertions(+), 326 deletions(-) create mode 100644 src/bin/client/assets/orage.jpg delete mode 100644 src/bin/client/data.rs create mode 100644 src/bin/client/data/mod.rs create mode 100644 src/bin/client/data/ver.rs diff --git a/Cargo.lock b/Cargo.lock index 9ff5513..e3e7c74 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,6 +24,51 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common 0.1.7", + "generic-array", +] + +[[package]] +name = "aegis" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae1572243695de9c6c8d16c7889899abac907d14c148f1939d837122bbeca79" +dependencies = [ + "cc", + "softaes", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + [[package]] name = "ahash" version = "0.8.12" @@ -37,6 +82,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + [[package]] name = "aligned" version = "0.4.3" @@ -82,6 +136,20 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "android-native-keyring-store" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e473c725eac862e418e7c3296059e72cdb7bbfb6ffefe625a452be988b2cd44f" +dependencies = [ + "base64", + "jni", + "keyring-core", + "ndk-context", + "thiserror 2.0.18", + "tracing", +] + [[package]] name = "android-properties" version = "0.2.2" @@ -153,6 +221,17 @@ version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +[[package]] +name = "apple-native-keyring-store" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6afd4ee68bf127d37d2eca62ec6ddb5871b58722273c8b6809119a51b4042111" +dependencies = [ + "keyring-core", + "log", + "security-framework", +] + [[package]] name = "arbitrary" version = "1.4.2" @@ -180,6 +259,15 @@ dependencies = [ "x11rb", ] +[[package]] +name = "arc-swap" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5" +dependencies = [ + "rustversion", +] + [[package]] name = "arg_enum_proc_macro" version = "0.3.4" @@ -266,6 +354,137 @@ dependencies = [ "syn", ] +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.3", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix 1.1.3", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.3", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -333,6 +552,29 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.11.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn", + "which", +] + [[package]] name = "bit-set" version = "0.8.0" @@ -426,6 +668,15 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + [[package]] name = "block2" version = "0.5.1" @@ -435,6 +686,38 @@ dependencies = [ "objc2 0.5.2", ] +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "branches" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e426eb5cc1900033930ec955317b302e68f19f326cc7bb0c8a86865a826cdf0c" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "built" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" +dependencies = [ + "chrono", + "git2", +] + [[package]] name = "built" version = "0.8.0" @@ -517,6 +800,15 @@ dependencies = [ "wayland-client", ] +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + [[package]] name = "cc" version = "1.2.54" @@ -535,6 +827,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom 7.1.3", +] + [[package]] name = "cfg-if" version = "1.0.4" @@ -547,6 +848,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "cfg_block" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18758054972164c3264f7c8386f5fc6da6114cb46b619fd365d4e3b2dc3ae487" + [[package]] name = "chacha20" version = "0.10.0-rc.9" @@ -558,6 +865,19 @@ dependencies = [ "rand_core 0.10.0-rc-6", ] +[[package]] +name = "chrono" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "cipher" version = "0.4.4" @@ -569,10 +889,21 @@ dependencies = [ ] [[package]] -name = "clap" -version = "4.5.54" +name = "clang-sys" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5caf74d17c3aec5495110c34cc3f78644bfa89af6c8993ed4de2790e49b6499" dependencies = [ "clap_builder", "clap_derive", @@ -580,9 +911,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.54" +version = "4.5.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" +checksum = "370daa45065b80218950227371916a1633217ae42b2715b2287b606dcd618e24" dependencies = [ "anstream", "anstyle", @@ -592,9 +923,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" dependencies = [ "heck", "proc-macro2", @@ -604,9 +935,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" +checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" [[package]] name = "clipboard-win" @@ -625,7 +956,7 @@ checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ "serde", "termcolor", - "unicode-width", + "unicode-width 0.2.2", ] [[package]] @@ -700,7 +1031,7 @@ dependencies = [ "bitflags 1.3.2", "core-foundation 0.9.4", "core-graphics-types 0.1.3", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -786,6 +1117,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -834,6 +1174,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] @@ -846,6 +1187,15 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + [[package]] name = "cursor-icon" version = "1.2.0" @@ -891,6 +1241,7 @@ dependencies = [ "lock_api", "once_cell", "parking_lot_core", + "serde", ] [[package]] @@ -899,6 +1250,19 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +[[package]] +name = "db-keystore" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98e7a76c30fd9fcb0b9e46a848028bb82d8cc9854fb3d4f9db8851b7db2648fe" +dependencies = [ + "futures", + "keyring-core", + "regex", + "turso", + "uuid", +] + [[package]] name = "dbus" version = "0.9.10" @@ -916,10 +1280,29 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "708b509edf7889e53d7efb0ffadd994cc6c2345ccb62f55cfd6b0682165e4fa6" dependencies = [ + "aes", + "block-padding", + "cbc", "dbus", + "fastrand", + "hkdf", + "num", + "once_cell", + "openssl", + "sha2 0.10.9", "zeroize", ] +[[package]] +name = "dbus-secret-service-keyring-store" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fec3a0f31addb56ee6d5c55599068d2093bc737469a448b34e426603ef61f93e" +dependencies = [ + "dbus-secret-service", + "keyring-core", +] + [[package]] name = "der-parser" version = "10.0.0" @@ -943,6 +1326,27 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + [[package]] name = "digest" version = "0.10.7" @@ -1071,6 +1475,12 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + [[package]] name = "enum_dispatch" version = "0.3.13" @@ -1083,6 +1493,46 @@ dependencies = [ "syn", ] +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "env_filter" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" +dependencies = [ + "log", +] + +[[package]] +name = "env_logger" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" +dependencies = [ + "env_filter", + "log", +] + [[package]] name = "equator" version = "0.4.2" @@ -1125,6 +1575,27 @@ version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "exr" version = "1.74.0" @@ -1140,6 +1611,12 @@ dependencies = [ "zune-inflate", ] +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + [[package]] name = "fastbloom" version = "0.14.1" @@ -1285,6 +1762,15 @@ dependencies = [ "ttf-parser", ] +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -1292,7 +1778,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -1306,34 +1792,125 @@ dependencies = [ "syn", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "foreign-types-shared" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] -name = "futures-task" -version = "0.3.31" +name = "futures-executor" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -1346,6 +1923,21 @@ dependencies = [ "byteorder", ] +[[package]] +name = "genawaiter" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86bd0361bcbde39b13475e6e36cb24c329964aa2611be285289d1e4b751c1a0" +dependencies = [ + "genawaiter-macro", +] + +[[package]] +name = "genawaiter-macro" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b32dfe1fdfc0bbde1f22a5da25355514b5e450c33a6af6770884c8750aedfbc" + [[package]] name = "generic-array" version = "0.14.7" @@ -1407,6 +1999,16 @@ dependencies = [ "wasip3", ] +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "gif" version = "0.14.1" @@ -1417,6 +2019,19 @@ dependencies = [ "weezl", ] +[[package]] +name = "git2" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b88256088d75a56f8ecfa070513a775dd9107f6530ef14919dac831af9cfe2b" +dependencies = [ + "bitflags 2.11.0", + "libc", + "libgit2-sys", + "log", + "url", +] + [[package]] name = "gl_generator" version = "0.14.0" @@ -1434,6 +2049,12 @@ version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74a4d85559e2637d3d839438b5b3d75c31e655276f9544d72475c36b92fabbed" +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + [[package]] name = "glow" version = "0.16.0" @@ -1583,12 +2204,27 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "hexf-parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + [[package]] name = "hmac" version = "0.12.1" @@ -1598,6 +2234,25 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + [[package]] name = "hybrid-array" version = "0.4.6" @@ -1607,12 +2262,138 @@ dependencies = [ "typenum", ] +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + [[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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + [[package]] name = "image" version = "0.25.9" @@ -1671,6 +2452,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ + "block-padding", "generic-array", ] @@ -1694,6 +2476,26 @@ dependencies = [ "compare", ] +[[package]] +name = "intrusive-collections" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" +dependencies = [ + "memoffset", +] + +[[package]] +name = "io-uring" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd7bddefd0a8833b88a4b68f90dae22c7450d11b354198baee3874fd811b344" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "libc", +] + [[package]] name = "iris" version = "0.1.0" @@ -1737,6 +2539,15 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.14.0" @@ -1796,19 +2607,41 @@ dependencies = [ [[package]] name = "keyring" -version = "3.6.3" +version = "4.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c" +checksum = "39bbe20062ef0c05c6c0f215d3a84eb1288fea17c2c4fa3a10e9e8ec9ff741f0" dependencies = [ - "byteorder", - "dbus-secret-service", - "log", - "security-framework 2.11.1", - "security-framework 3.5.1", - "windows-sys 0.60.2", + "android-native-keyring-store", + "apple-native-keyring-store", + "base64", + "clap", + "db-keystore", + "dbus-secret-service-keyring-store", + "fastrand", + "keyring-core", + "linux-keyutils-keyring-store", + "rpassword", + "rprompt", + "windows-native-keyring-store", + "zbus-secret-service-keyring-store", "zeroize", ] +[[package]] +name = "keyring-core" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f668c4c52e5e79879d9ce68b2da363b78a378c4becae267f8cfc26c55db4ed3" +dependencies = [ + "chrono", + "dashmap", + "log", + "regex", + "ron 0.11.0", + "serde", + "uuid", +] + [[package]] name = "khronos-egl" version = "6.0.0" @@ -1832,6 +2665,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "leb128fmt" version = "0.1.0" @@ -1856,6 +2695,7 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" dependencies = [ + "cc", "pkg-config", ] @@ -1869,6 +2709,18 @@ dependencies = [ "cc", ] +[[package]] +name = "libgit2-sys" +version = "0.18.3+1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9b3acc4b91781bb0b3386669d325163746af5f6e4f73e6d2d630e09a35f3487" +dependencies = [ + "cc", + "libc", + "libz-sys", + "pkg-config", +] + [[package]] name = "libloading" version = "0.8.9" @@ -1885,6 +2737,16 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" +[[package]] +name = "libmimalloc-sys" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "libredox" version = "0.1.12" @@ -1896,12 +2758,44 @@ dependencies = [ "redox_syscall 0.7.0", ] +[[package]] +name = "libz-sys" +version = "1.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linebender_resource_handle" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" +[[package]] +name = "linux-keyutils" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761e49ec5fd8a5a463f9b84e877c373d888935b71c6be78f3767fe2ae6bed18e" +dependencies = [ + "bitflags 2.11.0", + "libc", +] + +[[package]] +name = "linux-keyutils-keyring-store" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ce18cd294ff2e5de4ad61a8659a123e068859feafce12525511931f4f3d1a4" +dependencies = [ + "keyring-core", + "linux-keyutils", +] + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -1914,6 +2808,12 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + [[package]] name = "litrs" version = "1.0.0" @@ -1990,6 +2890,15 @@ dependencies = [ "libc", ] +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + [[package]] name = "maybe-rayon" version = "0.1.1" @@ -2015,6 +2924,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "metal" version = "0.32.0" @@ -2024,7 +2942,7 @@ dependencies = [ "bitflags 2.11.0", "block", "core-graphics-types 0.2.0", - "foreign-types", + "foreign-types 0.5.0", "log", "objc", "paste", @@ -2039,12 +2957,43 @@ dependencies = [ "bitflags 2.11.0", "block", "core-graphics-types 0.2.0", - "foreign-types", + "foreign-types 0.5.0", "log", "objc", "paste", ] +[[package]] +name = "miette" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" +dependencies = [ + "cfg-if", + "miette-derive", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "mimalloc" +version = "0.1.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8" +dependencies = [ + "libmimalloc-sys", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -2195,6 +3144,29 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -2205,6 +3177,15 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + [[package]] name = "num-conv" version = "0.2.0" @@ -2231,6 +3212,17 @@ 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-rational" version = "0.4.2" @@ -2583,12 +3575,66 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "openssl-probe" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" +[[package]] +name = "openssl-src" +version = "300.5.5+3.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f1787d533e03597a7934fd0a765f0d28e94ecc5fb7789f8053b1e699a56f709" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + [[package]] name = "openworm" version = "0.1.0" @@ -2597,17 +3643,20 @@ dependencies = [ "bitcode", "clap", "dashmap", + "derive_more", "directories-next", "ed25519-dalek", "fjall", "iris", "keyring", + "keyring-core", "pollster", "quinn", "rand 0.10.0-rc.8", "rcgen", - "ron", + "ron 0.12.0", "scrypt", + "serde", "time", "tokio", "tracing", @@ -2635,6 +3684,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "os_pipe" version = "1.2.3" @@ -2654,6 +3713,21 @@ dependencies = [ "ttf-parser", ] +[[package]] +name = "pack1" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6e7cd9bd638dc2c831519a0caa1c006cab771a92b1303403a8322773c5b72d6" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.5" @@ -2764,10 +3838,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] -name = "pin-utils" -version = "0.1.0" +name = "piper" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] [[package]] name = "pkg-config" @@ -2808,6 +3887,18 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "portable-atomic" version = "1.13.0" @@ -2823,6 +3914,15 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2891,6 +3991,29 @@ dependencies = [ "syn", ] +[[package]] +name = "prost" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "pxfm" version = "0.1.27" @@ -3073,6 +4196,15 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" +[[package]] +name = "rapidhash" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111325c42c4bafae99e777cd77b40dea9a2b30c69e9d8c74b6eccd7fba4337de" +dependencies = [ + "rustversion", +] + [[package]] name = "rav1e" version = "0.8.1" @@ -3086,10 +4218,10 @@ dependencies = [ "av-scenechange", "av1-grain", "bitstream-io", - "built", + "built 0.8.0", "cfg-if", "interpolate_name", - "itertools", + "itertools 0.14.0", "libc", "libfuzzer-sys", "log", @@ -3222,6 +4354,35 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" + [[package]] name = "renderdoc-sys" version = "1.1.0" @@ -3248,6 +4409,29 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "roaring" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ba9ce64a8f45d7fc86358410bb1a82e8c987504c0d4900e9141d69a9f26c885" +dependencies = [ + "bytemuck", + "byteorder", +] + +[[package]] +name = "ron" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db09040cc89e461f1a265139777a2bde7f8d8c67c4936f700c63ce3e2904d468" +dependencies = [ + "base64", + "bitflags 2.11.0", + "serde", + "serde_derive", + "unicode-ident", +] + [[package]] name = "ron" version = "0.12.0" @@ -3268,6 +4452,37 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" +[[package]] +name = "rpassword" +version = "7.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39" +dependencies = [ + "libc", + "rtoolbox", + "windows-sys 0.59.0", +] + +[[package]] +name = "rprompt" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69abf524bb9ccb7c071f7231441288d74b48d176cb309eb00e6f77d186c6e035" +dependencies = [ + "rtoolbox", + "windows-sys 0.59.0", +] + +[[package]] +name = "rtoolbox" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7cc970b249fbe527d6e02e0a227762c9108b2f49d81094fe357ffc6d14d7f6f" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "rustc-hash" version = "1.1.0" @@ -3347,7 +4562,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.5.1", + "security-framework", ] [[package]] @@ -3375,7 +4590,7 @@ dependencies = [ "rustls-native-certs", "rustls-platform-verifier-android", "rustls-webpki", - "security-framework 3.5.1", + "security-framework", "security-framework-sys", "webpki-root-certs", "windows-sys 0.61.2", @@ -3404,6 +4619,12 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + [[package]] name = "salsa20" version = "0.10.2" @@ -3469,16 +4690,22 @@ dependencies = [ ] [[package]] -name = "security-framework" -version = "2.11.1" +name = "secret-service" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +checksum = "9a62d7f86047af0077255a29494136b9aaaf697c76ff70b8e49cded4e2623c14" dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", + "aes", + "cbc", + "futures-util", + "generic-array", + "getrandom 0.2.17", + "hkdf", + "num", + "once_cell", + "serde", + "sha2 0.10.9", + "zbus", ] [[package]] @@ -3559,6 +4786,17 @@ dependencies = [ "zmij", ] +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sfa" version = "1.0.0" @@ -3570,6 +4808,12 @@ dependencies = [ "xxhash-rust", ] +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + [[package]] name = "sha2" version = "0.10.9" @@ -3592,6 +4836,15 @@ dependencies = [ "digest 0.11.0-rc.9", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" @@ -3629,6 +4882,15 @@ dependencies = [ "quote", ] +[[package]] +name = "simsimd" +version = "6.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f81af684ca3dc160907f1478d779bdfd8bae52f55f4c58caba0229670a83a0d" +dependencies = [ + "cc", +] + [[package]] name = "siphasher" version = "1.0.1" @@ -3720,6 +4982,12 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "softaes" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fef461faaeb36c340b6c887167a9054a034f6acfc50a014ead26a02b4356b3de" + [[package]] name = "spin" version = "0.9.8" @@ -3762,6 +5030,28 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + [[package]] name = "subtle" version = "2.6.1" @@ -3872,6 +5162,15 @@ dependencies = [ "syn", ] +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + [[package]] name = "tiff" version = "0.10.3" @@ -3944,6 +5243,16 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.10.0" @@ -4029,6 +5338,18 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786d480bce6247ab75f005b14ae1624ad978d3029d9113f0a22fa1ac773faeaf" +dependencies = [ + "crossbeam-channel", + "thiserror 2.0.18", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.31" @@ -4047,6 +5368,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", ] [[package]] @@ -4069,11 +5420,187 @@ dependencies = [ "core_maths", ] +[[package]] +name = "turso" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f2fe423c2c954948babb36edda12b737e321d8541d4eae519694f7d512ecab6" +dependencies = [ + "mimalloc", + "thiserror 2.0.18", + "tracing", + "tracing-subscriber", + "turso_sdk_kit", + "turso_sync_sdk_kit", +] + +[[package]] +name = "turso_core" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a8b54994ee025964459322bcdb4f6f78c5dba82643863dabfac680f16c8afa8" +dependencies = [ + "aegis", + "aes", + "aes-gcm", + "arc-swap", + "bitflags 2.11.0", + "branches", + "built 0.7.7", + "bumpalo", + "bytemuck", + "cfg_block", + "chrono", + "crossbeam-skiplist", + "either", + "fallible-iterator", + "fastbloom", + "hex", + "intrusive-collections", + "io-uring", + "libc", + "libloading", + "libm", + "miette", + "pack1", + "parking_lot", + "paste", + "polling", + "rand 0.9.2", + "rapidhash", + "regex", + "regex-syntax", + "roaring", + "rustc-hash 2.1.1", + "rustix 1.1.3", + "ryu", + "simsimd", + "strum", + "strum_macros", + "tempfile", + "thiserror 2.0.18", + "tracing", + "tracing-subscriber", + "turso_ext", + "turso_macros", + "turso_parser", + "twox-hash", + "uncased", + "uuid", +] + +[[package]] +name = "turso_ext" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2de917b4c5881bfb34ccbb1dcf4992773bc39853eacf248955f2ece7e3cb3049" +dependencies = [ + "chrono", + "getrandom 0.3.4", + "turso_macros", +] + +[[package]] +name = "turso_macros" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2f62bb271d4cf202bc2acbeb8e2c3f764ec754924f144e704cdcba2e5b0c84" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "turso_parser" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ad89caa1c4888756bd027485499d1dc4c8420d15887ab32aa28b707c411221" +dependencies = [ + "bitflags 2.11.0", + "memchr", + "miette", + "strum", + "strum_macros", + "thiserror 2.0.18", + "turso_macros", +] + +[[package]] +name = "turso_sdk_kit" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00ff5b2cadd6c8b749511648d50c95f69bfa52efc5d88cc2e2deedd0beeb6c89" +dependencies = [ + "bindgen", + "env_logger", + "tracing", + "tracing-appender", + "tracing-subscriber", + "turso_core", + "turso_sdk_kit_macros", +] + +[[package]] +name = "turso_sdk_kit_macros" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "289f7ea7499419e6670363ca18e954ed53397bb1e03ab7eabbb267d9b05ab836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "turso_sync_engine" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea9860c615a7d8df43fc6ac4293636e9d743c1693513c81be22f0e9388624f58" +dependencies = [ + "base64", + "bytes", + "genawaiter", + "http", + "libc", + "prost", + "roaring", + "serde", + "serde_json", + "thiserror 2.0.18", + "tracing", + "turso_core", + "turso_parser", + "uuid", +] + +[[package]] +name = "turso_sync_sdk_kit" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b669b19a5f4bfa7cfdf5045af36ca4a2087431c0d2844ec539ddcf951b5c9d2" +dependencies = [ + "bindgen", + "env_logger", + "genawaiter", + "parking_lot", + "tracing", + "tracing-appender", + "tracing-subscriber", + "turso_core", + "turso_sdk_kit", + "turso_sdk_kit_macros", + "turso_sync_engine", +] + [[package]] name = "twox-hash" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" +dependencies = [ + "rand 0.9.2", +] [[package]] name = "typeid" @@ -4087,6 +5614,26 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + +[[package]] +name = "uncased" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.18" @@ -4117,6 +5664,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "unicode-width" version = "0.2.2" @@ -4129,18 +5682,59 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common 0.1.7", + "subtle", +] + [[package]] name = "untrusted" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "getrandom 0.3.4", + "js-sys", + "serde_core", + "sha1_smol", + "wasm-bindgen", +] + [[package]] name = "v_frame" version = "0.3.9" @@ -4152,12 +5746,24 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "varint-rs" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f54a172d0620933a27a4360d3db3e2ae0dd6cceae9730751a036bbf182c4b23" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" @@ -4736,6 +6342,18 @@ dependencies = [ "web-sys", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.44", +] + [[package]] name = "winapi" version = "0.3.9" @@ -4885,6 +6503,19 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-native-keyring-store" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0e26ac29479a4b7f49d46afc9893122fc345430c6307d1fb7ac0d8d066c3f54" +dependencies = [ + "byteorder", + "keyring-core", + "regex", + "windows-sys 0.61.2", + "zeroize", +] + [[package]] name = "windows-numerics" version = "0.3.1" @@ -5345,6 +6976,12 @@ dependencies = [ "wayland-protocols-wlr", ] +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + [[package]] name = "x11-dl" version = "2.21.0" @@ -5453,6 +7090,101 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfeff997a0aaa3eb20c4652baf788d2dfa6d2839a0ead0b3ff69ce2f9c4bdd1" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix 1.1.3", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus-secret-service-keyring-store" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf419566ebb630f83a49d67ef0b6c719c827fa04a8486a19f0808102d5a7f9ea" +dependencies = [ + "keyring-core", + "secret-service", + "zbus", +] + +[[package]] +name = "zbus_macros" +version = "5.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bbd5a90dbe8feee5b13def448427ae314ccd26a49cac47905cafefb9ff846f1" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow", + "zvariant", +] + [[package]] name = "zeno" version = "0.3.3" @@ -5479,6 +7211,27 @@ dependencies = [ "syn", ] +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.2" @@ -5499,6 +7252,39 @@ dependencies = [ "syn", ] +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "zmij" version = "1.0.17" @@ -5571,3 +7357,43 @@ checksum = "2959ca473aae96a14ecedf501d20b3608d2825ba280d5adb57d651721885b0c2" dependencies = [ "zune-core 0.5.1", ] + +[[package]] +name = "zvariant" +version = "5.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b64ef4f40c7951337ddc7023dd03528a57a3ce3408ee9da5e948bd29b232c4" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "484d5d975eb7afb52cc6b929c13d3719a20ad650fea4120e6310de3fc55e415c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn", + "winnow", +] diff --git a/Cargo.toml b/Cargo.toml index c904f5e..d3e25be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,4 @@ -cargo-features = ["codegen-backend"] +# cargo-features = ["codegen-backend"] [package] name = "openworm" @@ -23,11 +23,14 @@ clap = { version = "4.5.53", features = ["derive"] } scrypt = "0.11.0" ed25519-dalek = { version = "3.0.0-pre.2", features = ["rand_core"] } rand = { version = "0.10.0-rc.5", features = ["chacha", "sys_rng"] } -keyring = { version = "3.6.3", features = ["apple-native", "sync-secret-service", "windows-native"] } +keyring = { version = "4.0.0-rc.3" } bitcode = "0.6.9" dashmap = "6.1.0" fjall = "3.0.1" time = { version = "0.3.47", features = ["local-offset"] } +serde = { version = "1.0.228", features = ["derive"] } +derive_more = { version = "2.1.1", features = ["deref", "deref_mut"] } +keyring-core = "0.7.2" [[bin]] name = "openworm-client" @@ -37,8 +40,8 @@ path = "src/bin/client/main.rs" name = "openworm-server" path = "src/bin/server/main.rs" -[profile.dev] -codegen-backend = "cranelift" +# [profile.dev] +# codegen-backend = "cranelift" -[profile.dev.package."*"] -opt-level = 1 +# [profile.dev.package."*"] +# opt-level = 1 diff --git a/src/bin/client/assets/orage.jpg b/src/bin/client/assets/orage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25cdb6dc55d8b36d1d409638458a86997878fe17 GIT binary patch literal 151721 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�V$QR;&l8|*Afkv%xs*-ym!HuJe9ly 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 NJ1L+ocKTc2{{Vf3XY>F7 literal 0 HcmV?d00001 diff --git a/src/bin/client/data.rs b/src/bin/client/data.rs deleted file mode 100644 index 873e461..0000000 --- a/src/bin/client/data.rs +++ /dev/null @@ -1,48 +0,0 @@ -use openworm::{ - net::LoginKey, - rsc::{DataDir, DataRsc}, -}; - -pub struct ClientData { - pub dir: DataDir, - pub cache: Cache, -} - -impl ClientData { - pub fn load() -> Self { - let dir = DataDir::default(); - Self { - cache: dir.load(), - dir, - } - } - - pub fn save(&self) { - self.dir.save(&self.cache); - } - - pub fn login_key(&self, user: &str) -> LoginKey { - let entry = keyring::Entry::new("openworm", user).expect("failed to open keyring entry"); - if let Ok(secret) = entry.get_secret() { - LoginKey::from(secret) - } else { - LoginKey::new() - } - } -} - -#[derive(Debug, Default, bitcode::Encode, bitcode::Decode)] -pub struct Cache { - pub ip: String, - pub username: String, - /// TODO: not store this as plain string? - /// need to figure out crypto stuff - /// or store session token - pub password: String, -} - -impl DataRsc for Cache { - fn path() -> &'static str { - "client_data" - } -} diff --git a/src/bin/client/data/mod.rs b/src/bin/client/data/mod.rs new file mode 100644 index 0000000..2c33ece --- /dev/null +++ b/src/bin/client/data/mod.rs @@ -0,0 +1,42 @@ +use openworm::rsc::{DataDir, DataGuard}; + +mod ver; + +pub struct ClientData { + pub data: DataDir, +} + +pub type AccountList = ver::AccountListV0; +pub type AccountInfo = ver::AccountInfoV0; +pub type ServerList = ver::ServerListV0; +pub type ServerInfo = ver::ServerInfoV0; + +impl ClientData { + pub fn load() -> Self { + let data = DataDir::new(None); + Self { data } + } + + pub fn create_account(&self, server: ServerInfo, info: AccountInfo, password: &str) { + keyring::use_native_store(true).unwrap(); + let user_path = info.path(); + let entry = + keyring_core::Entry::new("openworm", &user_path).expect("failed to open keyring entry"); + entry.set_password(password).unwrap(); + self.data + .load::() + .insert(info.url.clone(), server); + self.data.load::().push(info); + } + + pub fn password(&self, info: &AccountInfo) -> String { + let user_path = info.path(); + let entry = + keyring_core::Entry::new("openworm", &user_path).expect("failed to open keyring entry"); + entry.get_password().unwrap() + } + + pub fn accounts(&self) -> DataGuard { + self.data.load::() + } +} diff --git a/src/bin/client/data/ver.rs b/src/bin/client/data/ver.rs new file mode 100644 index 0000000..3f8d59b --- /dev/null +++ b/src/bin/client/data/ver.rs @@ -0,0 +1,58 @@ +use derive_more::{Deref, DerefMut}; +use iris::core::util::HashMap; +use openworm::rsc::DataRsc; + +#[derive(Default, serde::Serialize, serde::Deserialize, Deref, DerefMut)] +pub struct AccountListV0(Vec); +#[derive(Clone, serde::Serialize, serde::Deserialize)] +pub struct AccountInfoV0 { + pub url: String, + pub username: String, +} + +impl AccountInfoV0 { + pub fn path(&self) -> String { + self.username.clone() + "@" + &self.url + } +} + +impl DataRsc for AccountListV0 { + fn name() -> &'static str { + "account_list" + } + + fn parse_version(text: &str, version: u32) -> Result { + match version { + 0 => ron::from_str(text).map_err(|e| e.to_string()), + _ => Err(format!("unknown version {version}")), + } + } + + fn version() -> u32 { + 0 + } +} + +#[derive(Debug, Default, serde::Serialize, serde::Deserialize, Deref, DerefMut)] +pub struct ServerListV0(HashMap); +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct ServerInfoV0 { + pub cert_hex: String, +} + +impl DataRsc for ServerListV0 { + fn name() -> &'static str { + "server_list" + } + + fn parse_version(text: &str, version: u32) -> Result { + match version { + 0 => ron::from_str(text).map_err(|e| e.to_string()), + _ => Err(format!("unknown version {version}")), + } + } + + fn version() -> u32 { + 0 + } +} diff --git a/src/bin/client/main.rs b/src/bin/client/main.rs index fa02714..04c0f72 100644 --- a/src/bin/client/main.rs +++ b/src/bin/client/main.rs @@ -62,11 +62,12 @@ impl DefaultAppState for Client { .stack() .set_root(rsc, &mut ui_state); - ui::start(rsc).set_ptr(main_ui, rsc); + let data = ClientData::load(); + ui::start(rsc, &data).set_ptr(main_ui, rsc); Self { ui_state, - data: ClientData::load(), + data, state: Default::default(), main_ui, notif, @@ -90,7 +91,6 @@ impl DefaultAppState for Client { fn exit(&mut self, _rsc: &mut DefaultRsc, _render: &mut UiRenderState) { self.state.exit(); - self.data.save(); } fn window_event( diff --git a/src/bin/client/net.rs b/src/bin/client/net.rs index fd9f453..3deb130 100644 --- a/src/bin/client/net.rs +++ b/src/bin/client/net.rs @@ -1,8 +1,8 @@ use crate::ClientEvent; use dashmap::DashMap; use openworm::net::{ - ClientMsg, ClientRequestMsg, CreateAccount, CreateAccountResp, RecvHandler, RequestId, - SERVER_NAME, ServerMsg, ServerRespMsg, SkipServerVerification, recv_uni, send_uni, + ClientMsg, ClientRequestMsg, CreateAccount, CreateAccountResp, Login, LoginResp, RecvHandler, + RequestId, SERVER_NAME, ServerMsg, ServerRespMsg, SkipServerVerification, recv_uni, send_uni, }; use quinn::{ ClientConfig, Connection, Endpoint, IdleTimeout, TransportConfig, @@ -10,6 +10,7 @@ use quinn::{ }; use std::{ net::{Ipv6Addr, SocketAddr, SocketAddrV6, ToSocketAddrs}, + str::FromStr, sync::Arc, time::Duration, }; @@ -83,7 +84,7 @@ impl RequestMsg for CreateAccount { type Result = CreateAccountResp; fn result(msg: ServerMsg) -> Option { - if let ServerMsg::CreateAccount(res) = msg { + if let ServerMsg::CreateAccountResp(res) = msg { Some(res) } else { None @@ -91,19 +92,41 @@ impl RequestMsg for CreateAccount { } } -async fn connection_cert(addr: SocketAddr, cert: CertificateDer) -> NetResult { +impl RequestMsg for Login { + type Result = LoginResp; + + fn result(msg: ServerMsg) -> Option { + if let ServerMsg::LoginResp(res) = msg { + Some(res) + } else { + None + } + } +} + +async fn connection_cert( + addr: SocketAddr, + cert: CertificateDer<'_>, +) -> NetResult<(Endpoint, Connection)> { let mut roots = quinn::rustls::RootCertStore::empty(); - roots.add(cert); + roots + .add(cert) + .map_err(|e| format!("Invalid Certificate: {e:?}"))?; let client_crypto = quinn::rustls::ClientConfig::builder() .with_root_certificates(roots) .with_no_client_auth(); - let client_config = ClientConfig::new(Arc::new(QuicClientConfig::try_from(client_crypto)?)); - let mut endpoint = quinn::Endpoint::client(SocketAddr::from_str("[::]:0").unwrap())?; + let client_config = ClientConfig::new(Arc::new( + QuicClientConfig::try_from(client_crypto).map_err(|e| e.to_string())?, + )); + let mut endpoint = quinn::Endpoint::client(SocketAddr::from_str("[::]:0").unwrap()) + .map_err(|e| e.to_string())?; endpoint.set_default_client_config(client_config); - endpoint - .connect(addr, SERVER_NAME)? + let conn = endpoint + .connect(addr, SERVER_NAME) + .map_err(|e| e.to_string())? .await - .map_err(|e| format!("failed to connect: {}", e)) + .map_err(|e| format!("failed to connect: {}", e))?; + Ok((endpoint, conn)) } async fn connection_no_cert(addr: SocketAddr) -> NetResult<(Endpoint, Connection)> { @@ -148,7 +171,7 @@ impl NetHandle { .map_err(|e| e.to_string())? .next() .ok_or("no addresses found".to_string())?; - let (endpoint, conn) = connection_cert(addr).await?; + let (endpoint, conn) = connection_cert(addr, cert).await?; let conn_ = conn.clone(); let mut req_id = RequestId::first(); diff --git a/src/bin/client/ui/color.rs b/src/bin/client/ui/color.rs index 2176e51..3f2ac30 100644 --- a/src/bin/client/ui/color.rs +++ b/src/bin/client/ui/color.rs @@ -2,3 +2,4 @@ use super::*; pub const MODAL_BG: UiColor = UiColor::BLACK.brighter(0.05); pub const GREEN: UiColor = UiColor::rgb(0, 150, 0); +pub const DARK: UiColor = UiColor::BLACK.brighter(0.02); diff --git a/src/bin/client/ui/connect.rs b/src/bin/client/ui/connect.rs index 18614ba..bd87600 100644 --- a/src/bin/client/ui/connect.rs +++ b/src/bin/client/ui/connect.rs @@ -1,20 +1,101 @@ -use openworm::net::{CreateAccount, CreateAccountResp}; +use openworm::net::{CreateAccount, CreateAccountResp, Login, LoginResp}; -use crate::net::{ConnectInfo, NetHandle}; +use crate::{ + data::{AccountInfo, ClientData, ServerInfo, ServerList}, + net::{ConnectInfo, NetHandle}, +}; use super::*; -pub fn start(rsc: &mut Rsc) -> WeakWidget { +pub fn start(rsc: &mut Rsc, data: &ClientData) -> WeakWidget { let mut accounts = Span::empty(Dir::DOWN); - accounts.push( - wtext("no accounts") - .size(20) - .center_text() - .color(Color::GRAY) - .height(60) - .add_strong(rsc), - ); + let accts = data.accounts(); + if accts.is_empty() { + accounts.push( + wtext("no accounts") + .size(20) + .center_text() + .color(Color::GRAY) + .height(60) + .add_strong(rsc), + ); + } else { + for account in accts.iter() { + let button = Button::new_fg( + wtext(&account.username) + .size(20) + .center_text() + .height(60) + .add(rsc), + color::DARK, + rsc, + ) + .add(rsc); + let account = account.clone(); + let cert_hex = data + .data + .load::() + .get(&account.url) + .unwrap() + .cert_hex + .clone(); + let cert = decode_hex(&cert_hex).unwrap(); + keyring::use_native_store(true).unwrap(); + rsc.events.register(button, Submit, move |ctx, rsc| { + let account = account.clone(); + let cert = cert.clone(); + let password = ctx.state.data.password(&account); + rsc.spawn_task(async move |mut ctx| { + let mut fail = |reason: &str| { + let reason = reason.to_string(); + ctx.update(move |ctx, rsc| { + rsc[ctx.notif].inner = Some(werror(&reason, rsc)); + }) + }; + let net = match NetHandle::connect( + async |msg| { + println!("msg recv :joy:"); + }, + ConnectInfo { + url: account.url.clone(), + cert, + }, + ) + .await + { + Ok(v) => v, + Err(e) => { + return fail(&e); + } + }; + + let Ok(resp) = net + .request(Login { + username: account.username.clone(), + password: password.clone(), + }) + .await + else { + return fail("failed to create account"); + }; + let id = match resp { + LoginResp::Ok { id } => id, + LoginResp::UnknownUsername => { + return fail("unknown username"); + } + LoginResp::InvalidPassword => { + return fail("invalid password"); + } + }; + ctx.update(move |ctx, rsc| { + main_view(rsc).set_ptr(ctx.main_ui, rsc); + }); + }); + }); + accounts.push(button.add_strong(rsc)); + } + } let connect = Button::submit("connect", rsc); let create = Button::submit("create", rsc); @@ -47,41 +128,48 @@ pub fn create_account(rsc: &mut Rsc) -> WeakWidget { let create = Button::submit("create", rsc); rsc.events.register(create, Submit, move |ctx, rsc| { - let url = rsc[url].content(); - let token = rsc[token].content(); - let cert = rsc[cert].content(); - let Ok(cert) = decode_hex(&cert) else { + let url = rsc[url].content().trim().to_string(); + let token = rsc[token].content().trim().to_string(); + let cert_hex = rsc[cert].content().trim().to_string(); + let Some(cert) = decode_hex(&cert_hex) else { rsc[ctx.state.notif].inner = Some(werror("Invalid certificate hex", rsc)); return; }; let username = rsc[username].content(); let password = rsc[password].content(); - let login_key = ctx.state.data.login_key(&username); + create.disable(rsc); rsc.spawn_task(async move |mut ctx| { - let mut fail = move |reason| { + let mut fail = |reason: &str| { + let reason = reason.to_string(); ctx.update(move |ctx, rsc| { - rsc[ctx.notif].inner = Some(werror(reason, rsc)); + rsc[ctx.notif].inner = Some(werror(&reason, rsc)); create.enable(rsc); }) }; - let Ok(net) = NetHandle::connect( + keyring::use_native_store(true).unwrap(); + let net = match NetHandle::connect( async |msg| { println!("msg recv :joy:"); }, - ConnectInfo { url, cert }, + ConnectInfo { + url: url.clone(), + cert, + }, ) .await - else { - return fail("failed to connect"); + { + Ok(v) => v, + Err(e) => { + return fail(&e); + } }; let Ok(resp) = net .request(CreateAccount { - username, - password, + username: username.clone(), + password: password.clone(), token, - login_key, }) .await else { @@ -96,7 +184,14 @@ pub fn create_account(rsc: &mut Rsc) -> WeakWidget { return fail("invalid account token"); } }; - println!("account created!!!!"); + ctx.update(move |ctx, rsc| { + main_view(rsc).set_ptr(ctx.main_ui, rsc); + ctx.data.create_account( + ServerInfo { cert_hex }, + AccountInfo { url, username }, + &password, + ); + }); }); }); @@ -115,115 +210,12 @@ pub fn create_account(rsc: &mut Rsc) -> WeakWidget { .add(rsc) } -pub fn decode_hex(s: &str) -> Result, std::num::ParseIntError> { +pub fn decode_hex(s: &str) -> Option> { + if !s.len().is_multiple_of(2) { + return None; + } (0..s.len()) .step_by(2) - .map(|i| u8::from_str_radix(&s[i..i + 2], 16)) + .map(|i| u8::from_str_radix(&s[i..i + 2], 16).ok()) .collect() } - -// pub fn connect_screen(client: &mut Client, ui: &mut Ui, state: &UiState) -> WeakWidget { -// let Client { data, proxy, .. } = client; -// let ip = field_widget(&data.ip, "ip", ui); -// let ip_ = ip.clone(); -// let handle = AppHandle { -// proxy: proxy.clone(), -// window: state.window.clone(), -// }; -// -// let submit = Button::submit("connect", ui); -// -// submit.on(Submit, move |ctx| { -// let ClientState::Connect(state) = &mut ctx.state.state else { -// return; -// }; -// let ip = ip_.get().content(); -// state.handle = Some(connect(handle.clone(), ConnectInfo { ip })); -// }); -// -// ( -// wtext("connect to a server") -// .text_align(Align::CENTER) -// .size(30), -// field_box( -// // NOTE: should probably do this on submit -// ip.on(Edited, |ctx| { -// ctx.state.data.ip = ctx.widget.get().content(); -// }) -// .add(ui), -// ui, -// ), -// submit, -// ) -// .span(Dir::DOWN) -// .gap(10) -// .pad(15) -// .background(rect(Color::BLACK.brighter(0.2)).radius(15)) -// .width(400) -// .align(Align::CENTER) -// .add(ui) -// } - -// pub fn login_screen(client: &mut Client, ui: &mut Ui) -> WeakWidget { -// let Client { data, .. } = client; -// let username = field_widget(&data.username, "username", ui); -// let password = field_widget(&data.password, "password", ui); -// let username_ = username.clone(); -// let password_ = password.clone(); -// let submit = Button::submit("login", ui); -// submit -// .on(move |client, _ui| { -// let ClientState::Login(state) = &mut client.state else { -// return; -// }; -// let username = username_.get().content(); -// let password = password_.get().content(); -// state.handle.send(ClientMsg::Login { username, password }); -// }) -// .add(ui); -// let username_ = username.clone(); -// let password_ = password.clone(); -// let create_button = Button::submit( -// "create account", -// move |client, _ui| { -// let ClientState::Login(state) = &mut client.state else { -// return; -// }; -// let username = username_.get().content(); -// let password = password_.get().content(); -// state -// .handle -// .send(ClientMsg::CreateAccount { username, password }); -// }, -// ui, -// ); -// create_button.on() -// ( -// wtext("login to server").text_align(Align::CENTER).size(30), -// field_box( -// username -// .on(Edited, |ctx| { -// ctx.state.data.username = ctx.widget.get().content(); -// }) -// .add(ui), -// ui, -// ), -// field_box( -// password -// .on(Edited, |ctx| { -// ctx.state.data.password = ctx.widget.get().content(); -// }) -// .add(ui), -// ui, -// ), -// submit, -// create_button, -// ) -// .span(Dir::DOWN) -// .gap(10) -// .pad(15) -// .background(rect(Color::BLACK.brighter(0.2)).radius(15)) -// .width(400) -// .align(Align::CENTER) -// .add(ui) -// } diff --git a/src/bin/client/ui/misc.rs b/src/bin/client/ui/misc.rs index 6499e96..6dbae08 100644 --- a/src/bin/client/ui/misc.rs +++ b/src/bin/client/ui/misc.rs @@ -38,7 +38,7 @@ pub struct Button { } impl Button { - pub fn new(text: &str, color: UiColor, rsc: &mut Rsc) -> Self { + pub fn new_fg(fg: WeakWidget, color: UiColor, rsc: &mut Rsc) -> Self { let rect = rect(color).radius(15).add(rsc); let enabled = rsc.create_state(rect, true); let root = rect @@ -58,7 +58,7 @@ impl Button { rsc[ctx.widget].color = color; }) .height(60) - .foreground(wtext(text).size(25).text_align(Align::CENTER)) + .foreground(fg) .add(rsc); rect.on(CursorSense::click(), move |ctx, rsc: &mut Rsc| { if !rsc[enabled] { @@ -76,6 +76,14 @@ impl Button { } } + pub fn new(text: &str, color: UiColor, rsc: &mut Rsc) -> Self { + Self::new_fg( + wtext(text).size(25).text_align(Align::CENTER).add(rsc), + color, + rsc, + ) + } + pub fn submit(text: &str, rsc: &mut Rsc) -> Self { Self::new(text, color::GREEN, rsc) } diff --git a/src/bin/server/main.rs b/src/bin/server/main.rs index 415157a..d677168 100644 --- a/src/bin/server/main.rs +++ b/src/bin/server/main.rs @@ -7,14 +7,14 @@ use net::{ClientSender, ConAccepter, listen}; use openworm::{ net::{ ClientMsg, ClientRequestMsg, CreateAccount, CreateAccountResp, DisconnectReason, LoadMsg, - RecvHandler, ServerError, ServerMsg, install_crypto_provider, + Login, LoginResp, RecvHandler, ServerError, ServerMsg, install_crypto_provider, }, rsc::DataDir, }; use rand::distr::{Alphanumeric, SampleString}; use scrypt::{ Scrypt, - password_hash::{PasswordHasher, SaltString, rand_core::OsRng}, + password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString, rand_core::OsRng}, }; use std::{ collections::HashMap, @@ -41,9 +41,8 @@ fn main() { #[tokio::main] pub async fn run_server(port: u16) { - let dir = DataDir::default(); - let path = dir.get().join("server"); - let db = Db::open(path.join("db")); + let dir = DataDir::new(Some("server")); + let db = Db::open(dir.path.join("db")); let handler = ServerListener { senders: Default::default(), count: 0.into(), @@ -53,7 +52,7 @@ pub async fn run_server(port: u16) { let token = account_token(&db, ServerPerms::ACCOUNT_TOKENS); println!("no users found, token for admin: {token}"); } - let (endpoint, handle) = listen(port, &path, handler); + let (endpoint, handle) = listen(port, &dir.path, handler); let _ = ctrl_c().await; println!("stopping server"); println!("closing connections..."); @@ -171,7 +170,6 @@ impl RecvHandler for ClientHandler { token, username, password, - login_key, } = &info; let salt = SaltString::generate(&mut OsRng); let params = scrypt::Params::new(11, 8, 1, 32).unwrap(); @@ -214,24 +212,26 @@ impl RecvHandler for ClientHandler { println!("account created: \"{username}\""); *self.state.write().await = ClientState::Authed(id); let _ = replier.send(CreateAccountResp::Ok { id }).await; - } // ClientMsgType::Login { username, password } => { - // let Some(id) = self.db.usernames.get(&username) else { - // let _ = self.send.send(ServerError::UnknownUsername).await; - // return; - // }; - // let Some(user) = self.db.users.get(&id) else { - // panic!("invalid state! (should be a user)"); - // }; - // let hash = PasswordHash::new(&user.password_hash).unwrap(); - // if Scrypt.verify_password(password.as_bytes(), &hash).is_err() { - // println!("invalid password: \"{username}\""); - // let _ = self.send.send(ServerError::InvalidPassword).await; - // return; - // } - // println!("login: \"{username}\""); - // *self.state.write().await = ClientState::Authed(id); - // let _ = self.send.send(ServerMsgType::Login { username }).await; - // } + } + ClientMsg::Login(info) => { + let Login { username, password } = &info; + let Some(id) = self.db.usernames.get(username) else { + let _ = replier.send(LoginResp::UnknownUsername).await; + return; + }; + let Some(user) = self.db.users.get(&id) else { + panic!("invalid state! (should be a user)"); + }; + let hash = PasswordHash::new(&user.password_hash).unwrap(); + if Scrypt.verify_password(password.as_bytes(), &hash).is_err() { + println!("invalid password: \"{username}\""); + let _ = replier.send(LoginResp::InvalidPassword).await; + return; + } + println!("login: \"{username}\""); + *self.state.write().await = ClientState::Authed(id); + let _ = replier.send(LoginResp::Ok { id }).await; + } } } diff --git a/src/bin/server/net.rs b/src/bin/server/net.rs index 3753532..5c04cd5 100644 --- a/src/bin/server/net.rs +++ b/src/bin/server/net.rs @@ -39,7 +39,7 @@ pub fn init_endpoint(port: u16, data_path: &Path) -> Endpoint { }; print!("cert hex: "); for x in cert.iter() { - print!("{:x}", x); + print!("{:02x}", x); } println!(); let server_config = ServerConfig::with_single_cert(vec![cert], key).unwrap(); diff --git a/src/net/conversion.rs b/src/net/conversion.rs index 20db50b..396c757 100644 --- a/src/net/conversion.rs +++ b/src/net/conversion.rs @@ -9,6 +9,7 @@ impl From for ClientMsgInst { ClientMsg::CreateAccount(v) => Self::CreateAccountV0(v), ClientMsg::RequestMsgs => Self::RequestMsgsV0, ClientMsg::SendMsg(v) => Self::SendMsgV0(v), + ClientMsg::Login(v) => Self::LoginV0(v), } } } @@ -19,6 +20,7 @@ impl From for ClientMsg { ClientMsgInst::CreateAccountV0(v) => Self::CreateAccount(v), ClientMsgInst::RequestMsgsV0 => Self::RequestMsgs, ClientMsgInst::SendMsgV0(v) => Self::SendMsg(v), + ClientMsgInst::LoginV0(v) => Self::Login(v), } } } @@ -26,10 +28,11 @@ impl From for ClientMsg { impl From for ServerMsgInst { fn from(value: ServerMsg) -> Self { match value { - ServerMsg::CreateAccount(v) => Self::CreateAccountV0(v), + ServerMsg::CreateAccountResp(v) => Self::CreateAccountRespV0(v), ServerMsg::LoadMsg(v) => Self::LoadMsgV0(v), ServerMsg::LoadMsgs(v) => Self::LoadMsgsV0(v), ServerMsg::ServerError(v) => Self::ServerErrorV0(v), + ServerMsg::LoginResp(v) => Self::LoginRespV0(v), } } } @@ -37,10 +40,11 @@ impl From for ServerMsgInst { impl From for ServerMsg { fn from(value: ServerMsgInst) -> Self { match value { - ServerMsgInst::CreateAccountV0(v) => Self::CreateAccount(v), + ServerMsgInst::CreateAccountRespV0(v) => Self::CreateAccountResp(v), ServerMsgInst::LoadMsgV0(v) => Self::LoadMsg(v), ServerMsgInst::LoadMsgsV0(v) => Self::LoadMsgs(v), ServerMsgInst::ServerErrorV0(v) => Self::ServerError(v), + ServerMsgInst::LoginRespV0(v) => Self::LoginResp(v), } } } diff --git a/src/net/data.rs b/src/net/data.rs index 40f8adb..07a6aed 100644 --- a/src/net/data.rs +++ b/src/net/data.rs @@ -4,17 +4,19 @@ use rand::TryRng; #[derive(Debug, bitcode::Encode, bitcode::Decode)] pub enum ClientMsgInst { CreateAccountV0(CreateAccountV0) = 0, - RequestMsgsV0 = 1, - SendMsgV0(SendMsgV0) = 2, + LoginV0(LoginV0) = 1, + RequestMsgsV0 = 2, + SendMsgV0(SendMsgV0) = 3, } #[repr(u32)] #[derive(Debug, bitcode::Encode, bitcode::Decode)] pub enum ServerMsgInst { - CreateAccountV0(CreateAccountRespV0) = 0, - LoadMsgV0(LoadMsgV0) = 1, - LoadMsgsV0(Vec) = 2, - ServerErrorV0(ServerErrorV0) = 3, + CreateAccountRespV0(CreateAccountRespV0) = 0, + LoginRespV0(LoginRespV0) = 1, + LoadMsgV0(LoadMsgV0) = 2, + LoadMsgsV0(Vec) = 3, + ServerErrorV0(ServerErrorV0) = 4, } pub type UserIdV0 = u64; @@ -24,7 +26,12 @@ pub struct CreateAccountV0 { pub username: String, pub password: String, pub token: String, - pub login_key: LoginKeyV0, +} + +#[derive(Debug, bitcode::Encode, bitcode::Decode)] +pub struct LoginV0 { + pub username: String, + pub password: String, } #[derive(Debug, bitcode::Encode, bitcode::Decode)] @@ -34,6 +41,13 @@ pub enum CreateAccountRespV0 { InvalidToken, } +#[derive(Debug, bitcode::Encode, bitcode::Decode)] +pub enum LoginRespV0 { + Ok { id: UserIdV0 }, + UnknownUsername, + InvalidPassword, +} + #[derive(Debug, bitcode::Encode, bitcode::Decode)] pub struct LoginKeyV0(Vec); impl LoginKeyV0 { @@ -47,6 +61,10 @@ impl LoginKeyV0 { .expect("failed to generate random key"); Self(key.to_vec()) } + + pub fn bytes(&self) -> &[u8] { + &self.0 + } } impl From> for LoginKeyV0 { fn from(value: Vec) -> Self { diff --git a/src/net/msg.rs b/src/net/msg.rs index 83174ce..73576fb 100644 --- a/src/net/msg.rs +++ b/src/net/msg.rs @@ -3,13 +3,15 @@ use super::data::*; #[derive(Debug)] pub enum ClientMsg { CreateAccount(CreateAccount), + Login(Login), RequestMsgs, SendMsg(SendMsg), } #[derive(Debug)] pub enum ServerMsg { - CreateAccount(CreateAccountResp), + CreateAccountResp(CreateAccountResp), + LoginResp(LoginResp), LoadMsg(LoadMsg), LoadMsgs(Vec), ServerError(ServerError), @@ -21,6 +23,8 @@ pub type LoadMsg = LoadMsgV0; pub type ServerError = ServerErrorV0; pub type CreateAccount = CreateAccountV0; pub type CreateAccountResp = CreateAccountRespV0; +pub type Login = LoginV0; +pub type LoginResp = LoginRespV0; pub type UserId = UserIdV0; impl From for ClientMsg { @@ -29,6 +33,12 @@ impl From for ClientMsg { } } +impl From for ClientMsg { + fn from(value: Login) -> Self { + Self::Login(value) + } +} + impl From for ServerMsg { fn from(value: ServerError) -> Self { Self::ServerError(value) @@ -43,6 +53,12 @@ impl From for ServerMsg { impl From for ServerMsg { fn from(value: CreateAccountResp) -> Self { - Self::CreateAccount(value) + Self::CreateAccountResp(value) + } +} + +impl From for ServerMsg { + fn from(value: LoginResp) -> Self { + Self::LoginResp(value) } } diff --git a/src/rsc.rs b/src/rsc.rs index 2a93c96..26ecc2e 100644 --- a/src/rsc.rs +++ b/src/rsc.rs @@ -1,50 +1,103 @@ use std::{ fs::{self, File}, io::Write, - path::Path, + path::PathBuf, }; use directories_next::ProjectDirs; #[derive(Clone)] pub struct DataDir { - dirs: ProjectDirs, -} - -impl Default for DataDir { - fn default() -> Self { - Self { - dirs: ProjectDirs::from("", "", "openworm").unwrap(), - } - } -} - -pub trait DataRsc: bitcode::Encode + bitcode::DecodeOwned + Default { - fn path() -> &'static str; + pub path: PathBuf, } impl DataDir { - pub fn get(&self) -> &Path { - self.dirs.data_local_dir() - } - - pub fn load(&self) -> T { - let path = self.get().join(T::path()); - match fs::read(path) { - Ok(bytes) => match bitcode::decode(&bytes) { - Ok(data) => data, - Err(_) => todo!(), - }, - Err(_) => T::default(), + pub fn new(dir: Option<&str>) -> Self { + let dirs = ProjectDirs::from("", "", "openworm").unwrap(); + let mut path = dirs.data_local_dir().to_path_buf(); + if let Some(dir) = dir { + path = path.join(dir); + } + Self { path } + } +} + +pub trait DataRsc: serde::Serialize + Default { + fn name() -> &'static str; + fn path() -> String { + Self::name().to_string() + ".ron" + } + fn parse_version(text: &str, version: u32) -> Result; + fn version() -> u32; +} + +pub struct DataGuard { + path: PathBuf, + val: T, +} + +impl DataDir { + pub fn load(&self) -> DataGuard { + let path = self.path.join(T::path()); + let invalid = |info: &str| { + println!("warning: invalid config @ {path:?}: {info}"); + DataGuard { + path: path.clone(), + val: T::default(), + } + }; + match fs::read_to_string(&path) { + Ok(text) => { + let mut lines = text.lines(); + let Some(first) = lines.next() else { + return invalid("empty file"); + }; + let version_str: String = first + .chars() + .skip_while(|c| *c != 'v') + .skip(1) + .take_while(|c| !c.is_whitespace()) + .collect(); + let Ok(version): Result = version_str.parse() else { + return invalid("invalid version"); + }; + let text: String = lines.collect(); + match T::parse_version(&text, version) { + Ok(val) => DataGuard { path, val }, + Err(e) => invalid(&e), + } + } + Err(_) => DataGuard { + path, + val: T::default(), + }, + } + } +} + +impl std::ops::Deref for DataGuard { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.val + } +} + +impl std::ops::DerefMut for DataGuard { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.val + } +} + +impl Drop for DataGuard { + fn drop(&mut self) { + let dir = self.path.parent().unwrap(); + fs::create_dir_all(dir).unwrap(); + let mut file = File::create(dir.join(T::path())).unwrap(); + let ron = ron::to_string(&self.val).unwrap(); + let data = format!("// v{}\n{}\n", T::version(), ron); + if let Err(e) = file.write_all(data.as_bytes()) { + println!("Failed to write config @ {:?}: {e}", self.path); } - } - - pub fn save(&self, data: &T) { - let dir = self.get(); - fs::create_dir_all(dir).unwrap(); - let mut file = File::create(dir.join(T::path())).unwrap(); - // TODO: used to use encode_into_std_write from bincode here - let data = bitcode::encode(data); - file.write_all(&data).unwrap(); } }