diff --git a/Cargo.lock b/Cargo.lock index b4f9f1a..f19d1ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,14 +17,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" -[[package]] -name = "admin_cli" -version = "0.0.0" -dependencies = [ - "anyhow", - "fully_pub", -] - [[package]] name = "ahash" version = "0.8.11" @@ -49,9 +41,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.20" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android-tzdata" @@ -70,9 +62,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", @@ -85,43 +77,49 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "argh" @@ -142,7 +140,7 @@ dependencies = [ "argh_shared", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] @@ -174,7 +172,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] @@ -194,9 +192,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.9" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" dependencies = [ "async-trait", "axum-core", @@ -219,7 +217,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper 1.0.1", "tokio", "tower", "tower-layer", @@ -242,7 +240,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.2", + "sync_wrapper 1.0.1", "tower-layer", "tower-service", "tracing", @@ -250,26 +248,25 @@ dependencies = [ [[package]] name = "axum-extra" -version = "0.9.6" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c794b30c904f0a1c2fb7740f7df7f7972dfaa14ef6f57cb6178dc63e5dca2f04" +checksum = "73c3220b188aea709cf1b6c5f9b01c3bd936bb08bd2b5184a12b35ac8131b1f9" dependencies = [ "axum", "axum-core", "bytes", "cookie", - "fastrand", "futures-util", "http", "http-body", "http-body-util", "mime", - "multer", "pin-project-lite", "serde", "tower", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -280,7 +277,7 @@ checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] @@ -292,14 +289,14 @@ dependencies = [ "axum", "minijinja", "serde", - "thiserror 1.0.69", + "thiserror", ] [[package]] name = "axum_typed_multipart" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41044b23e250b46af4b73286707fe517f73b3b1518cc34347ec4ae643e3e9a27" +checksum = "c0412547e063ce471a3f5ccf8a5129ae5ff64c63e40ee1bf1079dec3fcede4e7" dependencies = [ "anyhow", "axum", @@ -309,22 +306,22 @@ dependencies = [ "futures-core", "futures-util", "tempfile", - "thiserror 2.0.3", + "thiserror", "tokio", "uuid", ] [[package]] name = "axum_typed_multipart_macros" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa0a06af331eb00c4f372a38664b3e4fc599bb308b2342ffdb3770b2cad3d432" +checksum = "0bbb13e6a88be66ca8a226e4cee4d60eea0245bbdd4f22a95dfb90cbcf6be4b3" dependencies = [ "darling", "heck 0.5.0", "proc-macro-error2", "quote", - "syn 2.0.90", + "syn 2.0.79", "ubyte", ] @@ -343,6 +340,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "base32" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" + [[package]] name = "base64" version = "0.21.7" @@ -402,15 +405,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "cc" -version = "1.2.2" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "shlex", ] @@ -438,9 +441,19 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] [[package]] name = "const-oid" @@ -448,6 +461,12 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "constant_time_eq" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" + [[package]] name = "cookie" version = "0.18.1" @@ -467,9 +486,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -535,7 +554,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] @@ -546,7 +565,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] @@ -589,7 +608,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] @@ -609,9 +628,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.35" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] @@ -647,12 +666,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -674,15 +693,15 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "fastrand" -version = "2.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "flume" -version = "0.11.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ "futures-core", "futures-sink", @@ -711,7 +730,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fd8cb48eceb4e8b471af6a8e4e223cbe1286552791b9ab274512ba9cfd754df" dependencies = [ "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] @@ -766,7 +785,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] @@ -839,9 +858,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "hashlink" @@ -867,6 +886,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hex" version = "0.4.3" @@ -936,42 +961,9 @@ dependencies = [ [[package]] name = "http-range-header" -version = "0.4.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" - -[[package]] -name = "http_server" -version = "0.0.0" -dependencies = [ - "anyhow", - "argh", - "axum", - "axum-extra", - "axum-macros", - "axum-template", - "axum_typed_multipart", - "chrono", - "env_logger", - "fully_pub", - "jsonwebtoken", - "kernel", - "log", - "minijinja", - "minijinja-embed", - "serde", - "serde_json", - "serde_urlencoded", - "sqlx", - "strum", - "strum_macros", - "time", - "tokio", - "tower-http", - "url", - "utils", - "uuid", -] +checksum = "08a397c49fec283e3d6211adbe480be95aae5f304cfb923e9970e08956d5168a" [[package]] name = "httparse" @@ -993,9 +985,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.5.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", @@ -1012,9 +1004,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ "bytes", "futures-util", @@ -1164,7 +1156,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] @@ -1201,7 +1193,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.0", ] [[package]] @@ -1212,15 +1204,15 @@ checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.73" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb15147158e79fd8b8afd0252522769c4f48725460b37338544d8379d94fc8f9" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -1240,27 +1232,6 @@ dependencies = [ "simple_asn1", ] -[[package]] -name = "kernel" -version = "0.0.0" -dependencies = [ - "anyhow", - "chrono", - "dotenvy", - "env_logger", - "fully_pub", - "log", - "serde", - "serde_json", - "sqlx", - "strum", - "strum_macros", - "toml", - "url", - "utils", - "uuid", -] - [[package]] name = "lazy_static" version = "1.5.0" @@ -1272,15 +1243,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.167" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libm" -version = "0.2.11" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libsqlite3-sys" @@ -1301,9 +1272,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" -version = "0.7.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" [[package]] name = "lock_api" @@ -1359,11 +1330,50 @@ dependencies = [ "unicase", ] +[[package]] +name = "minauthator" +version = "0.1.0" +dependencies = [ + "anyhow", + "argh", + "argon2", + "axum", + "axum-extra", + "axum-macros", + "axum-template", + "axum_typed_multipart", + "base64 0.22.1", + "chrono", + "dotenvy", + "env_logger", + "fully_pub", + "jsonwebtoken", + "log", + "minijinja", + "minijinja-embed", + "rand", + "rand_core", + "redis", + "serde", + "serde_json", + "serde_urlencoded", + "sqlx", + "strum", + "strum_macros", + "time", + "tokio", + "toml", + "totp-rs", + "tower-http", + "url", + "uuid", +] + [[package]] name = "minijinja" -version = "2.5.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c37e1b517d1dcd0e51dc36c4567b9d5a29262b3ec8da6cb5d35e27a8fb529b5" +checksum = "1028b628753a7e1a88fc59c9ba4b02ecc3bc0bd3c7af23df667bc28df9b3310e" dependencies = [ "serde", ] @@ -1391,10 +1401,11 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi", "libc", "wasi", "windows-sys 0.52.0", @@ -1572,9 +1583,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -1643,14 +1654,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -1694,6 +1705,21 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redis" +version = "0.27.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6baebe319ef5e4b470f248335620098d1c2e9261e995be05f56f719ca4bdb2" +dependencies = [ + "arc-swap", + "combine", + "itoa", + "num-bigint", + "percent-encoding", + "ryu", + "url", +] + [[package]] name = "redox_syscall" version = "0.5.7" @@ -1705,9 +1731,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", @@ -1717,9 +1743,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -1749,9 +1775,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.7" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" dependencies = [ "const-oid", "digest", @@ -1775,9 +1801,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" -version = "0.38.41" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags", "errno", @@ -1806,29 +1832,29 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.215" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", "memchr", @@ -1913,7 +1939,7 @@ checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", "num-traits", - "thiserror 1.0.69", + "thiserror", "time", ] @@ -1934,9 +1960,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -2017,7 +2043,7 @@ dependencies = [ "sha2", "smallvec", "sqlformat", - "thiserror 1.0.69", + "thiserror", "tokio", "tokio-stream", "tracing", @@ -2102,7 +2128,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 1.0.69", + "thiserror", "tracing", "uuid", "whoami", @@ -2142,7 +2168,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 1.0.69", + "thiserror", "tracing", "uuid", "whoami", @@ -2212,7 +2238,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] @@ -2234,9 +2260,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -2251,9 +2277,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "1.0.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" [[package]] name = "synstructure" @@ -2263,14 +2289,14 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] name = "tempfile" -version = "3.14.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", @@ -2281,42 +2307,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" -dependencies = [ - "thiserror-impl 2.0.3", + "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] @@ -2377,9 +2383,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.1" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", @@ -2399,7 +2405,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] @@ -2460,6 +2466,19 @@ dependencies = [ "winnow", ] +[[package]] +name = "totp-rs" +version = "5.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b2f27dad992486c26b4e7455f38aa487e838d6d61b57e72906ee2b8c287a90" +dependencies = [ + "base32", + "constant_time_eq", + "hmac", + "sha1", + "sha2", +] + [[package]] name = "tower" version = "0.5.1" @@ -2478,9 +2497,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" +checksum = "8437150ab6bbc8c5f0f519e3d5ed4aa883a83dd4cdd3d1b21f9482936046cb97" dependencies = [ "bitflags", "bytes", @@ -2515,9 +2534,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "log", "pin-project-lite", @@ -2527,20 +2546,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -2559,9 +2578,12 @@ checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea" [[package]] name = "unicase" -version = "2.8.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] [[package]] name = "unicode-bidi" @@ -2571,9 +2593,9 @@ checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" @@ -2610,9 +2632,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", @@ -2643,22 +2665,11 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" -[[package]] -name = "utils" -version = "0.0.0" -dependencies = [ - "anyhow", - "argon2", - "base64 0.22.1", - "rand", - "rand_core", -] - [[package]] name = "uuid" -version = "1.11.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ "getrandom", "serde", @@ -2690,9 +2701,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.96" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d3b25c3ea1126a2ad5f4f9068483c2af1e64168f847abe863a526b8dbfe00b" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -2701,24 +2712,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.96" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52857d4c32e496dc6537646b5b117081e71fd2ff06de792e3577a150627db283" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.96" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "920b0ffe069571ebbfc9ddc0b36ba305ef65577c94b06262ed793716a1afd981" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2726,22 +2737,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.96" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf59002391099644be3524e23b781fa43d2be0c5aa0719a18c0731b9d195cab6" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.96" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5047c5392700766601942795a436d7d2599af60dcc3cc1248c9120bfb0827b0" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "whoami" @@ -2933,9 +2944,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "yoke" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" dependencies = [ "serde", "stable_deref_trait", @@ -2945,13 +2956,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", "synstructure", ] @@ -2973,27 +2984,27 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", "synstructure", ] @@ -3022,5 +3033,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.79", ] diff --git a/Cargo.toml b/Cargo.toml index c6d0713..41357f6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,26 +3,26 @@ cargo-features = ["codegen-backend"] [profile.dev] codegen-backend = "cranelift" -[workspace] -members = [ - "lib/kernel", - "lib/utils", - "lib/http_server", - "lib/admin_cli" -] +[package] +name = "minauthator" +description = "Identity provider and OAuth2 server for an small-scale organization." +version = "0.1.0" +edition = "2021" -[workspace.dependencies] +[dependencies] # commons utils anyhow = "1.0" fully_pub = "0.1" +argon2 = "0.5" strum = "0.26.3" strum_macros = "0.26" uuid = { version = "1.8", features = ["serde", "v4"] } dotenvy = "0.15.7" +base64 = "0.22.1" +rand = "0.8.5" +rand_core = { version = "0.6.4", features = ["std"] } url = "2.5.3" - -# CLI -argh = "0.1" +argh = "0.1" # for CLI # Async tokio = { version = "1.40.0", features = ["rt-multi-thread"] } @@ -34,6 +34,7 @@ env_logger = "0.11" # Serialization serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +serde_urlencoded = "0.7.1" toml = "0.8" chrono = { version = "0.4", features = ["serde"] } @@ -42,6 +43,21 @@ chrono = { version = "0.4", features = ["serde"] } sqlx = { version = "0.7.4", features = ["sqlite", "runtime-tokio", "chrono", "uuid"] } redis = { version = "0.27.3", default-features = false, features = ["acl"] } +# Web +axum = { version = "0.7.7", features = ["json", "multipart"] } +axum-extra = { version = "0.9.4", features = ["cookie"] } +axum-template = { version = "2.4.0", features = ["minijinja"] } +axum_typed_multipart = "0.13.1" +minijinja = { version = "2.1", features = ["builtins"] } +# to make work the static assets server +tower-http = { version = "0.6.1", features = ["fs"] } + # Auth utils totp-rs = "5.6" +minijinja-embed = "2.3.1" +axum-macros = "0.4.2" +jsonwebtoken = "9.3.0" +time = "0.3.36" +[build-dependencies] +minijinja-embed = "2.3.1" diff --git a/lib/http_server/build.rs b/build.rs similarity index 100% rename from lib/http_server/build.rs rename to build.rs diff --git a/docs/draft.md b/docs/draft.md index 5a962c7..aa65361 100644 --- a/docs/draft.md +++ b/docs/draft.md @@ -3,7 +3,3 @@ https://datatracker.ietf.org/doc/html/rfc6749 https://stackoverflow.com/questions/79118231/how-to-access-the-axum-request-path-in-a-minijinja-template - -## Oauth2 test - --> authorize diff --git a/tests/manual/.gitignore b/http_integration_tests/.gitignore similarity index 100% rename from tests/manual/.gitignore rename to http_integration_tests/.gitignore diff --git a/tests/manual/access_token_request.sh b/http_integration_tests/access_token_request.sh similarity index 100% rename from tests/manual/access_token_request.sh rename to http_integration_tests/access_token_request.sh diff --git a/tests/manual/authorize.sh b/http_integration_tests/authorize.sh similarity index 88% rename from tests/manual/authorize.sh rename to http_integration_tests/authorize.sh index fa9ff4c..615f570 100755 --- a/tests/manual/authorize.sh +++ b/http_integration_tests/authorize.sh @@ -6,7 +6,7 @@ curl -v http://localhost:8085/authorize \ --cookie "tmp/.curl-cookies" \ -d client_id="a1785786-8be1-443c-9a6f-35feed703609" \ -d response_type="code" \ - -d redirect_uri="http://localhost:9090/callback" \ + -d redirect_uri="http://localhost:9090/authorize" \ -d scope="user_read_basic" \ -d state="qxYAfk4kf6pbZkms78jM" diff --git a/tests/manual/get_user_info.sh b/http_integration_tests/get_user_info.sh similarity index 100% rename from tests/manual/get_user_info.sh rename to http_integration_tests/get_user_info.sh diff --git a/tests/manual/login.sh b/http_integration_tests/login.sh similarity index 100% rename from tests/manual/login.sh rename to http_integration_tests/login.sh diff --git a/tests/manual/oauth2c.sh b/http_integration_tests/oauth2c.sh similarity index 100% rename from tests/manual/oauth2c.sh rename to http_integration_tests/oauth2c.sh diff --git a/tests/manual/register.sh b/http_integration_tests/register.sh similarity index 100% rename from tests/manual/register.sh rename to http_integration_tests/register.sh diff --git a/justfile b/justfile index 8bc1c40..4f04243 100644 --- a/justfile +++ b/justfile @@ -1,12 +1,11 @@ export RUST_BACKTRACE := "1" export RUST_LOG := "trace" -export RUN_ARGS := "run --bin minauthator-server -- --config ./config.toml --database ./tmp/dbs/minauthator.db --static-assets ./assets" watch-run: - cargo-watch -x "$RUN_ARGS" + cargo-watch -x 'run -- --config ./config.toml --database ./tmp/dbs/minauthator.db --static-assets ./assets' run: - cargo $RUN_ARGS + cargo run -- --database ./tmp/dbs/minauthator.db --config ./config.toml --static-assets ./assets docker-run: docker run -p 3085:8080 -v ./tmp/docker/config:/etc/minauthator -v ./tmp/docker/db:/var/lib/minauthator minauthator diff --git a/lib/admin_cli/Cargo.toml b/lib/admin_cli/Cargo.toml deleted file mode 100644 index 97e0107..0000000 --- a/lib/admin_cli/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "admin_cli" -edition = "2021" - -[dependencies] -anyhow = { workspace = true } -fully_pub = { workspace = true } - -[[bin]] -name = "minauthator-admin" -path = "src/main.rs" diff --git a/lib/admin_cli/src/main.rs b/lib/admin_cli/src/main.rs deleted file mode 100644 index 9cf2d88..0000000 --- a/lib/admin_cli/src/main.rs +++ /dev/null @@ -1,6 +0,0 @@ -use anyhow::Result; - -fn main() -> Result<()> { - println!("Starting minauthator admin CLI"); - Ok(()) -} diff --git a/lib/http_server/Cargo.toml b/lib/http_server/Cargo.toml deleted file mode 100644 index 8695cf6..0000000 --- a/lib/http_server/Cargo.toml +++ /dev/null @@ -1,51 +0,0 @@ -[package] -name = "http_server" -edition = "2021" - -[dependencies] -kernel = { path = "../kernel" } -utils = { path = "../utils" } - -# common -log = { workspace = true } -env_logger = { workspace = true } - -strum = { workspace = true } -strum_macros = { workspace = true } - -anyhow = { workspace = true } -fully_pub = { workspace = true } - -tokio = { workspace = true } - -# Web -axum = { version = "0.7.7", features = ["json", "multipart"] } -axum-extra = { version = "0.9.4", features = ["cookie"] } -axum-template = { version = "2.4.0", features = ["minijinja"] } -axum_typed_multipart = "0.13.1" -minijinja = { version = "2.1", features = ["builtins"] } -# to make work the static assets server -tower-http = { version = "0.6.1", features = ["fs"] } - -minijinja-embed = "2.3.1" -axum-macros = "0.4.2" -jsonwebtoken = "9.3.0" -time = "0.3.36" - -serde = { workspace = true } -serde_json = { workspace = true } -serde_urlencoded = "0.7.1" -chrono = { workspace = true } - -argh = { workspace = true } - -sqlx = { workspace = true } -uuid = { workspace = true } -url = { workspace = true } - -[build-dependencies] -minijinja-embed = "2.3.1" - -[[bin]] -name = "minauthator-server" -path = "src/main.rs" diff --git a/lib/http_server/src/controllers/api/index.rs b/lib/http_server/src/controllers/api/index.rs deleted file mode 100644 index 9253ece..0000000 --- a/lib/http_server/src/controllers/api/index.rs +++ /dev/null @@ -1,14 +0,0 @@ -use axum::{extract::State, response::IntoResponse, Json}; -use serde_json::json; - -use crate::AppState; - -pub async fn get_index( - State(app_state): State, -) -> impl IntoResponse { - Json(json!({ - "software": "Minauthator", - "name": app_state.config.instance.name, - "base_uri": app_state.config.instance.base_uri - })) -} diff --git a/lib/http_server/src/controllers/ui/admin/mod.rs b/lib/http_server/src/controllers/ui/admin/mod.rs deleted file mode 100644 index e69de29..0000000 diff --git a/lib/kernel/Cargo.toml b/lib/kernel/Cargo.toml deleted file mode 100644 index a345f83..0000000 --- a/lib/kernel/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "kernel" -edition = "2021" - -[dependencies] -utils = { path = "../utils" } - -log = { workspace = true } -env_logger = { workspace = true } -anyhow = { workspace = true } -fully_pub = { workspace = true } -strum = { workspace = true } -strum_macros = { workspace = true } -serde = { workspace = true } -serde_json = { workspace = true } -chrono = { workspace = true } -toml = { workspace = true } -sqlx = { workspace = true } -dotenvy = { workspace = true } - -uuid = { workspace = true } -url = { workspace = true } diff --git a/lib/kernel/src/actions/mod.rs b/lib/kernel/src/actions/mod.rs deleted file mode 100644 index e69de29..0000000 diff --git a/lib/kernel/src/actions/user.rs b/lib/kernel/src/actions/user.rs deleted file mode 100644 index e69de29..0000000 diff --git a/lib/kernel/src/consts.rs b/lib/kernel/src/consts.rs deleted file mode 100644 index bd3bef1..0000000 --- a/lib/kernel/src/consts.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub const DEFAULT_DB_PATH: &str = "/var/lib/minauthator/minauthator.db"; -pub const DEFAULT_ASSETS_PATH: &str = "/usr/local/lib/minauthator/assets"; -pub const DEFAULT_CONFIG_PATH: &str = "/etc/minauthator/config.yaml"; - diff --git a/lib/kernel/src/context.rs b/lib/kernel/src/context.rs deleted file mode 100644 index af5fab3..0000000 --- a/lib/kernel/src/context.rs +++ /dev/null @@ -1,51 +0,0 @@ -use std::{env, fs}; -use anyhow::{Result, Context, anyhow}; -use fully_pub::fully_pub; - -use log::info; -use sqlx::{Pool, Sqlite}; -use crate::{ - consts::{DEFAULT_CONFIG_PATH, DEFAULT_DB_PATH}, database::prepare_database, models::config::Config, repositories::storage::Storage -}; - -/// get server config -fn get_config(path: String) -> Result { - let inp_def_yaml = fs::read_to_string(path) - .expect("Should have been able to read the the config file"); - - toml::from_str(&inp_def_yaml) - .map_err(|e| anyhow!("Failed to parse config, {:?}", e)) -} - -#[fully_pub] -struct StartKernelConfig { - config_path: Option, - database_path: Option, -} - -#[derive(Debug, Clone)] -#[fully_pub] -struct AppSecrets { - jwt_secret: String -} - -pub async fn get_kernel_context(start_config: StartKernelConfig) -> Result<(Config, AppSecrets, Storage)> { - env_logger::init(); - let _ = dotenvy::dotenv(); - - let database_path = &start_config.database_path.unwrap_or(DEFAULT_DB_PATH.to_string()); - info!("Using database file at {}", database_path); - let storage = prepare_database(database_path).await.context("Could not prepare db.")?; - - let config_path = start_config.config_path.unwrap_or(DEFAULT_CONFIG_PATH.to_string()); - info!("Using config file at {}", &config_path); - let config: Config = get_config(config_path) - .expect("Cannot get config."); - - dotenvy::dotenv().context("loading .env")?; - let secrets = AppSecrets { - jwt_secret: env::var("APP_JWT_SECRET").context("Expecting APP_JWT_SECRET env var.")? - }; - - Ok((config, secrets, storage)) -} diff --git a/lib/kernel/src/lib.rs b/lib/kernel/src/lib.rs deleted file mode 100644 index 534248a..0000000 --- a/lib/kernel/src/lib.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub mod models; -pub mod database; -pub mod consts; -pub mod context; -pub mod actions; -pub mod repositories; - diff --git a/lib/kernel/src/repositories/mod.rs b/lib/kernel/src/repositories/mod.rs deleted file mode 100644 index d090739..0000000 --- a/lib/kernel/src/repositories/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod storage; -pub mod users; diff --git a/lib/kernel/src/repositories/storage.rs b/lib/kernel/src/repositories/storage.rs deleted file mode 100644 index bbad80c..0000000 --- a/lib/kernel/src/repositories/storage.rs +++ /dev/null @@ -1,7 +0,0 @@ -use fully_pub::fully_pub; -use sqlx::{Pool, Sqlite}; - -/// storage interface -#[fully_pub] -#[derive(Clone, Debug)] -struct Storage(Pool); diff --git a/lib/kernel/src/repositories/users.rs b/lib/kernel/src/repositories/users.rs deleted file mode 100644 index 6ef31f4..0000000 --- a/lib/kernel/src/repositories/users.rs +++ /dev/null @@ -1,14 +0,0 @@ -// user repositories - -use crate::models::user::User; - -use super::storage::Storage; -use anyhow::{Result, Context}; - -async fn get_user_by_id(storage: &Storage, user_id: &str) -> Result { - sqlx::query_as::<_, User>("SELECT * FROM users WHERE id = $1") - .bind(user_id) - .fetch_one(&storage.0) - .await - .context("To get user from claim") -} diff --git a/lib/utils/Cargo.toml b/lib/utils/Cargo.toml deleted file mode 100644 index 18fc24c..0000000 --- a/lib/utils/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "utils" -edition = "2021" - -[dependencies] -anyhow = { workspace = true } -argon2 = "0.5" -base64 = "0.22" -rand = "0.8.5" -rand_core = { version = "0.6.4", features = ["std"] } diff --git a/lib/http_server/src/main.rs b/src/cli.rs similarity index 74% rename from lib/http_server/src/main.rs rename to src/cli.rs index 6b93ae9..9317f31 100644 --- a/lib/http_server/src/main.rs +++ b/src/cli.rs @@ -1,9 +1,9 @@ use argh::FromArgs; use anyhow::{Context, Result}; -use http_server::{start_http_server, ServerConfig}; -use kernel::{consts::DEFAULT_ASSETS_PATH, context::{get_kernel_context, StartKernelConfig}}; use log::info; +use crate::{get_app_context, server::{start_http_server, ServerConfig}, DEFAULT_ASSETS_PATH}; + #[derive(Debug, FromArgs)] /// Minauthator daemon struct ServerCliFlags { @@ -27,15 +27,14 @@ struct ServerCliFlags { listen_port: u32 } -/// handle CLI arguments to start HTTP server daemon -#[tokio::main] -pub async fn main() -> Result<()> { +/// handle CLI arguments to start process daemon +pub async fn start_server_cli() -> Result<()> { info!("Starting minauth"); let flags: ServerCliFlags = argh::from_env(); - let (config, secrets, db_pool) = get_kernel_context(StartKernelConfig { + let (config, secrets, db_pool) = get_app_context(crate::StartAppConfig { config_path: flags.config, database_path: flags.database - }).await.context("Getting kernel context")?; + }).await.context("Getting app context")?; start_http_server( ServerConfig { assets_path: flags.static_assets.unwrap_or(DEFAULT_ASSETS_PATH.to_string()), diff --git a/src/consts.rs b/src/consts.rs new file mode 100644 index 0000000..1d9bd00 --- /dev/null +++ b/src/consts.rs @@ -0,0 +1 @@ +pub const WEB_GUI_JWT_COOKIE_NAME: &str = "minauthator_jwt"; diff --git a/lib/http_server/src/controllers/api/mod.rs b/src/controllers/api/mod.rs similarity index 77% rename from lib/http_server/src/controllers/api/mod.rs rename to src/controllers/api/mod.rs index eef80ff..36f3a8e 100644 --- a/lib/http_server/src/controllers/api/mod.rs +++ b/src/controllers/api/mod.rs @@ -1,4 +1,3 @@ -pub mod index; pub mod oauth2; pub mod read_user; pub mod openid; diff --git a/lib/http_server/src/controllers/api/oauth2/access_token.rs b/src/controllers/api/oauth2/access_token.rs similarity index 95% rename from lib/http_server/src/controllers/api/oauth2/access_token.rs rename to src/controllers/api/oauth2/access_token.rs index 1da6993..b0d9c54 100644 --- a/lib/http_server/src/controllers/api/oauth2/access_token.rs +++ b/src/controllers/api/oauth2/access_token.rs @@ -4,9 +4,10 @@ use fully_pub::fully_pub; use log::error; use serde::{Deserialize, Serialize}; -use kernel::models::authorization::Authorization; use crate::{ - services::{app_session::AppClientSession, session::create_token}, token_claims::AppUserTokenClaims, AppState + models::{authorization::Authorization, token_claims::AppUserTokenClaims}, + server::AppState, + services::{app_session::AppClientSession, session::create_token} }; const AUTHORIZATION_CODE_TTL_SECONDS: i64 = 120; @@ -42,7 +43,7 @@ pub async fn get_access_token( ) .bind(&form.code) .bind(&app_client_session.client_id) - .fetch_one(&app_state.db.0) + .fetch_one(&app_state.db) .await; let authorization = match authorizations_res { Ok(val) => val, diff --git a/lib/http_server/src/controllers/api/oauth2/mod.rs b/src/controllers/api/oauth2/mod.rs similarity index 100% rename from lib/http_server/src/controllers/api/oauth2/mod.rs rename to src/controllers/api/oauth2/mod.rs diff --git a/lib/http_server/src/controllers/api/openid/mod.rs b/src/controllers/api/openid/mod.rs similarity index 100% rename from lib/http_server/src/controllers/api/openid/mod.rs rename to src/controllers/api/openid/mod.rs diff --git a/lib/http_server/src/controllers/api/openid/well_known.rs b/src/controllers/api/openid/well_known.rs similarity index 93% rename from lib/http_server/src/controllers/api/openid/well_known.rs rename to src/controllers/api/openid/well_known.rs index 54daf3e..64ac5a3 100644 --- a/lib/http_server/src/controllers/api/openid/well_known.rs +++ b/src/controllers/api/openid/well_known.rs @@ -1,10 +1,9 @@ use axum::{extract::State, response::IntoResponse, Json}; use fully_pub::fully_pub; -use kernel::models::authorization::AuthorizationScope; use serde::Serialize; use strum::IntoEnumIterator; -use crate::AppState; +use crate::{models::authorization::AuthorizationScope, server::AppState}; #[derive(Serialize)] #[fully_pub] diff --git a/lib/http_server/src/controllers/api/read_user.rs b/src/controllers/api/read_user.rs similarity index 83% rename from lib/http_server/src/controllers/api/read_user.rs rename to src/controllers/api/read_user.rs index 4b9e7c1..a6b34dd 100644 --- a/lib/http_server/src/controllers/api/read_user.rs +++ b/src/controllers/api/read_user.rs @@ -2,8 +2,7 @@ use axum::{extract::State, response::IntoResponse, Extension, Json}; use fully_pub::fully_pub; use serde::Serialize; -use crate::{token_claims::AppUserTokenClaims, AppState}; -use kernel::models::user::User; +use crate::{models::{token_claims::AppUserTokenClaims, user::User}, server::AppState}; #[derive(Serialize)] #[fully_pub] @@ -20,10 +19,10 @@ pub async fn read_user_basic( State(app_state): State, Extension(token_claims): Extension, ) -> impl IntoResponse { - // 1. This handler require app user authentification (JWT) + // 1. This handler require client user authentification (JWT) let user_res = sqlx::query_as::<_, User>("SELECT * FROM users WHERE id = $1") .bind(&token_claims.user_id) - .fetch_one(&app_state.db.0) + .fetch_one(&app_state.db) .await .expect("To get user from claim"); let output = ReadUserBasicExtract { diff --git a/lib/http_server/src/controllers/mod.rs b/src/controllers/mod.rs similarity index 100% rename from lib/http_server/src/controllers/mod.rs rename to src/controllers/mod.rs diff --git a/lib/http_server/src/controllers/ui/admin/apps.rs b/src/controllers/ui/admin/apps.rs similarity index 100% rename from lib/http_server/src/controllers/ui/admin/apps.rs rename to src/controllers/ui/admin/apps.rs diff --git a/lib/http_server/src/controllers/ui/admin/authorizations.rs b/src/controllers/ui/admin/authorizations.rs similarity index 100% rename from lib/http_server/src/controllers/ui/admin/authorizations.rs rename to src/controllers/ui/admin/authorizations.rs diff --git a/lib/http_server/src/controllers/ui/admin/users.rs b/src/controllers/ui/admin/users.rs similarity index 100% rename from lib/http_server/src/controllers/ui/admin/users.rs rename to src/controllers/ui/admin/users.rs diff --git a/lib/http_server/src/controllers/ui/apps.rs b/src/controllers/ui/apps.rs similarity index 89% rename from lib/http_server/src/controllers/ui/apps.rs rename to src/controllers/ui/apps.rs index 05992fb..d048cb2 100644 --- a/lib/http_server/src/controllers/ui/apps.rs +++ b/src/controllers/ui/apps.rs @@ -1,10 +1,10 @@ use axum::{extract::State, response::IntoResponse, Extension}; use minijinja::context; -use kernel::models::{config::AppVisibility, config::Application}; use crate::{ + models::{config::AppVisibility, config::Application}, renderer::TemplateRenderer, - AppState + server::AppState }; pub async fn list_apps( diff --git a/lib/http_server/src/controllers/ui/authorize.rs b/src/controllers/ui/authorize.rs similarity index 95% rename from lib/http_server/src/controllers/ui/authorize.rs rename to src/controllers/ui/authorize.rs index f6016c9..0bcb1e5 100644 --- a/lib/http_server/src/controllers/ui/authorize.rs +++ b/src/controllers/ui/authorize.rs @@ -7,15 +7,14 @@ use serde::{Deserialize, Serialize}; use url::Url; use uuid::Uuid; -use kernel::{ - models::{authorization::Authorization, config::AppAuthorizeFlow} -}; -use utils::get_random_alphanumerical; use crate::{ - renderer::TemplateRenderer, services::oauth2::{parse_scope, verify_redirect_uri}, token_claims::UserTokenClaims, AppState + models::{authorization::Authorization, config::AppAuthorizeFlow, token_claims::UserTokenClaims}, + renderer::TemplateRenderer, server::AppState, + services::oauth2::{parse_scope, verify_redirect_uri}, + utils::get_random_alphanumerical }; -#[derive(Debug, Serialize, Deserialize)] +#[derive(Serialize, Deserialize)] #[fully_pub] /// query params described in [RFC6749 section 4.1.1](https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.1) struct AuthorizationParams { @@ -106,7 +105,7 @@ pub async fn authorize_form( .bind(&token_claims.sub) .bind(&authorization_params.client_id) .bind(sqlx::types::Json(&scopes)) - .fetch_one(&app_state.db.0) + .fetch_one(&app_state.db) .await; match authorizations_res { @@ -120,7 +119,7 @@ pub async fn authorize_form( .bind(existing_authorization.id) .bind(authorization_code.clone()) .bind(Utc::now().to_rfc3339_opts(SecondsFormat::Millis, true)) - .execute(&app_state.db.0) + .execute(&app_state.db) .await.unwrap(); // Authorization already given, just redirect to the app @@ -220,7 +219,7 @@ pub async fn perform_authorize( .bind(authorization.code) .bind(authorization.last_used_at.map(|x| x.to_rfc3339_opts(SecondsFormat::Millis, true))) .bind(authorization.created_at.to_rfc3339_opts(SecondsFormat::Millis, true)) - .execute(&app_state.db.0) + .execute(&app_state.db) .await; if let Err(err) = res { error!("Failed to save authorization in DB. {}", err); diff --git a/lib/http_server/src/controllers/ui/home.rs b/src/controllers/ui/home.rs similarity index 100% rename from lib/http_server/src/controllers/ui/home.rs rename to src/controllers/ui/home.rs diff --git a/lib/http_server/src/controllers/ui/login.rs b/src/controllers/ui/login.rs similarity index 88% rename from lib/http_server/src/controllers/ui/login.rs rename to src/controllers/ui/login.rs index 59cce05..6bdca40 100644 --- a/lib/http_server/src/controllers/ui/login.rs +++ b/src/controllers/ui/login.rs @@ -1,15 +1,15 @@ use axum_extra::extract::{cookie::{Cookie, SameSite}, CookieJar}; use chrono::{SecondsFormat, Utc}; -use kernel::models::user::{User, UserStatus}; use log::info; use serde::Deserialize; -use axum::{extract::{Query, State}, http::StatusCode, response::{IntoResponse, Redirect}, Extension, Form}; +use axum::{extract::{Query, State}, http::{HeaderMap, HeaderValue, StatusCode}, response::{Html, IntoResponse, Redirect}, Extension, Form}; use fully_pub::fully_pub; use minijinja::context; use time::Duration; -use utils::verify_password_hash; -use crate::{renderer::TemplateRenderer, services::session::create_token, token_claims::UserTokenClaims, AppState, WEB_GUI_JWT_COOKIE_NAME}; +use crate::{ + consts::WEB_GUI_JWT_COOKIE_NAME, models::{token_claims::UserTokenClaims, user::{User, UserStatus}}, renderer::TemplateRenderer, server::AppState, services::{password::verify_password_hash, session::create_token} +}; pub async fn login_form( Extension(renderer): Extension @@ -47,7 +47,7 @@ pub async fn perform_login( let user_res = sqlx::query_as::<_, User>("SELECT * FROM users WHERE handle = $1 OR email = $2") .bind(&login.login) .bind(&login.login) - .fetch_one(&app_state.db.0) + .fetch_one(&app_state.db) .await; let password_hash = match &user_res { @@ -87,7 +87,7 @@ pub async fn perform_login( let _result = sqlx::query("UPDATE users SET last_login_at = $2 WHERE id = $1") .bind(user.id.clone()) .bind(Utc::now().to_rfc3339_opts(SecondsFormat::Millis, true)) - .execute(&app_state.db.0) + .execute(&app_state.db) .await.unwrap(); let jwt_max_age = Duration::days(15); diff --git a/lib/http_server/src/controllers/ui/logout.rs b/src/controllers/ui/logout.rs similarity index 85% rename from lib/http_server/src/controllers/ui/logout.rs rename to src/controllers/ui/logout.rs index 256b7a6..fd55422 100644 --- a/lib/http_server/src/controllers/ui/logout.rs +++ b/src/controllers/ui/logout.rs @@ -1,7 +1,7 @@ use axum::response::{IntoResponse, Redirect}; use axum_extra::extract::CookieJar; -use crate::WEB_GUI_JWT_COOKIE_NAME; +use crate::consts::WEB_GUI_JWT_COOKIE_NAME; pub async fn perform_logout( cookies: CookieJar diff --git a/lib/http_server/src/controllers/ui/me.rs b/src/controllers/ui/me.rs similarity index 93% rename from lib/http_server/src/controllers/ui/me.rs rename to src/controllers/ui/me.rs index 6d3113d..2a6b8c0 100644 --- a/lib/http_server/src/controllers/ui/me.rs +++ b/src/controllers/ui/me.rs @@ -5,11 +5,10 @@ use log::error; use minijinja::context; use crate::{ - token_claims::UserTokenClaims, + models::{token_claims::UserTokenClaims, user::User}, renderer::TemplateRenderer, - AppState + server::AppState }; -use kernel::models::user::User; pub async fn me_page( State(app_state): State, @@ -18,7 +17,7 @@ pub async fn me_page( ) -> impl IntoResponse { let user_res = sqlx::query_as::<_, User>("SELECT * FROM users WHERE id = $1") .bind(&token_claims.sub) - .fetch_one(&app_state.db.0) + .fetch_one(&app_state.db) .await .expect("To get user from claim"); @@ -39,7 +38,7 @@ pub async fn me_update_details_form( let user_res = sqlx::query_as::<_, User>("SELECT * FROM users WHERE id = $1") .bind(&token_claims.sub) - .fetch_one(&app_state.db.0) + .fetch_one(&app_state.db) .await .expect("To get user from claim"); @@ -80,12 +79,12 @@ pub async fn me_perform_update_details( .bind(details_update.full_name) .bind(details_update.website) .bind(details_update.picture.contents.to_vec()) - .execute(&app_state.db.0) + .execute(&app_state.db) .await; let user_res = sqlx::query_as::<_, User>("SELECT * FROM users WHERE id = $1") .bind(&token_claims.sub) - .fetch_one(&app_state.db.0) + .fetch_one(&app_state.db) .await .expect("To get user from claim"); diff --git a/lib/http_server/src/controllers/ui/mod.rs b/src/controllers/ui/mod.rs similarity index 100% rename from lib/http_server/src/controllers/ui/mod.rs rename to src/controllers/ui/mod.rs diff --git a/lib/http_server/src/controllers/ui/register.rs b/src/controllers/ui/register.rs similarity index 93% rename from lib/http_server/src/controllers/ui/register.rs rename to src/controllers/ui/register.rs index 7a902fc..28ba1db 100644 --- a/lib/http_server/src/controllers/ui/register.rs +++ b/src/controllers/ui/register.rs @@ -7,10 +7,7 @@ use fully_pub::fully_pub; use sqlx::types::Json; use uuid::Uuid; -use crate::{renderer::TemplateRenderer, AppState}; - -use kernel::models::user::{User, UserStatus}; -use utils::get_password_hash; +use crate::{models::user::{User, UserStatus}, renderer::TemplateRenderer, server::AppState, services::password::get_password_hash}; pub async fn register_form( State(app_state): State @@ -69,7 +66,7 @@ pub async fn perform_register( .bind(user.roles) .bind(user.password_hash) .bind(user.created_at.to_rfc3339_opts(SecondsFormat::Millis, true)) - .execute(&app_state.db.0) + .execute(&app_state.db) .await; match res { Err(err) => { @@ -96,7 +93,7 @@ pub async fn perform_register( StatusCode::OK, "pages/register", context!( - success => true + success => true ) ) } diff --git a/lib/http_server/src/controllers/ui/user_panel/authorizations.rs b/src/controllers/ui/user_panel/authorizations.rs similarity index 89% rename from lib/http_server/src/controllers/ui/user_panel/authorizations.rs rename to src/controllers/ui/user_panel/authorizations.rs index 7f691be..551b769 100644 --- a/lib/http_server/src/controllers/ui/user_panel/authorizations.rs +++ b/src/controllers/ui/user_panel/authorizations.rs @@ -4,8 +4,7 @@ use log::error; use minijinja::context; use serde::Deserialize; -use kernel::models::authorization::Authorization; -use crate::{renderer::TemplateRenderer, token_claims::UserTokenClaims, AppState}; +use crate::{models::{authorization::Authorization, token_claims::UserTokenClaims}, renderer::TemplateRenderer, server::AppState}; pub async fn get_authorizations( State(app_state): State, @@ -14,7 +13,7 @@ pub async fn get_authorizations( ) -> impl IntoResponse { let user_authorizations = sqlx::query_as::<_, Authorization>("SELECT * FROM authorizations WHERE user_id = $1") .bind(&token_claims.sub) - .fetch_all(&app_state.db.0) + .fetch_all(&app_state.db) .await .expect("To get user authorization with user_id from claim"); renderer.render( @@ -38,7 +37,7 @@ pub async fn revoke_authorization( ) -> impl IntoResponse { let delete_res = sqlx::query("DELETE FROM authorizations WHERE id = $1") .bind(&form.authorization_id) - .execute(&app_state.db.0) + .execute(&app_state.db) .await; match delete_res { Ok(_) => {}, diff --git a/lib/http_server/src/controllers/ui/user_panel/mod.rs b/src/controllers/ui/user_panel/mod.rs similarity index 100% rename from lib/http_server/src/controllers/ui/user_panel/mod.rs rename to src/controllers/ui/user_panel/mod.rs diff --git a/lib/kernel/src/database.rs b/src/database.rs similarity index 64% rename from lib/kernel/src/database.rs rename to src/database.rs index 7e0b334..66077de 100644 --- a/lib/kernel/src/database.rs +++ b/src/database.rs @@ -1,10 +1,8 @@ use anyhow::{Context, Result}; -use sqlx::{sqlite::{SqliteConnectOptions, SqlitePoolOptions}, ConnectOptions}; +use sqlx::{sqlite::{SqliteConnectOptions, SqlitePoolOptions}, Pool, Sqlite, ConnectOptions}; use std::str::FromStr; -use crate::repositories::storage::Storage; - -pub async fn prepare_database(sqlite_db_path: &str) -> Result { +pub async fn prepare_database(sqlite_db_path: &str) -> Result> { let conn_str = format!("sqlite:{}", sqlite_db_path); let pool = SqlitePoolOptions::new() @@ -16,6 +14,6 @@ pub async fn prepare_database(sqlite_db_path: &str) -> Result { .await .context("could not connect to database_url")?; - Ok(Storage(pool)) + Ok(pool) } diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..016a7bd --- /dev/null +++ b/src/main.rs @@ -0,0 +1,62 @@ +pub mod models; +pub mod controllers; +pub mod router; +pub mod server; +pub mod database; +pub mod cli; +pub mod utils; +pub mod services; +pub mod middlewares; +pub mod renderer; +pub mod consts; + +use std::{env, fs}; +use anyhow::{Result, Context, anyhow}; + +use database::prepare_database; +use log::info; +use sqlx::{Pool, Sqlite}; +use models::config::{AppSecrets, Config}; + +pub const DEFAULT_DB_PATH: &str = "/var/lib/minauthator/minauthator.db"; +pub const DEFAULT_ASSETS_PATH: &str = "/usr/local/lib/minauthator/assets"; +pub const DEFAULT_CONFIG_PATH: &str = "/etc/minauthator/config.yaml"; + +fn get_config(path: String) -> Result { + let inp_def_yaml = fs::read_to_string(path) + .expect("Should have been able to read the the config file"); + + toml::from_str(&inp_def_yaml) + .map_err(|e| anyhow!("Failed to parse config, {:?}", e)) +} + +struct StartAppConfig { + config_path: Option, + database_path: Option, +} + +#[tokio::main] +async fn main() -> Result<()> { + cli::start_server_cli().await +} + +async fn get_app_context(start_app_config: StartAppConfig) -> Result<(Config, AppSecrets, Pool)> { + env_logger::init(); + let _ = dotenvy::dotenv(); + + let database_path = &start_app_config.database_path.unwrap_or(DEFAULT_DB_PATH.to_string()); + info!("Using database file at {}", database_path); + let pool = prepare_database(database_path).await.context("Could not prepare db.")?; + + let config_path = start_app_config.config_path.unwrap_or(DEFAULT_CONFIG_PATH.to_string()); + info!("Using config file at {}", &config_path); + let config: Config = get_config(config_path) + .expect("Cannot get config."); + + dotenvy::dotenv().context("loading .env")?; + let secrets = AppSecrets { + jwt_secret: env::var("APP_JWT_SECRET").context("Expecting APP_JWT_SECRET env var.")? + }; + + Ok((config, secrets, pool)) +} diff --git a/lib/http_server/src/middlewares/app_auth.rs b/src/middlewares/app_auth.rs similarity index 95% rename from lib/http_server/src/middlewares/app_auth.rs rename to src/middlewares/app_auth.rs index 3709f8b..defe63b 100644 --- a/lib/http_server/src/middlewares/app_auth.rs +++ b/src/middlewares/app_auth.rs @@ -5,12 +5,9 @@ use axum::{ response::{Html, IntoResponse, Response}, Extension }; -use utils::parse_basic_auth; use crate::{ - services::{app_session::AppClientSession, session::verify_token}, - token_claims::AppUserTokenClaims, - AppState + models::token_claims::AppUserTokenClaims, server::AppState, services::{app_session::AppClientSession, session::verify_token}, utils::parse_basic_auth }; diff --git a/lib/http_server/src/middlewares/mod.rs b/src/middlewares/mod.rs similarity index 100% rename from lib/http_server/src/middlewares/mod.rs rename to src/middlewares/mod.rs diff --git a/lib/http_server/src/middlewares/renderer.rs b/src/middlewares/renderer.rs similarity index 84% rename from lib/http_server/src/middlewares/renderer.rs rename to src/middlewares/renderer.rs index 2886afa..0e01238 100644 --- a/lib/http_server/src/middlewares/renderer.rs +++ b/src/middlewares/renderer.rs @@ -1,5 +1,6 @@ use axum::{extract::{Request, State}, http::StatusCode, middleware::Next, response::Response, Extension}; -use crate::{renderer::TemplateRenderer, token_claims::UserTokenClaims, AppState}; + +use crate::{models::token_claims::UserTokenClaims, renderer::TemplateRenderer, server::AppState}; pub async fn renderer_middleware( State(app_state): State, diff --git a/lib/http_server/src/middlewares/user_auth.rs b/src/middlewares/user_auth.rs similarity index 93% rename from lib/http_server/src/middlewares/user_auth.rs rename to src/middlewares/user_auth.rs index 7582eb7..095eecf 100644 --- a/lib/http_server/src/middlewares/user_auth.rs +++ b/src/middlewares/user_auth.rs @@ -7,9 +7,7 @@ use axum::{ use axum_extra::extract::CookieJar; use crate::{ - services::session::verify_token, - token_claims::UserTokenClaims, - AppState, WEB_GUI_JWT_COOKIE_NAME + consts::WEB_GUI_JWT_COOKIE_NAME, models::token_claims::UserTokenClaims, server::AppState, services::session::verify_token }; diff --git a/lib/kernel/src/models/authorization.rs b/src/models/authorization.rs similarity index 100% rename from lib/kernel/src/models/authorization.rs rename to src/models/authorization.rs diff --git a/lib/kernel/src/models/config.rs b/src/models/config.rs similarity index 99% rename from lib/kernel/src/models/config.rs rename to src/models/config.rs index 57a275a..a9512b0 100644 --- a/lib/kernel/src/models/config.rs +++ b/src/models/config.rs @@ -69,6 +69,7 @@ struct Config { roles: Vec } + #[derive(Debug, Clone)] #[fully_pub] struct AppSecrets { diff --git a/lib/kernel/src/models/mod.rs b/src/models/mod.rs similarity index 70% rename from lib/kernel/src/models/mod.rs rename to src/models/mod.rs index 37a7310..da715f7 100644 --- a/lib/kernel/src/models/mod.rs +++ b/src/models/mod.rs @@ -1,3 +1,4 @@ pub mod config; pub mod user; pub mod authorization; +pub mod token_claims; diff --git a/lib/http_server/src/token_claims.rs b/src/models/token_claims.rs similarity index 95% rename from lib/http_server/src/token_claims.rs rename to src/models/token_claims.rs index 932b4ce..66e20d2 100644 --- a/lib/http_server/src/token_claims.rs +++ b/src/models/token_claims.rs @@ -1,9 +1,10 @@ use fully_pub::fully_pub; use jsonwebtoken::get_current_timestamp; -use kernel::models::authorization::AuthorizationScope; use serde::{Deserialize, Serialize}; use time::Duration; +use super::authorization::AuthorizationScope; + #[derive(Debug, Serialize, Deserialize, Clone)] #[fully_pub] struct UserTokenClaims { diff --git a/lib/kernel/src/models/user.rs b/src/models/user.rs similarity index 100% rename from lib/kernel/src/models/user.rs rename to src/models/user.rs diff --git a/lib/http_server/src/renderer.rs b/src/renderer.rs similarity index 75% rename from lib/http_server/src/renderer.rs rename to src/renderer.rs index d7b0c50..9b163a0 100644 --- a/lib/http_server/src/renderer.rs +++ b/src/renderer.rs @@ -1,11 +1,9 @@ use axum::{http::StatusCode, response::{Html, IntoResponse}}; use fully_pub::fully_pub; -use kernel::models::config::Config; use log::error; use minijinja::{context, Environment, Value}; -use utils::encode_base64_picture; -use crate::token_claims::UserTokenClaims; +use crate::models::token_claims::UserTokenClaims; #[derive(Debug, Clone)] @@ -45,14 +43,3 @@ impl TemplateRenderer { } } -pub fn build_templating_env(config: &Config) -> Environment<'static> { - let mut env = Environment::new(); - - minijinja_embed::load_templates!(&mut env); - - env.add_global("gl", context! { - instance => config.instance - }); - env.add_function("inline_picture", encode_base64_picture); - env -} diff --git a/lib/http_server/src/router.rs b/src/router.rs similarity index 95% rename from lib/http_server/src/router.rs rename to src/router.rs index d3e95b6..3836d54 100644 --- a/lib/http_server/src/router.rs +++ b/src/router.rs @@ -9,7 +9,7 @@ use crate::{ app_auth, renderer::renderer_middleware }, - AppState, ServerConfig + server::{AppState, ServerConfig} }; pub fn build_router(server_config: &ServerConfig, app_state: AppState) -> Router { @@ -43,8 +43,7 @@ pub fn build_router(server_config: &ServerConfig, app_state: AppState) -> Router let api_user_routes = Router::new() .route("/api/user", get(api::read_user::read_user_basic)) - .layer(middleware::from_fn_with_state(app_state.clone(), app_auth::enforce_jwt_auth_middleware)) - .route("/api", get(api::index::get_index)); + .layer(middleware::from_fn_with_state(app_state.clone(), app_auth::enforce_jwt_auth_middleware)); let well_known_routes = Router::new() .route("/.well-known/openid-configuration", get(api::openid::well_known::get_well_known_openid_configuration)); diff --git a/lib/http_server/src/lib.rs b/src/server.rs similarity index 65% rename from lib/http_server/src/lib.rs rename to src/server.rs index cc32177..6833988 100644 --- a/lib/http_server/src/lib.rs +++ b/src/server.rs @@ -1,22 +1,24 @@ -pub mod controllers; -pub mod router; -pub mod services; -pub mod middlewares; -pub mod renderer; -pub mod token_claims; - +use base64::{prelude::BASE64_STANDARD, Engine}; use fully_pub::fully_pub; use anyhow::{Result, Context}; -use kernel::{context::AppSecrets, models::config::Config, repositories::storage::Storage}; use log::info; -use minijinja::Environment; +use minijinja::{context, Environment}; +use sqlx::{Pool, Sqlite}; +use crate::{models::config::{AppSecrets, Config}, router::build_router}; -use crate::{ - router::build_router, - renderer::build_templating_env -}; +fn build_templating_env(config: &Config) -> Environment<'static> { + let mut env = Environment::new(); -pub const WEB_GUI_JWT_COOKIE_NAME: &str = "minauthator_jwt"; + minijinja_embed::load_templates!(&mut env); + + env.add_global("gl", context! { + instance => config.instance + }); + env.add_function("encode_b64str", |bin_val: Vec| { + BASE64_STANDARD.encode(bin_val) + }); + env +} #[derive(Debug)] #[fully_pub] @@ -32,7 +34,7 @@ pub struct ServerConfig { pub struct AppState { secrets: AppSecrets, config: Config, - db: Storage, + db: Pool, templating_env: Environment<'static> } @@ -40,7 +42,7 @@ pub async fn start_http_server( server_config: ServerConfig, config: Config, secrets: AppSecrets, - db_pool: Storage + db_pool: Pool ) -> Result<()> { // build state let state = AppState { diff --git a/lib/http_server/src/services/app_session.rs b/src/services/app_session.rs similarity index 100% rename from lib/http_server/src/services/app_session.rs rename to src/services/app_session.rs diff --git a/lib/http_server/src/services/mod.rs b/src/services/mod.rs similarity index 75% rename from lib/http_server/src/services/mod.rs rename to src/services/mod.rs index ed4dda0..7193e1b 100644 --- a/lib/http_server/src/services/mod.rs +++ b/src/services/mod.rs @@ -1,3 +1,4 @@ +pub mod password; pub mod session; pub mod oauth2; pub mod app_session; diff --git a/lib/http_server/src/services/oauth2.rs b/src/services/oauth2.rs similarity index 87% rename from lib/http_server/src/services/oauth2.rs rename to src/services/oauth2.rs index ed60954..55b640e 100644 --- a/lib/http_server/src/services/oauth2.rs +++ b/src/services/oauth2.rs @@ -1,7 +1,7 @@ use std::str::FromStr; use anyhow::{Result, Context}; -use kernel::models::{authorization::AuthorizationScope, config::Application}; +use crate::models::{authorization::AuthorizationScope, config::Application}; pub fn verify_redirect_uri(app: &Application, input_redirect_uri: &str) -> bool { app.allowed_redirect_uris diff --git a/src/services/password.rs b/src/services/password.rs new file mode 100644 index 0000000..c9e246b --- /dev/null +++ b/src/services/password.rs @@ -0,0 +1,35 @@ +use anyhow::{anyhow, Result}; +use argon2::{ + password_hash::{ + rand_core::OsRng, + PasswordHash, PasswordHasher, PasswordVerifier, SaltString + }, + Argon2 +}; + +pub fn get_password_hash(password: String) -> Result<(String, String)> { + let salt = SaltString::generate(&mut OsRng); + + // Argon2 with default params (Argon2id v19) + let argon2 = Argon2::default(); + + // Hash password to PHC string ($argon2id$v=19$...) + match argon2.hash_password(password.as_bytes(), &salt) { + Ok(val) => Ok((salt.to_string(), val.to_string())), + Err(_) => Err(anyhow!("Failed to process password.")) + } +} + +pub fn verify_password_hash(password_hash: String, password: String) -> Result<()> { + let parsed_hash = match PasswordHash::new(&password_hash) { + Ok(val) => val, + Err(_) => { + return Err(anyhow!("Failed to parse password hash")); + } + }; + match Argon2::default().verify_password(password.as_bytes(), &parsed_hash) { + Ok(()) => Ok(()), + Err(_) => Err(anyhow!("Failed to verify password.")) + } +} + diff --git a/lib/http_server/src/services/session.rs b/src/services/session.rs similarity index 94% rename from lib/http_server/src/services/session.rs rename to src/services/session.rs index 018e094..cf55087 100644 --- a/lib/http_server/src/services/session.rs +++ b/src/services/session.rs @@ -1,7 +1,8 @@ use anyhow::Result; use serde::{de::DeserializeOwned, Serialize}; use jsonwebtoken::{encode, decode, Header, Algorithm, Validation, EncodingKey, DecodingKey}; -use kernel::context::AppSecrets; + +use crate::models::config::AppSecrets; pub fn create_token(secrets: &AppSecrets, claims: T) -> String { diff --git a/lib/http_server/src/templates/components/footer.html b/src/templates/components/footer.html similarity index 100% rename from lib/http_server/src/templates/components/footer.html rename to src/templates/components/footer.html diff --git a/lib/http_server/src/templates/components/header.html b/src/templates/components/header.html similarity index 100% rename from lib/http_server/src/templates/components/header.html rename to src/templates/components/header.html diff --git a/lib/http_server/src/templates/layouts/base.html b/src/templates/layouts/base.html similarity index 100% rename from lib/http_server/src/templates/layouts/base.html rename to src/templates/layouts/base.html diff --git a/lib/http_server/src/templates/pages/apps.html b/src/templates/pages/apps.html similarity index 100% rename from lib/http_server/src/templates/pages/apps.html rename to src/templates/pages/apps.html diff --git a/lib/http_server/src/templates/pages/authorize.html b/src/templates/pages/authorize.html similarity index 100% rename from lib/http_server/src/templates/pages/authorize.html rename to src/templates/pages/authorize.html diff --git a/lib/http_server/src/templates/pages/home.html b/src/templates/pages/home.html similarity index 100% rename from lib/http_server/src/templates/pages/home.html rename to src/templates/pages/home.html diff --git a/lib/http_server/src/templates/pages/login.html b/src/templates/pages/login.html similarity index 100% rename from lib/http_server/src/templates/pages/login.html rename to src/templates/pages/login.html diff --git a/lib/http_server/src/templates/pages/me/details-form.html b/src/templates/pages/me/details-form.html similarity index 100% rename from lib/http_server/src/templates/pages/me/details-form.html rename to src/templates/pages/me/details-form.html diff --git a/lib/http_server/src/templates/pages/me/index.html b/src/templates/pages/me/index.html similarity index 100% rename from lib/http_server/src/templates/pages/me/index.html rename to src/templates/pages/me/index.html diff --git a/lib/http_server/src/templates/pages/register.html b/src/templates/pages/register.html similarity index 100% rename from lib/http_server/src/templates/pages/register.html rename to src/templates/pages/register.html diff --git a/lib/http_server/src/templates/pages/user_panel/authorizations.html b/src/templates/pages/user_panel/authorizations.html similarity index 100% rename from lib/http_server/src/templates/pages/user_panel/authorizations.html rename to src/templates/pages/user_panel/authorizations.html diff --git a/lib/utils/src/lib.rs b/src/utils.rs similarity index 92% rename from lib/utils/src/lib.rs rename to src/utils.rs index bb524dc..4afce48 100644 --- a/lib/utils/src/lib.rs +++ b/src/utils.rs @@ -61,7 +61,3 @@ pub fn parse_basic_auth(header_value: &str) -> Result<(String, String)> { )) } -pub fn encode_base64_picture(picture_bytes: Vec) -> String { - let encoded = BASE64_STANDARD.encode(picture_bytes); - return format!("data:image/*;base64,{}", encoded); -} diff --git a/tests/hurl_integration/run_scenario.sh b/tests/hurl_integration/run_scenario.sh deleted file mode 100755 index c723ee3..0000000 --- a/tests/hurl_integration/run_scenario.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/sh - -set -eou pipefail - -scenario_name="$1" -project_root="$(dirname $(cargo locate-project | jq -r .root))" -scenario_dir="$project_root/tests/hurl_integration/$1" -scenario_tmp_dir_path="$project_root/tmp/tests/$scenario_name" -database_path="$project_root/tmp/tests/$scenario_name/minauthator.db" - -echo "Starting scenario $scenario_name." -mkdir -p $scenario_tmp_dir_path -if [ -f $database_path ]; then - rm $database_path -fi -sqlite3 $database_path < $project_root/migrations/all.sql - -export DB_PATH=$database_path -if [ -f $scenario_dir/init_db.sh ]; then - $scenario_dir/init_db.sh -fi - -pkill -f $project_root/target/debug/minauthator-server & -sleep 0.1 -$project_root/target/debug/minauthator-server \ - --config "$scenario_dir/config.toml" \ - --database $database_path \ - --listen-host "127.0.0.1" \ - --listen-port "8086" \ - --static-assets "$project_root/assets" & - -server_pid=$! -sleep 0.2 -hurl \ - --variable base_url="http://localhost:8086" \ - --test --error-format long \ - $scenario_dir/main.hurl -kill $server_pid -echo "End of scenario." diff --git a/tests/hurl_integration/scenario_1/config.toml b/tests/hurl_integration/scenario_1/config.toml deleted file mode 100644 index ad3f58e..0000000 --- a/tests/hurl_integration/scenario_1/config.toml +++ /dev/null @@ -1,56 +0,0 @@ -[instance] -base_uri = "http://localhost:8086" -name = "Example org" -logo_uri = "https://example.org/logo.png" - -[[applications]] -slug = "demo_app" -name = "Demo app" -description = "A super application where you can do everything you want." -client_id = "00000001-0000-0000-0000-000000000001" -client_secret = "dummy_client_secret" -login_uri = "https://localhost:9876" -allowed_redirect_uris = [ - "http://localhost:9090/callback", - "http://localhost:9876/callback" -] -visibility = "Internal" -authorize_flow = "Implicit" - -[[applications]] -slug = "wiki" -name = "Wiki app" -description = "The knowledge base of the exemple org." -client_id = "f9de1885-448d-44bb-8c48-7e985486a8c6" -client_secret = "49c6c16a-0a8a-4981-a60d-5cb96582cc1a" -login_uri = "https://wiki.example.org/login" -allowed_redirect_uris = [ - "https://wiki.example.org/oauth2/callback" -] -visibility = "Public" -authorize_flow = "Implicit" - -[[applications]] -slug = "private_app" -name = "Demo app" -description = "Private app you should never discover" -client_id = "c8a08783-2342-4ce3-a3cb-9dc89b6bdf" -client_secret = "this_is_the_secret" -login_uri = "https://private-app.org" -allowed_redirect_uris = [ - "http://localhost:9091/authorize", -] -visibility = "Private" -authorize_flow = "Implicit" - -[[roles]] -slug = "basic" -name = "Basic" -description = "Basic user" -default = true - -[[roles]] -slug = "admin" -name = "Administrator" -description = "Full power on organization instance" - diff --git a/tests/hurl_integration/scenario_1/init_db.sh b/tests/hurl_integration/scenario_1/init_db.sh deleted file mode 100755 index 11dc8ce..0000000 --- a/tests/hurl_integration/scenario_1/init_db.sh +++ /dev/null @@ -1,9 +0,0 @@ -password_hash="$(echo -n "root" | argon2 salt_06cGGWYDJCZ -e)" -echo $password_hash -SQL=$(cat <