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 0000000..25cdb6d Binary files /dev/null and b/src/bin/client/assets/orage.jpg differ 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(); } }