diff --git a/.env b/.env index f101fbe..5654595 100644 --- a/.env +++ b/.env @@ -7,7 +7,7 @@ ORDER_DATABASE_URL=postgres://postgres@localhost/myco_orders TOKEN_DATABASE_URL=postgres://postgres@localhost/myco_tokens PASS_SALT=18CHwV7eGFAea16z+qMKZg -RUST_LOG=debug +RUST_LOG=hyper=error,debug SESSION_SECRET="NEPJs#8jjn8SK8GC7QEC^*P844UgsyEbQB8mRWXkT%3mPrwewZoc25MMby9H#R*w2KzaQgMkk#Pif$kxrLy*N5L!Ch%jxbWoa%gb" JWT_SECRET="42^iFq&ZnQbUf!hwGWXd&CpyY6QQyJmkPU%esFCvne5&Ejcb3nJ4&GyHZp!MArZLf^9*5c6!!VgM$iZ8T%d#&bWTi&xbZk2S@4RN" SIGNATURE=David @@ -38,3 +38,5 @@ SONIC_SEARCH_PASS=SecretPassword SONIC_INGEST_ADDR=[::1]:1491 SONIC_INGEST_PASS=SecretPassword SEARCH_ACTIVE=true + +KANIDM_IDM_ADMIN_PASS=2MScM5Cr2ANyLRps4ccGZjSJdx8bth6yXEwKJDqYU5ZdNfKN diff --git a/.gitignore b/.gitignore index a584c90..e35ac1d 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ web/dist web/tmp adapters plugins +.env diff --git a/Cargo.lock b/Cargo.lock index d321baf..b9a0cde 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,34 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +[[package]] +name = "account_manager" +version = "0.1.0" +dependencies = [ + "bincode", + "bytes 1.6.0", + "channels", + "config", + "dotenv", + "fake", + "futures 0.3.30", + "gumdrop", + "json", + "kanidm_client", + "kanidm_proto", + "model", + "rumqttc", + "serde", + "sqlx", + "sqlx-core 0.7.4", + "tarpc", + "testx", + "thiserror", + "tokio", + "tracing", + "uuid 1.9.0", +] + [[package]] name = "actix-codec" version = "0.5.2" @@ -349,6 +377,19 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-compression" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" +dependencies = [ + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-executor" version = "1.12.0" @@ -691,6 +732,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "base32" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" + [[package]] name = "base64" version = "0.13.1" @@ -715,6 +762,17 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "base64urlsafedata" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a56894edf5cd1efa7068d7454adeb7ce0b3da4ffa5ab08cfc06165bbc62f0c7" +dependencies = [ + "base64 0.21.7", + "paste", + "serde", +] + [[package]] name = "bigdecimal" version = "0.3.1" @@ -813,7 +871,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" dependencies = [ "once_cell", - "proc-macro-crate", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", "syn 2.0.68", @@ -989,6 +1047,27 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "channels" +version = "0.1.0" +dependencies = [ + "bincode", + "bytes 1.6.0", + "config", + "futures 0.3.30", + "model", + "payment-adapter", + "rumqttc", + "serde", + "strum", + "tarpc", + "thiserror", + "tokio", + "tracing", + "uuid 1.9.0", + "whatlang", +] + [[package]] name = "chrono" version = "0.4.38" @@ -1063,6 +1142,22 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3f6d59c71e7dc3af60f0af9db32364d96a16e9310f3f5db2b55ed642162dd35" +[[package]] +name = "compact_jwt" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1aca09e6a9e9011c2a2fb13f26a0d2440a709ac0e68ccf02d168d54f4801b27" +dependencies = [ + "base64 0.21.7", + "base64urlsafedata", + "hex", + "serde", + "serde_json", + "tracing", + "url", + "uuid 1.9.0", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -1117,6 +1212,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "cookie" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + [[package]] name = "cookie" version = "0.18.1" @@ -1132,6 +1238,23 @@ dependencies = [ "version_check", ] +[[package]] +name = "cookie_store" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6" +dependencies = [ + "cookie 0.17.0", + "idna 0.3.0", + "log", + "publicsuffix", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1429,6 +1552,18 @@ dependencies = [ "syn 2.0.68", ] +[[package]] +name = "educe" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "either" version = "1.12.0" @@ -1459,6 +1594,19 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "enum-ordinalize" +version = "3.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -1623,6 +1771,17 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1908,6 +2067,26 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gumdrop" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bc700f989d2f6f0248546222d9b4258f5b02a171a431f8285a81c08142629e3" +dependencies = [ + "gumdrop_derive", +] + +[[package]] +name = "gumdrop_derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "729f9bd3449d77e7831a18abfb7ba2f99ee813dfd15b8c2167c9a54ba20aa99d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "h2" version = "0.3.26" @@ -1987,6 +2166,12 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -2098,6 +2283,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "hyper" version = "0.14.29" @@ -2176,6 +2367,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "idna" version = "0.5.0" @@ -2194,6 +2395,7 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] @@ -2204,6 +2406,7 @@ checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown 0.14.5", + "serde", ] [[package]] @@ -2322,6 +2525,75 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" + +[[package]] +name = "kanidm_client" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "096cddae6b5b1891c58ecf3056f45205be68f995e21278e006d32fed71910e7d" +dependencies = [ + "compact_jwt", + "hyper", + "kanidm_lib_file_permissions", + "kanidm_proto", + "reqwest", + "serde", + "serde_json", + "time", + "tokio", + "toml 0.5.11", + "tracing", + "url", + "uuid 1.9.0", + "webauthn-rs-proto", +] + +[[package]] +name = "kanidm_lib_file_permissions" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1bb7525ce9007b0798a8eaf010708ef49da7f1b2516eebd3058f253df6db843" +dependencies = [ + "kanidm_utils_users", + "whoami", +] + +[[package]] +name = "kanidm_proto" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad03a5e96bf8a4fa981b864c3317950dce7d7ea6b0e8accd61329ec72ca1cd6" +dependencies = [ + "base32", + "base64urlsafedata", + "num_enum", + "scim_proto", + "serde", + "serde_json", + "serde_with", + "time", + "tracing", + "url", + "urlencoding", + "utoipa", + "uuid 1.9.0", + "webauthn-rs-proto", +] + +[[package]] +name = "kanidm_utils_users" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89aa036a35fe4b2953c7c8ab8ad456db3ab8547aec1f1a762ab524d7480c243b" +dependencies = [ + "libc", +] + [[package]] name = "kv-log-macro" version = "1.0.7" @@ -2534,6 +2806,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minidom" version = "0.15.2" @@ -2685,6 +2967,36 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + [[package]] name = "object" version = "0.36.0" @@ -2744,14 +3056,24 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "opentelemetry" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d6c3d7288a106c0a363e4b0e8d308058d56902adefb16f4936f417ffef086e" +dependencies = [ + "opentelemetry_api 0.18.0", + "opentelemetry_sdk 0.18.0", +] + [[package]] name = "opentelemetry" version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f4b8347cc26099d3aeee044065ecc3ae11469796b4d65d065a23a584ed92a6f" dependencies = [ - "opentelemetry_api", - "opentelemetry_sdk", + "opentelemetry_api 0.19.0", + "opentelemetry_sdk 0.19.0", ] [[package]] @@ -2763,7 +3085,7 @@ dependencies = [ "async-trait", "bytes 1.6.0", "http 0.2.12", - "opentelemetry_api", + "opentelemetry_api 0.19.0", "reqwest", ] @@ -2777,7 +3099,7 @@ dependencies = [ "futures 0.3.30", "futures-util", "http 0.2.12", - "opentelemetry", + "opentelemetry 0.19.0", "opentelemetry-http", "opentelemetry-proto", "prost", @@ -2796,7 +3118,7 @@ checksum = "045f8eea8c0fa19f7d48e7bc3128a39c2e5c533d5c61298c548dfefc1064474c" dependencies = [ "futures 0.3.30", "futures-util", - "opentelemetry", + "opentelemetry 0.19.0", "prost", "tonic", ] @@ -2807,7 +3129,22 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24e33428e6bf08c6f7fcea4ddb8e358fab0fe48ab877a87c70c6ebe20f673ce5" dependencies = [ - "opentelemetry", + "opentelemetry 0.19.0", +] + +[[package]] +name = "opentelemetry_api" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c24f96e21e7acc813c7a8394ee94978929db2bcc46cf6b5014fc612bf7760c22" +dependencies = [ + "futures-channel", + "futures-util", + "indexmap 1.9.3", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror", ] [[package]] @@ -2826,6 +3163,24 @@ dependencies = [ "urlencoding", ] +[[package]] +name = "opentelemetry_sdk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ca41c4933371b61c2a2f214bf16931499af4ec90543604ec828f7a625c09113" +dependencies = [ + "async-trait", + "crossbeam-channel", + "futures-channel", + "futures-executor", + "futures-util", + "once_cell", + "opentelemetry_api 0.18.0", + "percent-encoding", + "rand 0.8.5", + "thiserror", +] + [[package]] name = "opentelemetry_sdk" version = "0.19.0" @@ -2840,7 +3195,7 @@ dependencies = [ "futures-executor", "futures-util", "once_cell", - "opentelemetry_api", + "opentelemetry_api 0.19.0", "percent-encoding", "rand 0.8.5", "thiserror", @@ -3015,6 +3370,33 @@ dependencies = [ "tracing", ] +[[package]] +name = "peg" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a625d12ad770914cbf7eff6f9314c3ef803bfe364a1b20bc36ddf56673e71e5" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f241d42067ed3ab6a4fece1db720838e1418f36d868585a27931f95d6bc03582" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -3132,6 +3514,16 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + [[package]] name = "proc-macro-crate" version = "3.1.0" @@ -3197,6 +3589,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "psl-types" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" + [[package]] name = "ptr_meta" version = "0.1.4" @@ -3217,6 +3615,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "publicsuffix" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a8c1bda5ae1af7f99a2962e49df150414a43d62404644d98dd5c3a93d07457" +dependencies = [ + "idna 0.3.0", + "psl-types", +] + [[package]] name = "quanta" version = "0.9.3" @@ -3510,8 +3918,11 @@ version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ + "async-compression", "base64 0.21.7", "bytes 1.6.0", + "cookie 0.17.0", + "cookie_store", "encoding_rs", "futures-core", "futures-util", @@ -3524,11 +3935,12 @@ dependencies = [ "js-sys", "log", "mime", + "mime_guess", "native-tls", "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", @@ -3622,6 +4034,24 @@ dependencies = [ "serde", ] +[[package]] +name = "rumqttc" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1568e15fab2d546f940ed3a21f48bbbd1c494c90c99c4481339364a497f94a9" +dependencies = [ + "bytes 1.6.0", + "flume", + "futures-util", + "log", + "rustls-native-certs", + "rustls-pemfile 2.1.2", + "rustls-webpki", + "thiserror", + "tokio", + "tokio-rustls 0.25.0", +] + [[package]] name = "rust-ini" version = "0.18.0" @@ -3735,6 +4165,33 @@ dependencies = [ "webpki", ] +[[package]] +name = "rustls" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -3744,6 +4201,33 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + +[[package]] +name = "rustls-webpki" +version = "0.102.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +dependencies = [ + "ring 0.17.8", + "rustls-pki-types", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.17" @@ -3782,6 +4266,23 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "scim_proto" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55fbcfbcbc11ff46228a2b7b6018e1f6f37499fff47851e20583862ba1d9ef3f" +dependencies = [ + "base64 0.22.1", + "peg", + "serde", + "serde_json", + "time", + "tracing", + "tracing-subscriber", + "url", + "uuid 1.9.0", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -3987,6 +4488,17 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-wasm-bindgen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "serde_derive" version = "1.0.203" @@ -4062,6 +4574,36 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.6", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "sha1" version = "0.10.6" @@ -4197,6 +4739,9 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] [[package]] name = "sqlformat" @@ -4263,8 +4808,8 @@ dependencies = [ "percent-encoding", "rand 0.8.5", "rust_decimal", - "rustls", - "rustls-pemfile", + "rustls 0.20.9", + "rustls-pemfile 1.0.4", "serde", "serde_json", "sha1", @@ -4343,7 +4888,7 @@ checksum = "804d3f245f894e61b1e6263c84b23ca675d96753b5abfd5cc8597d86806e8024" dependencies = [ "once_cell", "tokio", - "tokio-rustls", + "tokio-rustls 0.23.4", ] [[package]] @@ -4375,6 +4920,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 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.68", +] + [[package]] name = "subtle" version = "2.6.0" @@ -4448,12 +5015,47 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "tarpc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93a1870169fb9490fb3b37df7f50782986475c33cb90955f9f9b9ae659124200" +dependencies = [ + "anyhow", + "fnv", + "futures 0.3.30", + "humantime", + "opentelemetry 0.18.0", + "pin-project", + "rand 0.8.5", + "serde", + "static_assertions", + "tarpc-plugins", + "thiserror", + "tokio", + "tokio-serde", + "tokio-util", + "tracing", + "tracing-opentelemetry 0.18.0", +] + +[[package]] +name = "tarpc-plugins" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8302bea2fb8a2b01b025d23414b0b4ed32a783b95e5d818c3320a8bc4baada" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "telemetry-plugin" version = "0.1.0" dependencies = [ "async-trait", - "opentelemetry", + "opentelemetry 0.19.0", "opentelemetry-otlp", "opentelemetry-semantic-conventions", "plugin-api", @@ -4461,7 +5063,7 @@ dependencies = [ "tokio", "tracing", "tracing-bunyan-formatter", - "tracing-opentelemetry", + "tracing-opentelemetry 0.19.0", "tracing-subscriber", ] @@ -4534,7 +5136,9 @@ checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "libc", "num-conv", + "num_threads", "powerfmt", "serde", "time-core", @@ -4639,11 +5243,38 @@ version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls", + "rustls 0.20.9", "tokio", "webpki", ] +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls 0.22.4", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-serde" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" +dependencies = [ + "bincode", + "bytes 1.6.0", + "educe", + "futures-core", + "futures-sink", + "pin-project", + "serde", + "serde_json", +] + [[package]] name = "tokio-stream" version = "0.1.15" @@ -4665,9 +5296,19 @@ dependencies = [ "futures-core", "futures-sink", "pin-project-lite", + "slab", "tokio", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "toml" version = "0.7.8" @@ -4885,6 +5526,19 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-opentelemetry" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21ebb87a95ea13271332df069020513ab70bdb5637ca42d6e492dc3bbbad48de" +dependencies = [ + "once_cell", + "opentelemetry 0.18.0", + "tracing", + "tracing-core", + "tracing-subscriber", +] + [[package]] name = "tracing-opentelemetry" version = "0.19.0" @@ -4893,7 +5547,7 @@ checksum = "00a39dcf9bfc1742fa4d6215253b33a6e474be78275884c216fc2a06267b3600" dependencies = [ "async-trait", "once_cell", - "opentelemetry", + "opentelemetry 0.19.0", "tracing", "tracing-core", "tracing-log 0.1.4", @@ -4968,6 +5622,15 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -5026,7 +5689,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", - "idna", + "idna 0.5.0", "percent-encoding", "serde", ] @@ -5046,6 +5709,30 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "utoipa" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_json", + "utoipa-gen", +] + +[[package]] +name = "utoipa-gen" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bf0e16c02bc4bf5322ab65f10ab1149bdbcaa782cba66dc7057370a3f8190be" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "uuid" version = "0.8.2" @@ -5074,7 +5761,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db79c75af171630a3148bd3e6d7c4f42b6a9a014c2945bc5ed0020cbb8d9478e" dependencies = [ - "idna", + "idna 0.5.0", "once_cell", "regex", "serde", @@ -5153,6 +5840,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", + "serde", + "serde_json", "wasm-bindgen-macro", ] @@ -5235,6 +5924,23 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webauthn-rs-proto" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f1c6dc254607f48eec3bdb35b86b377202436859ca1e4c9290afafd7349dcc3" +dependencies = [ + "base64 0.21.7", + "base64urlsafedata", + "js-sys", + "serde", + "serde-wasm-bindgen", + "serde_json", + "url", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "webpki" version = "0.22.4" @@ -5254,6 +5960,16 @@ dependencies = [ "webpki", ] +[[package]] +name = "whatlang" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471d1c1645d361eb782a1650b1786a8fb58dd625e681a04c09f5ff7c8764a7b0" +dependencies = [ + "hashbrown 0.14.5", + "once_cell", +] + [[package]] name = "whoami" version = "1.5.1" @@ -5501,6 +6217,12 @@ dependencies = [ "syn 2.0.68", ] +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + [[package]] name = "zstd" version = "0.13.1" diff --git a/Cargo.toml b/Cargo.toml index 72f7acb..e0cc4a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ members = [ "crates/testx", "crates/db-utils", # actors - # "crates/account_manager", + "crates/account_manager", # "crates/cart_manager", # "crates/database_manager", # "crates/email_manager", diff --git a/config/kanidm.toml b/config/kanidm.toml index 6aaf3d4..213f8c4 100644 --- a/config/kanidm.toml +++ b/config/kanidm.toml @@ -53,7 +53,6 @@ db_path = "/data/kanidm.db" tls_chain = "/data/ca.pem" tls_key = "/data/ca.key" -verify_ca = false # # The log level of the server. May be one of info, debug, trace @@ -61,7 +60,7 @@ verify_ca = false # NOTE: this can be overridden by the environment variable # `KANIDM_LOG_LEVEL` at runtime # Defaults to "info" -# log_level = "info" +log_level = "info" # # The DNS domain name of the server. This is used in a # number of security-critical contexts diff --git a/crates/account_manager/Cargo.toml b/crates/account_manager/Cargo.toml index 5d02284..d198876 100644 --- a/crates/account_manager/Cargo.toml +++ b/crates/account_manager/Cargo.toml @@ -16,6 +16,8 @@ dotenv = { version = "0" } futures = { version = "0" } gumdrop = { version = "0" } json = { version = "0" } +kanidm_client = "1.2.2" +kanidm_proto = "1.2.2" model = { path = "../model", features = ['db'] } rumqttc = { version = "*" } serde = { version = "1", features = ["derive"] } @@ -25,6 +27,7 @@ tarpc = { version = "0", features = ["tokio1", "serde-transport-bincode", "serde thiserror = { version = "1" } tokio = { version = "1", features = ['full'] } tracing = { version = "0" } +uuid = { workspace = true, features = ["v4"] } [dev-dependencies] fake = { version = "2" } diff --git a/crates/account_manager/src/db/mod.rs b/crates/account_manager/src/db/mod.rs index 741b8fc..d00f7b5 100644 --- a/crates/account_manager/src/db/mod.rs +++ b/crates/account_manager/src/db/mod.rs @@ -4,8 +4,7 @@ pub mod addresses; pub use accounts::*; pub use addresses::*; use config::SharedAppConfig; -use sqlx_core::pool::Pool; -use sqlx_core::postgres::Postgres; +use sqlx::{Pool, Postgres}; #[derive(Clone)] pub struct Database { diff --git a/crates/account_manager/src/idp.rs b/crates/account_manager/src/idp.rs new file mode 100644 index 0000000..e3b6c55 --- /dev/null +++ b/crates/account_manager/src/idp.rs @@ -0,0 +1,126 @@ +use kanidm_client::{ClientError, KanidmClient}; +use kanidm_proto::internal::CUStatus; +use kanidm_proto::v1::Entry; + +pub async fn refresh_token(kanidm: &KanidmClient) -> Result<(), ClientError> { + kanidm + .auth_simple_password( + "idm_admin", + &std::env::var("KANIDM_IDM_ADMIN_PASS") + .expect("idm_admin password is requied, please set KANIDM_IDM_ADMIN_PASS"), + ) + .await?; + Ok(()) +} + +pub async fn create_account_with_password( + kanidm: &KanidmClient, + login: &str, + display_name: &str, + email: &str, + password: &str, +) -> Result<(), ClientError> { + refresh_token(kanidm).await?; + let _person_created = kanidm + .idm_person_account_create(login, display_name) + .await + .ok(); + let accounts = accounts(kanidm).await?; + let uid = find_account(&accounts, FindBy::Name(login)).await?; + let id = uid.to_string(); + + kanidm + .idm_person_account_update(&id, None, None, None, Some(&[email.to_string()])) + .await?; + let (session_token, status) = kanidm.idm_account_credential_update_begin(&id).await?; + tracing::debug!( + "Begin update credentials ({can_commit}): {status:?}", + can_commit = status.can_commit + ); + + kanidm + .idm_account_credential_update_set_password(&session_token, password) + .await?; + + let status = kanidm + .idm_account_credential_update_status(&session_token) + .await?; + tracing::debug!( + "Set password ({can_commit}): {status:?}", + can_commit = status.can_commit + ); + + let status = kanidm + .idm_account_credential_update_init_totp(&session_token) + .await?; + tracing::debug!( + "Init TOTP ({can_commit}): {status:?}", + can_commit = status.can_commit + ); + + // let status = kanidm + // .idm_account_credential_update_check_totp(&session_token, totp_chal, + // label) .await?; + + tracing::debug!( + "TOTP check ({can_commit}): {status:?}", + can_commit = status.can_commit + ); + + kanidm + .idm_account_credential_update_commit(&session_token) + .await?; + let status = kanidm + .idm_account_credential_update_status(&session_token) + .await?; + tracing::debug!( + "Commit ({can_commit}): {status:?}", + can_commit = status.can_commit + ); + Ok(()) +} + +pub async fn accounts(kanidm: &KanidmClient) -> Result, ClientError> { + refresh_token(kanidm).await?; + + kanidm.idm_person_account_list().await +} + +#[derive(Debug)] +pub enum FindBy<'s> { + Email(&'s str), + Name(&'s str), +} + +impl<'s> FindBy<'s> { + fn key(&self) -> &'static str { + match self { + Self::Email(..) => "mail", + Self::Name(..) => "name", + } + } + fn as_str(&self) -> &'s str { + match self { + Self::Email(s) => s, + Self::Name(s) => s, + } + } +} + +pub async fn find_account(list: &[Entry], find_by: FindBy<'_>) -> Result { + list.iter() + .find_map(|entra| { + tracing::debug!("compare {find_by:?} with {entra:?}"); + let attrs = &entra.attrs; + attrs.get(find_by.key()).filter(|v| { + tracing::debug!("compare value {v:?} with {s}", s = find_by.as_str()); + v.iter().any(|s| s == find_by.as_str()) + })?; + let id = attrs.get("uuid").and_then(|v| v.first())?; + id.parse::().ok() + }) + .ok_or_else(|| { + tracing::info!("User not found"); + ClientError::Unauthorized + }) +} diff --git a/crates/account_manager/src/main.rs b/crates/account_manager/src/main.rs index 5ee656d..905af98 100644 --- a/crates/account_manager/src/main.rs +++ b/crates/account_manager/src/main.rs @@ -4,6 +4,7 @@ use config::UpdateConfig; pub mod actions; pub mod db; +pub mod idp; pub mod mqtt; pub mod rpc; @@ -38,6 +39,23 @@ async fn main() { let db = db::Database::build(config.clone()).await; + let kanidm = kanidm_client::KanidmClientBuilder::new() + .address(config.lock().account_manager().idm_url().to_owned()) + .danger_accept_invalid_certs(cfg!(debug_assertions)) + .connect_timeout(2) + .build() + .unwrap(); + idp::accounts(&kanidm).await.unwrap(); + idp::create_account_with_password( + &kanidm, + "eraden", + "Adrian Woźniak", + "adrian.wozniak@ita-prog.pl", + "n59GmOOdcpVUJqJ1", + ) + .await + .unwrap(); + let mqtt_client = mqtt::start(config.clone(), db.clone()).await; rpc::start(config.clone(), db.clone(), mqtt_client.clone()).await; } diff --git a/crates/account_manager/src/rpc.rs b/crates/account_manager/src/rpc.rs index f12cbf1..c7bb512 100644 --- a/crates/account_manager/src/rpc.rs +++ b/crates/account_manager/src/rpc.rs @@ -29,7 +29,6 @@ struct AccountsServer { mqtt_client: AsyncClient, } -#[tarpc::server] impl Accounts for AccountsServer { async fn me(self, _: context::Context, input: me::Input) -> me::Output { let res = actions::me(input.account_id, self.db).await; diff --git a/crates/channels/src/rpc.rs b/crates/channels/src/rpc.rs index ac75ca6..944b481 100644 --- a/crates/channels/src/rpc.rs +++ b/crates/channels/src/rpc.rs @@ -8,10 +8,9 @@ use tarpc::tokio_serde::formats::Bincode; pub async fn start(name: &str, port: u16, build: Build) where - Server: Serve + Send + 'static + Clone, + Server: Serve + Send + 'static + Clone, Build: Fn() -> Server, - >::Fut: Send, - >::Resp: serde::Serialize + Send + 'static, + Server::Resp: serde::Serialize + Send + 'static, Req: Send + 'static, Req: for<'l> serde::Deserialize<'l>, { @@ -33,7 +32,7 @@ where // the generated World trait. .map(|channel| channel.execute(build())) // Max 10 channels. - .buffer_unordered(10) + // .buffer_unordered(10) .for_each(|_| async {}) .await; tracing::info!("RPC channel closed"); diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index bc1fed8..0b9d585 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -354,6 +354,7 @@ pub struct AccountManagerConfig { pub mqtt_port: u16, pub mqtt_bind: String, pub database_url: String, + pub idm_url: String, } impl Default for AccountManagerConfig { @@ -364,6 +365,7 @@ impl Default for AccountManagerConfig { mqtt_port: 1883, mqtt_bind: "0.0.0.0".into(), database_url: "postgres://postgres@localhost/myco_accounts".into(), + idm_url: "https://localhost:8443".into(), } } } @@ -378,6 +380,10 @@ impl AccountManagerConfig { pub fn mqtt_addr(&self) -> (&str, u16) { (&self.mqtt_bind, self.mqtt_port) } + + pub fn idm_url(&self) -> &str { + &self.idm_url + } } #[derive(Debug, Serialize, Deserialize)] diff --git a/crates/model/src/api.rs b/crates/model/src/api.rs index dd2389b..b305a7b 100644 --- a/crates/model/src/api.rs +++ b/crates/model/src/api.rs @@ -149,7 +149,7 @@ impl From<(crate::Order, Vec)> for Order { checkout_notes, address_id, }, - mut items, + items, ): (crate::Order, Vec), ) -> Self { Order { diff --git a/docker-compose.yml b/docker-compose.yml index e0fedd0..3195695 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,13 @@ services: ports: - 636:3636 - 443:8443 + - 8443:8443 - 8400:80 + rumqqtd: + image: bytebeamio/rumqttd + ports: + - 1883:1883 + - 1884:1884 quickwit: image: quickwit/quickwit:v0.5.2 command: run diff --git a/myco.toml b/myco.toml new file mode 100644 index 0000000..b362304 --- /dev/null +++ b/myco.toml @@ -0,0 +1,90 @@ +[account_manager] +rpc_port = 19329 +rpc_bind = "0.0.0.0" +mqtt_port = 1883 +mqtt_bind = "0.0.0.0" +database_url = "postgres://postgres@localhost/myco_accounts" +idm_url = "https://localhost:8443" + +[cart_manager] +rpc_port = 19330 +rpc_bind = "0.0.0.0" +mqtt_port = 1884 +mqtt_bind = "0.0.0.0" +database_url = "postgres://postgres@localhost/myco_carts" + +[database] +url = "postgres://postgres@localhost/myco" + +[email_sender] +rpc_port = 19331 +rpc_bind = "0.0.0.0" +mqtt_port = 1885 +mqtt_bind = "0.0.0.0" +database_url = "postgres://postgres@localhost/myco_emails" + +[files] +public_path = "/uploads" +local_path = "/var/local/myco" + +[mail] +sendgrid_secret = "Create sendgrid account and copy credentials here" +sendgrid_api_key = "Create sendgrid account and copy credentials here" +smtp_from = "Valid sendgrid authorized email address. Example: contact@example.com" + +[order_manager] +rpc_port = 19334 +rpc_bind = "0.0.0.0" +mqtt_port = 1887 +mqtt_bind = "0.0.0.0" +database_url = "postgres://postgres@localhost/myco_orders" + +[payment] +rpc_port = 19335 +rpc_bind = "0.0.0.0" +mqtt_port = 1888 +mqtt_bind = "0.0.0.0" +adapters_path = "./adapters" +optional_payment = true + +[payment.pay_u] +client_id = "Create payu account and copy here client_id" +client_secret = "Create payu account and copy here client_secret" +merchant_id = "Create payu account and copy here merchant id" +example2 = "custom value2" +example1 = "custom value1" + +[search] +sonic_search_addr = "[::1]:1491" +sonic_search_pass = "SecretPassword" +sonic_ingest_addr = "[::1]:1491" +sonic_ingest_pass = "SecretPassword" +rpc_port = 19332 +rpc_bind = "0.0.0.0" +search_active = true + +[stocks] +rpc_port = 19333 +rpc_bind = "0.0.0.0" +mqtt_port = 1886 +mqtt_bind = "0.0.0.0" +database_url = "postgres://postgres@localhost/myco_stocks" + +[tokens] +rpc_port = 19336 +rpc_bind = "0.0.0.0" +mqtt_port = 1889 +mqtt_bind = "0.0.0.0" +database_url = "postgres://postgres@localhost/myco_tokens" + +[web] +host = "https://your.comain.com" +pass_salt = "Generate it with myco generate-hash" +session_secret = "100 characters long random string" +jwt_secret = "100 characters long random string" +bind = "0.0.0.0" +port = 8080 +signature = "John Doe" +service_name = "myco" + +[plugin]