diff --git a/Cargo.lock b/Cargo.lock index cd43bc8..0bb85d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -512,9 +512,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.62" +version = "1.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" dependencies = [ "find-msvc-tools", "jobserver", @@ -1872,14 +1872,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" dependencies = [ "bitflags 2.11.1", "libc", "plain", - "redox_syscall 0.7.5", + "redox_syscall 0.8.0", ] [[package]] @@ -1957,9 +1957,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" [[package]] name = "memmap2" @@ -2755,7 +2755,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.11+spec-1.1.0", + "toml_edit 0.25.12+spec-1.1.0", ] [[package]] @@ -2997,9 +2997,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4666a1a60d8412eab19d94f6d13dcc9cea0a5ef4fdf6a5db306537413c661b1b" +checksum = "7c7591fa2c6b601dfcfe5f043f65a1c39fcdf50efefcd7f1572e538c1f4b398d" dependencies = [ "bitflags 2.11.1", ] @@ -3278,9 +3278,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" @@ -3676,9 +3676,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.11+spec-1.1.0" +version = "0.25.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" dependencies = [ "indexmap", "toml_datetime 1.1.1+spec-1.1.0", @@ -3819,9 +3819,9 @@ checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "uuid" -version = "1.23.1" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7" dependencies = [ "js-sys", "serde_core", @@ -4548,9 +4548,9 @@ checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" [[package]] name = "zbus" -version = "5.15.0" +version = "5.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bcbf15c8708d7fc1be0c993622e0a5cbd5e8b52bfa40afa4c3e0cd8d724ac1" +checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285" dependencies = [ "async-broadcast", "async-executor", @@ -4583,9 +4583,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.15.0" +version = "5.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51fa5406ad9175a8c825a931f8cf347116b531b3634fcb0b627c290f1f2516ff" +checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4615,18 +4615,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639" dependencies = [ "proc-macro2", "quote", @@ -4665,9 +4665,9 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.11.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c1567a6ec68df868cbbfde844cfc6d81649fe5109a62b116b19fabd53e618ee" +checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0" dependencies = [ "endi", "enumflags2", @@ -4679,9 +4679,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.11.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d5b780599bbde114e39d9a0799577fad1ced5105d38515745f7b3099d8ceda" +checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4692,9 +4692,9 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "3.3.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d464f5733ffa07a3164d656f18533caace9d0638596721355d73256a410d691" +checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6" dependencies = [ "proc-macro2", "quote", diff --git a/src/locales/en.json b/src/locales/en.json index 264f184..f1e0a4f 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -43,6 +43,8 @@ "security.user_full_name": "User full name/description", "security.user_password": "User password", "security.reuse_user_password": "Reuse user password for root user", - "security.root_password": "Root password" - + "security.root_password": "Root password", + "security.pass_low": "low security", + "security.pass_middle": "normal security", + "security.pass_hight": "hight security" } \ No newline at end of file diff --git a/src/stages/security/mod.rs b/src/stages/security/mod.rs index 6da0841..c7c03b9 100644 --- a/src/stages/security/mod.rs +++ b/src/stages/security/mod.rs @@ -18,13 +18,46 @@ This is Security stage, setup users logins and such */ -use crate::{ - kira_theming, - stage::{StageAction, StageResult}, -}; -use iced::{Alignment, widget}; +use crate::stage::{StageAction, StageResult}; +use iced::{Alignment, Color, widget}; use rust_i18n::t; +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +enum PasswordStrenght { + Low, + Middle, + Hight, +} + +impl PasswordStrenght { + pub fn from_password(password: &str) -> Self { + if password.len() < 8 { + Self::Low + } else if password.len() < 16 { + Self::Middle + } else { + Self::Hight + } + } + pub fn color(&self) -> Color { + match self { + Self::Low => Color::from_rgb8(212, 32, 32), + Self::Middle => Color::from_rgb8(212, 212, 32), + Self::Hight => Color::from_rgb8(32, 212, 32), + } + } +} + +impl std::fmt::Display for PasswordStrenght { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Low => f.write_str(t!("security.pass_low").as_ref()), + Self::Middle => f.write_str(t!("security.pass_middle").as_ref()), + Self::Hight => f.write_str(t!("security.pass_hight").as_ref()), + } + } +} + #[derive(Debug, Clone)] pub struct SecurityStage { user_name: String, @@ -34,6 +67,8 @@ pub struct SecurityStage { reuse_user_password_for_roor: bool, user_pass_is_secure: bool, root_pass_is_secure: bool, + user_password_strenght: PasswordStrenght, + root_password_strenght: PasswordStrenght, } #[derive(Debug, Clone)] @@ -46,7 +81,7 @@ pub enum Message { ToggleUserPassSecure, ToggleRootPassSecure, Next, - Exit, + Back, } /// Mothod safely retain first n chars in utf-8 string avoiding cutting utf-8 char in the middle @@ -67,6 +102,8 @@ impl SecurityStage { reuse_user_password_for_roor: false, user_pass_is_secure: true, root_pass_is_secure: true, + user_password_strenght: PasswordStrenght::Low, + root_password_strenght: PasswordStrenght::Low, } } @@ -81,8 +118,11 @@ impl SecurityStage { pub fn update(&mut self, message: Message) -> StageAction { match message { - Message::ToggleReusePass(v) => { - self.reuse_user_password_for_roor = v; + Message::ToggleReusePass(reuse_pass) => { + self.reuse_user_password_for_roor = reuse_pass; + if reuse_pass { + self.root_password = self.user_password.clone(); + } StageAction::None } Message::UserNameChange(u_name) => { @@ -97,65 +137,134 @@ impl SecurityStage { Message::UserFullNameChange(f_name) => { let mut res = f_name.clone(); res.retain(|c| c.is_alphanumeric() || ['_', '-', ' ', '.', ','].contains(&c)); - self.user_full_name = retain_first_n(res.trim(), 128).to_string(); + self.user_full_name = retain_first_n(&res, 128).to_string(); StageAction::None } Message::UserPasswordChange(u_pass) => { - let mut res = u_pass.trim().to_string(); + let mut res = u_pass; res.retain(|c: char| !c.is_control()); - self.user_password = res.trim().to_string(); + self.user_password = res; + self.user_password_strenght = PasswordStrenght::from_password(&self.user_password); if self.reuse_user_password_for_roor { + self.root_password_strenght = self.user_password_strenght; self.root_password = self.user_password.clone(); } StageAction::None } Message::RootPasswordChange(r_pass) => { - let mut res = r_pass.trim().to_string(); + let mut res: String = r_pass; res.retain(|c: char| !c.is_control()); - self.root_password = res.trim().to_string(); + self.root_password = res; + self.root_password_strenght = PasswordStrenght::from_password(&self.root_password); StageAction::None - }, + } Message::ToggleUserPassSecure => { self.user_pass_is_secure = !self.user_pass_is_secure; StageAction::None - }, + } Message::ToggleRootPassSecure => { self.root_pass_is_secure = !self.root_pass_is_secure; StageAction::None - }, - Message::Exit => StageAction::Abort, + } + Message::Back => StageAction::Back, Message::Next => StageAction::Next(self.gen_result()), } } pub fn view(&self) -> iced::Element<'_, Message> { - let next_button = widget::button(widget::text(t!("button.next"))).on_press(Message::Next); - let exit_button = widget::button(widget::text(t!("button.exit"))).on_press(Message::Exit); - - let user_pass_sec_text = if self.user_pass_is_secure {widget::text("👁")} else {widget::text("*")}; - let root_pass_sec_text = if self.root_pass_is_secure {widget::text("👁")} else {widget::text("*")}; - let mut root_pass_input = widget::text_input("", &self.root_password).secure(self.root_pass_is_secure); - if self.reuse_user_password_for_roor {root_pass_input = root_pass_input.on_input(Message::RootPasswordChange);} + let back_button = widget::button(widget::text(t!("button.back"))).on_press(Message::Back); + let next_button = if self.user_name.is_empty() + || self.user_password.is_empty() + || self.root_password.is_empty() + { + widget::button(widget::text(t!("button.next"))) + } else { + widget::button(widget::text(t!("button.next"))).on_press(Message::Next) + }; + + let user_pass_sec_text = if self.user_pass_is_secure { + widget::text("👁") + } else { + widget::text("*") + }; + let root_pass_sec_text = if self.root_pass_is_secure { + widget::text("👁") + } else { + widget::text("*") + }; + let user_pass_sec_text = user_pass_sec_text + .width(12) + .align_x(Alignment::Center) + .align_y(Alignment::Center); + let root_pass_sec_text = root_pass_sec_text + .width(12) + .align_x(Alignment::Center) + .align_y(Alignment::Center); + let mut root_pass_input = + widget::text_input("", &self.root_password).secure(self.root_pass_is_secure); + if !self.reuse_user_password_for_roor { + root_pass_input = root_pass_input.on_input(Message::RootPasswordChange); + } + + let user_p_strenght_text = widget::text(self.user_password_strenght.to_string()) + .color(self.user_password_strenght.color()); + let root_p_strenght_text = widget::text(self.root_password_strenght.to_string()) + .color(self.root_password_strenght.color()); + widget::column![ widget::container( widget::column![ - widget::text(t!("security.user_name")), - widget::text_input("", &self.user_name).on_input(Message::UserNameChange), - widget::text(t!("security.user_full_name")), - widget::text_input("", &self.user_full_name).on_input(Message::UserFullNameChange), - widget::text(t!("security.user_password")), - widget::row![ - widget::text_input("", &self.user_password).on_input(Message::UserPasswordChange) - .secure(self.user_pass_is_secure), - widget::button(user_pass_sec_text).on_press(Message::ToggleUserPassSecure), + widget::column![ + widget::text(t!("security.user_name")), + widget::text_input("", &self.user_name) + .width(256) + .on_input(Message::UserNameChange) + ], + widget::column![ + widget::text(t!("security.user_full_name")), + widget::text_input("", &self.user_full_name) + .width(256) + .on_input(Message::UserFullNameChange) + ], + widget::column![ + widget::text(t!("security.user_password")), + widget::row![ + widget::text_input("", &self.user_password) + .width(512) + .on_input(Message::UserPasswordChange) + .secure(self.user_pass_is_secure), + widget::button(user_pass_sec_text) + .on_press(Message::ToggleUserPassSecure), + widget::container(user_p_strenght_text) + .align_x(Alignment::Center) + .style(widget::container::bordered_box) + .style(widget::container::rounded_box) + .padding(6) + .width(160), + ] + .spacing(5) + .align_y(Alignment::Center) ], widget::rule::horizontal(2), - widget::text(t!("security.root_password")), - widget::row![ - root_pass_input, - widget::button(root_pass_sec_text).on_press(Message::ToggleRootPassSecure), + widget::column![ + widget::text(t!("security.root_password")), + widget::row![ + root_pass_input.width(512), + widget::button(root_pass_sec_text) + .on_press(Message::ToggleRootPassSecure), + widget::container(root_p_strenght_text) + .align_x(Alignment::Center) + .style(widget::container::rounded_box) + .style(widget::container::bordered_box) + .padding(6) + .width(160), + ] + .spacing(5) + .align_y(Alignment::Center), + widget::checkbox(self.reuse_user_password_for_roor) + .label(t!("security.reuse_user_password")) + .on_toggle(Message::ToggleReusePass), ], - ] .padding(10) .spacing(10) @@ -166,9 +275,9 @@ impl SecurityStage { .align_x(Alignment::Center) .align_y(Alignment::Center), widget::row![ - exit_button, + back_button, widget::space::horizontal(), // Pushes the right button to the far right - next_button + next_button, ] .width(iced::Length::Fill) .align_y(Alignment::End)