From d6c98bcf10605811698a888d90947c13841d69ce Mon Sep 17 00:00:00 2001 From: Shadow Cat Date: Sun, 15 Feb 2026 21:21:56 -0500 Subject: [PATCH] work --- Cargo.lock | 116 +++++++++++++++++------------------ src/bin/client/net.rs | 8 +-- src/bin/client/ui/connect.rs | 11 +++- src/bin/server/db/mod.rs | 5 +- src/bin/server/db/util.rs | 14 +++++ src/bin/server/db/ver.rs | 14 +++++ src/bin/server/main.rs | 30 ++++++--- src/net/conversion.rs | 4 +- src/net/data.rs | 11 ++-- src/net/msg.rs | 10 +-- 10 files changed, 139 insertions(+), 84 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a8cbcf..9ff5513 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -68,7 +68,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.10.0", + "bitflags 2.11.0", "cc", "cesu8", "jni", @@ -386,9 +386,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" dependencies = [ "serde_core", ] @@ -497,7 +497,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "log", "polling", "rustix 0.38.44", @@ -721,7 +721,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "core-foundation 0.10.1", "libc", ] @@ -750,7 +750,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4cadaea21e24c49c0c82116f2b465ae6a49d63c90e428b0f8d9ae1f638ac91f" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "fontdb", "harfrust", "linebender_resource_handle", @@ -997,7 +997,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "objc2 0.6.3", ] @@ -1461,7 +1461,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "gpu-alloc-types", ] @@ -1471,7 +1471,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -1506,7 +1506,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -1517,7 +1517,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -1538,7 +1538,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0caaee032384c10dd597af4579c67dee16650d862a9ccbe1233ff1a379abc07" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "bytemuck", "core_maths", "read-fonts 0.36.0", @@ -1891,7 +1891,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "libc", "redox_syscall 0.7.0", ] @@ -2021,7 +2021,7 @@ version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block", "core-graphics-types 0.2.0", "foreign-types", @@ -2036,7 +2036,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7047791b5bc903b8cd963014b355f71dc9864a9a0b727057676c1dcae5cbc15" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block", "core-graphics-types 0.2.0", "foreign-types", @@ -2090,7 +2090,7 @@ checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.10.0", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -2116,7 +2116,7 @@ checksum = "618f667225063219ddfc61251087db8a9aec3c3f0950c916b614e403486f1135" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.10.0", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -2140,7 +2140,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "jni-sys", "log", "ndk-sys", @@ -2323,7 +2323,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "libc", "objc2 0.5.2", @@ -2339,7 +2339,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "objc2 0.6.3", "objc2-core-graphics", "objc2-foundation 0.3.2", @@ -2351,7 +2351,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "objc2 0.5.2", "objc2-core-location", @@ -2375,7 +2375,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -2387,7 +2387,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "dispatch2", "objc2 0.6.3", ] @@ -2398,7 +2398,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "dispatch2", "objc2 0.6.3", "objc2-core-foundation", @@ -2441,7 +2441,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "dispatch", "libc", @@ -2454,7 +2454,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "objc2 0.6.3", "objc2-core-foundation", ] @@ -2465,7 +2465,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "objc2 0.6.3", "objc2-core-foundation", ] @@ -2488,7 +2488,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -2500,7 +2500,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -2523,7 +2523,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "objc2 0.5.2", "objc2-cloud-kit", @@ -2555,7 +2555,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "objc2 0.5.2", "objc2-core-location", @@ -2781,7 +2781,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "crc32fast", "fdeflate", "flate2", @@ -3199,7 +3199,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -3208,7 +3208,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -3254,7 +3254,7 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd490c5b18261893f14449cbd28cb9c0b637aebf161cd77900bfdedaff21ec32" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "once_cell", "serde", "serde_derive", @@ -3304,7 +3304,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -3317,7 +3317,7 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys 0.11.0", @@ -3474,7 +3474,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -3487,7 +3487,7 @@ version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -3682,7 +3682,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "calloop", "calloop-wayland-source", "cursor-icon", @@ -3735,7 +3735,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -4285,7 +4285,7 @@ version = "0.241.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46d90019b1afd4b808c263e428de644f3003691f243387d30d673211ee0cb8e8" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "hashbrown 0.15.5", "indexmap", "semver", @@ -4311,7 +4311,7 @@ version = "0.31.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "rustix 1.1.3", "wayland-backend", "wayland-scanner", @@ -4323,7 +4323,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "cursor-icon", "wayland-backend", ] @@ -4345,7 +4345,7 @@ version = "0.32.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baeda9ffbcfc8cd6ddaade385eaf2393bd2115a69523c735f12242353c3df4f3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -4357,7 +4357,7 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa98634619300a535a9a97f338aed9a5ff1e01a461943e8346ff4ae26007306b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -4370,7 +4370,7 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9597cdf02cf0c34cd5823786dce6b5ae8598f05c2daf5621b6e178d4f7345f3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -4442,7 +4442,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", - "bitflags 2.10.0", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "document-features", @@ -4471,7 +4471,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9cb534d5ffd109c7d1135f34cdae29e60eab94855a625dcfe1705f8bc7ad79f" dependencies = [ "arrayvec", - "bitflags 2.10.0", + "bitflags 2.11.0", "bytemuck", "cfg-if", "cfg_aliases", @@ -4503,7 +4503,7 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.10.0", + "bitflags 2.11.0", "bytemuck", "cfg_aliases", "document-features", @@ -4535,7 +4535,7 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.10.0", + "bitflags 2.11.0", "bytemuck", "cfg_aliases", "document-features", @@ -4622,7 +4622,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.10.0", + "bitflags 2.11.0", "block", "bytemuck", "cfg-if", @@ -4671,7 +4671,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.10.0", + "bitflags 2.11.0", "block", "bytemuck", "cfg-if", @@ -4715,7 +4715,7 @@ version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "bytemuck", "js-sys", "log", @@ -4729,7 +4729,7 @@ version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e18308757e594ed2cd27dddbb16a139c42a683819d32a2e0b1b0167552f5840c" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "bytemuck", "js-sys", "log", @@ -5181,7 +5181,7 @@ dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "bytemuck", "calloop", @@ -5297,7 +5297,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0c57df25e7ee612d946d3b7646c1ddb2310f8280aa2c17e543b66e0812241" dependencies = [ "anyhow", - "bitflags 2.10.0", + "bitflags 2.11.0", "indexmap", "log", "serde", @@ -5407,7 +5407,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "dlib", "log", "once_cell", diff --git a/src/bin/client/net.rs b/src/bin/client/net.rs index 630bd2e..d4b4f28 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::{ - AccountCreated, ClientMsg, ClientMsgInst, ClientRequestMsg, CreateAccount, RecvHandler, - RequestId, SERVER_NAME, ServerMsg, ServerRespMsg, SkipServerVerification, recv_uni, send_uni, + ClientMsg, ClientRequestMsg, CreateAccount, CreateAccountResp, RecvHandler, RequestId, + SERVER_NAME, ServerMsg, ServerRespMsg, SkipServerVerification, recv_uni, send_uni, }; use quinn::{ ClientConfig, Connection, Endpoint, IdleTimeout, TransportConfig, @@ -79,10 +79,10 @@ pub trait RequestMsg: Into { } impl RequestMsg for CreateAccount { - type Result = AccountCreated; + type Result = CreateAccountResp; fn result(msg: ServerMsg) -> Option { - if let ServerMsg::AccountCreated(res) = msg { + if let ServerMsg::CreateAccount(res) = msg { Some(res) } else { None diff --git a/src/bin/client/ui/connect.rs b/src/bin/client/ui/connect.rs index 5771065..0367366 100644 --- a/src/bin/client/ui/connect.rs +++ b/src/bin/client/ui/connect.rs @@ -1,4 +1,4 @@ -use openworm::net::CreateAccount; +use openworm::net::{CreateAccount, CreateAccountResp}; use crate::net::{self, ConnectInfo}; @@ -81,6 +81,15 @@ pub fn create_account(rsc: &mut Rsc) -> WeakWidget { else { return fail("failed to create account"); }; + let id = match resp { + CreateAccountResp::Ok { id } => id, + CreateAccountResp::UsernameExists => { + return fail("username already exists"); + } + CreateAccountResp::InvalidToken => { + return fail("invalid account token"); + } + }; println!("account created!!!!"); }); }); diff --git a/src/bin/server/db/mod.rs b/src/bin/server/db/mod.rs index d41d82d..be16125 100644 --- a/src/bin/server/db/mod.rs +++ b/src/bin/server/db/mod.rs @@ -11,6 +11,7 @@ pub const DB_VERSION: u64 = 0; #[derive(Clone)] pub struct Db { db: Database, + pub account_tokens: DbMap, pub msgs: DbMap, pub users: DbMap, pub usernames: DbMap, @@ -23,6 +24,7 @@ pub type ImageId = ImageIdV0; pub type User = UserV0; pub type Msg = MsgV0; pub type ChannelInfo = ChannelV0; +pub type ServerPerms = ServerPermsV0; impl Db { pub fn open(path: impl AsRef) -> Db { @@ -34,10 +36,11 @@ impl Db { panic!("non matching db version! (auto update in the future)"); } } else { - println!("no previous db found, creating new"); + println!("no previous db found, creating new version {DB_VERSION}"); info.insert("version", &DB_VERSION); } Db { + account_tokens: DbMap::open("account_token", &db), msgs: DbMap::open("msg", &db), users: DbMap::open("user", &db), usernames: DbMap::open("username", &db), diff --git a/src/bin/server/db/util.rs b/src/bin/server/db/util.rs index f54d461..11ea790 100644 --- a/src/bin/server/db/util.rs +++ b/src/bin/server/db/util.rs @@ -46,6 +46,14 @@ impl, V: Encode + DecodeOwned> DbMap { Some(bitcode::decode(&v).unwrap()) } + pub fn len(&self) -> usize { + self.keyspace.approximate_len() + } + + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + pub fn iter(&self) -> impl Iterator { self.db.read_tx().iter(self) } @@ -129,6 +137,12 @@ impl WriteTx { self.0.get(&map.keyspace, k).unwrap().is_some() } + pub fn remove, V: DecodeOwned>(&mut self, map: &DbMap, k: K) -> Option { + let k = Slice::new(k.to_bytes().as_ref()); + let v = self.0.take(&map.keyspace, k).unwrap()?; + Some(bitcode::decode(&v).unwrap()) + } + // TODO: K2 IS NOT A SAFE ABSTRACTION!! need to have KeyLike which has key assoc type pub fn insert, K2: Key + ?Sized, V: Encode>( &mut self, diff --git a/src/bin/server/db/ver.rs b/src/bin/server/db/ver.rs index e93d89f..5cef10d 100644 --- a/src/bin/server/db/ver.rs +++ b/src/bin/server/db/ver.rs @@ -3,12 +3,20 @@ pub type MsgIdV0 = i128; pub type ChannelIdV0 = u64; pub type ImageIdV0 = u64; +#[derive(Clone, Copy, bitcode::Encode, bitcode::Decode)] +pub struct ServerPermsV0(u32); +impl ServerPermsV0 { + pub const NONE: Self = Self(0); + pub const ACCOUNT_TOKENS: Self = Self(1 << 0); +} + #[derive(bitcode::Encode, bitcode::Decode)] pub struct UserV0 { pub username: String, pub password_hash: String, pub pfp: Option, pub bio: String, + pub server_perms: ServerPermsV0, } #[derive(bitcode::Encode, bitcode::Decode)] @@ -21,3 +29,9 @@ pub struct ChannelV0 { pub name: String, pub desc: String, } + +impl ServerPermsV0 { + pub fn contains(&self, other: Self) -> bool { + (self.0 & other.0) == other.0 + } +} diff --git a/src/bin/server/main.rs b/src/bin/server/main.rs index bc0b062..69b65a8 100644 --- a/src/bin/server/main.rs +++ b/src/bin/server/main.rs @@ -1,16 +1,17 @@ mod db; mod net; -use crate::db::{Db, Msg, User}; +use crate::db::{Db, Msg, ServerPerms, User}; use clap::Parser; use net::{ClientSender, ConAccepter, listen}; use openworm::{ net::{ - AccountCreated, ClientMsg, ClientRequestMsg, CreateAccount, DisconnectReason, LoadMsg, + ClientMsg, ClientRequestMsg, CreateAccount, CreateAccountResp, DisconnectReason, LoadMsg, RecvHandler, ServerError, ServerMsg, install_crypto_provider, }, rsc::DataDir, }; +use rand::distr::{Alphanumeric, SampleString}; use scrypt::{ Scrypt, password_hash::{PasswordHasher, SaltString, rand_core::OsRng}, @@ -48,6 +49,10 @@ pub async fn run_server(port: u16) { count: 0.into(), db: db.clone(), }; + if db.users.is_empty() { + let token = account_token(&db, ServerPerms::ACCOUNT_TOKENS); + println!("no users found, token for admin: {token}"); + } let (endpoint, handle) = listen(port, path, handler); let _ = ctrl_c().await; println!("stopping server"); @@ -57,6 +62,12 @@ pub async fn run_server(port: u16) { endpoint.wait_idle().await; } +pub fn account_token(db: &Db, perms: ServerPerms) -> String { + let token = Alphanumeric.sample_string(&mut rand::rng(), 16); + db.account_tokens.insert(&token, &perms); + token +} + type ClientId = u64; struct ServerListener { @@ -94,9 +105,7 @@ struct ClientHandler { } impl RecvHandler for ClientHandler { - async fn connect(&self) -> () { - println!("connected: {:?}", self.send.remote().ip()); - } + async fn connect(&self) -> () {} async fn msg(&self, req: ClientRequestMsg) { let msg = ClientMsg::from(req.msg); let replier = self.send.replier(req.id); @@ -173,8 +182,13 @@ impl RecvHandler for ClientHandler { let mut id; loop { let mut tx = self.db.write_tx(); + let Some(perms) = tx.remove(&self.db.account_tokens, token.to_string()) else { + let _ = replier.send(CreateAccountResp::InvalidToken).await; + println!("invalid token: {:?}", self.send.remote()); + return; + }; if tx.has_key(&self.db.usernames, username.clone()) { - let _ = replier.send(ServerError::UsernameTaken).await; + let _ = replier.send(CreateAccountResp::UsernameExists).await; return; } id = rand::random(); @@ -189,6 +203,7 @@ impl RecvHandler for ClientHandler { password_hash: hash.clone(), bio: String::new(), pfp: None, + server_perms: perms, }, ); tx.insert(&self.db.usernames, username, &id); @@ -198,7 +213,7 @@ impl RecvHandler for ClientHandler { } println!("account created: \"{username}\""); *self.state.write().await = ClientState::Authed(id); - let _ = replier.send(AccountCreated {}).await; + 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; @@ -221,7 +236,6 @@ impl RecvHandler for ClientHandler { } async fn disconnect(&self, reason: DisconnectReason) -> () { - println!("disconnected: {:?}", self.send.remote().ip()); match reason { DisconnectReason::Closed | DisconnectReason::Timeout => (), DisconnectReason::Other(e) => println!("connection issue: {e}"), diff --git a/src/net/conversion.rs b/src/net/conversion.rs index 6996790..20db50b 100644 --- a/src/net/conversion.rs +++ b/src/net/conversion.rs @@ -26,7 +26,7 @@ impl From for ClientMsg { impl From for ServerMsgInst { fn from(value: ServerMsg) -> Self { match value { - ServerMsg::AccountCreated(v) => Self::AccountCreatedV0(v), + ServerMsg::CreateAccount(v) => Self::CreateAccountV0(v), ServerMsg::LoadMsg(v) => Self::LoadMsgV0(v), ServerMsg::LoadMsgs(v) => Self::LoadMsgsV0(v), ServerMsg::ServerError(v) => Self::ServerErrorV0(v), @@ -37,7 +37,7 @@ impl From for ServerMsgInst { impl From for ServerMsg { fn from(value: ServerMsgInst) -> Self { match value { - ServerMsgInst::AccountCreatedV0(v) => Self::AccountCreated(v), + ServerMsgInst::CreateAccountV0(v) => Self::CreateAccount(v), ServerMsgInst::LoadMsgV0(v) => Self::LoadMsg(v), ServerMsgInst::LoadMsgsV0(v) => Self::LoadMsgs(v), ServerMsgInst::ServerErrorV0(v) => Self::ServerError(v), diff --git a/src/net/data.rs b/src/net/data.rs index ae12c65..40f8adb 100644 --- a/src/net/data.rs +++ b/src/net/data.rs @@ -11,7 +11,7 @@ pub enum ClientMsgInst { #[repr(u32)] #[derive(Debug, bitcode::Encode, bitcode::Decode)] pub enum ServerMsgInst { - AccountCreatedV0(AccountCreatedV0) = 0, + CreateAccountV0(CreateAccountRespV0) = 0, LoadMsgV0(LoadMsgV0) = 1, LoadMsgsV0(Vec) = 2, ServerErrorV0(ServerErrorV0) = 3, @@ -28,7 +28,11 @@ pub struct CreateAccountV0 { } #[derive(Debug, bitcode::Encode, bitcode::Decode)] -pub struct AccountCreatedV0 {} +pub enum CreateAccountRespV0 { + Ok { id: UserIdV0 }, + UsernameExists, + InvalidToken, +} #[derive(Debug, bitcode::Encode, bitcode::Decode)] pub struct LoginKeyV0(Vec); @@ -64,7 +68,4 @@ pub struct LoadMsgV0 { #[derive(Debug, bitcode::Encode, bitcode::Decode)] pub enum ServerErrorV0 { NotLoggedIn, - UnknownUsername, - InvalidPassword, - UsernameTaken, } diff --git a/src/net/msg.rs b/src/net/msg.rs index 9230b98..83174ce 100644 --- a/src/net/msg.rs +++ b/src/net/msg.rs @@ -9,7 +9,7 @@ pub enum ClientMsg { #[derive(Debug)] pub enum ServerMsg { - AccountCreated(AccountCreated), + CreateAccount(CreateAccountResp), LoadMsg(LoadMsg), LoadMsgs(Vec), ServerError(ServerError), @@ -20,7 +20,7 @@ pub type SendMsg = SendMsgV0; pub type LoadMsg = LoadMsgV0; pub type ServerError = ServerErrorV0; pub type CreateAccount = CreateAccountV0; -pub type AccountCreated = AccountCreatedV0; +pub type CreateAccountResp = CreateAccountRespV0; pub type UserId = UserIdV0; impl From for ClientMsg { @@ -41,8 +41,8 @@ impl From for ServerMsg { } } -impl From for ServerMsg { - fn from(value: AccountCreated) -> Self { - Self::AccountCreated(value) +impl From for ServerMsg { + fn from(value: CreateAccountResp) -> Self { + Self::CreateAccount(value) } }