diff --git a/xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/mod.rs b/xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/mod.rs index fe3f49cb..1ae7ffe6 100644 --- a/xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/mod.rs +++ b/xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/mod.rs @@ -18,7 +18,7 @@ use libwebauthn::{ use crate::{ credential_service::{hybrid::HybridEvent, usb::UsbEvent}, dbus::{CredentialRequest, CredentialResponse}, - view_model::{Device, Transport}, + gui::view_model::{Device, Transport}, }; use hybrid::{HybridHandler, HybridState, HybridStateInternal}; diff --git a/xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/server.rs b/xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/server.rs index 4f87f92d..ceab9ea1 100644 --- a/xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/server.rs +++ b/xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/server.rs @@ -7,7 +7,7 @@ use futures_lite::Stream; use tokio::sync::{mpsc, oneshot}; use crate::dbus::{CredentialRequest, CredentialResponse}; -use crate::view_model::Device; +use crate::gui::view_model::Device; use super::hybrid::{HybridHandler, HybridState}; use super::usb::{UsbHandler, UsbState}; diff --git a/xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/usb.rs b/xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/usb.rs index 5de60a82..8291bbe1 100644 --- a/xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/usb.rs +++ b/xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/usb.rs @@ -15,7 +15,7 @@ use tracing::{debug, warn}; use crate::{ dbus::{CredentialRequest, GetAssertionResponseInternal}, - view_model::Credential, + gui::view_model::Credential, }; use super::{AuthenticatorResponse, CredentialResponse, Error}; diff --git a/xyz-iinuwa-credential-manager-portal-gtk/src/dbus.rs b/xyz-iinuwa-credential-manager-portal-gtk/src/dbus.rs index 5cd437e4..f6ae8a85 100644 --- a/xyz-iinuwa-credential-manager-portal-gtk/src/dbus.rs +++ b/xyz-iinuwa-credential-manager-portal-gtk/src/dbus.rs @@ -25,8 +25,10 @@ use zbus::{ }; use crate::credential_service::CredentialManagementClient; -use crate::gui::ViewRequest; -use crate::view_model::{CredentialType, Operation}; +use crate::gui::{ + view_model::{CredentialType, Operation}, + ViewRequest, +}; use crate::webauthn::{ self, GetPublicKeyCredentialUnsignedExtensionsResponse, PublicKeyCredentialParameters, }; diff --git a/xyz-iinuwa-credential-manager-portal-gtk/src/gui.rs b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/mod.rs similarity index 55% rename from xyz-iinuwa-credential-manager-portal-gtk/src/gui.rs rename to xyz-iinuwa-credential-manager-portal-gtk/src/gui/mod.rs index d53ca861..69919b50 100644 --- a/xyz-iinuwa-credential-manager-portal-gtk/src/gui.rs +++ b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/mod.rs @@ -1,16 +1,13 @@ +pub mod view_model; + use std::thread; use async_std::channel::Receiver; -use gettextrs::{gettext, LocaleCategory}; -use gtk::{gio, glib}; use tokio::sync::oneshot; -use crate::application::ExampleApplication; -use crate::config::{GETTEXT_PACKAGE, LOCALEDIR, RESOURCES_FILE}; -use crate::{ - credential_service::CredentialServiceClient, - view_model::{self, Operation, ViewEvent, ViewUpdate}, -}; +use crate::credential_service::CredentialServiceClient; + +use view_model::{Operation, ViewEvent, ViewUpdate}; pub struct ViewRequest { pub operation: Operation, @@ -45,27 +42,8 @@ fn run_gui(client: C, reques println!("event loop ended?"); }); - start_gtk_app(tx_event, rx_update); + view_model::gtk::start_gtk_app(tx_event, rx_update); async_std::task::block_on(event_loop.cancel()); response_tx.send(()).unwrap(); } - -fn start_gtk_app( - tx_event: async_std::channel::Sender, - rx_update: async_std::channel::Receiver, -) { - // Prepare i18n - gettextrs::setlocale(LocaleCategory::LcAll, ""); - gettextrs::bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR).expect("Unable to bind the text domain"); - gettextrs::textdomain(GETTEXT_PACKAGE).expect("Unable to switch to the text domain"); - - if glib::application_name().is_none() { - glib::set_application_name(&gettext("Credential Manager")); - } - let res = gio::Resource::load(RESOURCES_FILE).expect("Could not load gresource file"); - gio::resources_register(&res); - - let app = ExampleApplication::new(tx_event, rx_update); - app.run(); -} diff --git a/xyz-iinuwa-credential-manager-portal-gtk/src/application.rs b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/application.rs similarity index 97% rename from xyz-iinuwa-credential-manager-portal-gtk/src/application.rs rename to xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/application.rs index 84dd3030..7a8fd4be 100644 --- a/xyz-iinuwa-credential-manager-portal-gtk/src/application.rs +++ b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/application.rs @@ -6,10 +6,9 @@ use gtk::prelude::*; use gtk::subclass::prelude::*; use gtk::{gdk, gio, glib}; +use super::{window::ExampleApplicationWindow, ViewModel}; use crate::config::{APP_ID, PKGDATADIR, PROFILE, VERSION}; -use crate::view_model::gtk::ViewModel; -use crate::view_model::{ViewEvent, ViewUpdate}; -use crate::window::ExampleApplicationWindow; +use crate::gui::view_model::{ViewEvent, ViewUpdate}; mod imp { use super::*; diff --git a/xyz-iinuwa-credential-manager-portal-gtk/src/view_model/gtk/credential.rs b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/credential.rs similarity index 82% rename from xyz-iinuwa-credential-manager-portal-gtk/src/view_model/gtk/credential.rs rename to xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/credential.rs index 6b3f489a..ca8e54ff 100644 --- a/xyz-iinuwa-credential-manager-portal-gtk/src/view_model/gtk/credential.rs +++ b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/credential.rs @@ -47,19 +47,19 @@ impl CredentialObject { } } -impl From for CredentialObject { - fn from(value: crate::view_model::Credential) -> Self { +impl From for CredentialObject { + fn from(value: crate::gui::view_model::Credential) -> Self { Self::new(&value.id, &value.name, &value.username) } } -impl From<&crate::view_model::Credential> for CredentialObject { - fn from(value: &crate::view_model::Credential) -> Self { +impl From<&crate::gui::view_model::Credential> for CredentialObject { + fn from(value: &crate::gui::view_model::Credential) -> Self { Self::new(&value.id, &value.name, &value.username) } } -impl From for crate::view_model::Credential { +impl From for crate::gui::view_model::Credential { fn from(value: CredentialObject) -> Self { Self { id: value.id(), diff --git a/xyz-iinuwa-credential-manager-portal-gtk/src/view_model/gtk/device.rs b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/device.rs similarity index 86% rename from xyz-iinuwa-credential-manager-portal-gtk/src/view_model/gtk/device.rs rename to xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/device.rs index d18bf145..ad859ef2 100644 --- a/xyz-iinuwa-credential-manager-portal-gtk/src/view_model/gtk/device.rs +++ b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/device.rs @@ -5,7 +5,7 @@ use gtk::glib; use gtk::prelude::*; use gtk::subclass::prelude::*; -use crate::view_model::Transport; +use crate::gui::view_model::Transport; mod imp { use super::*; @@ -62,21 +62,21 @@ fn transport_name(transport: &Transport) -> &'static str { // Transport::PasskeyProvider => ("symbolic-link-symbolic", "ACME Password Manager"), } } -impl From for DeviceObject { - fn from(value: crate::view_model::Device) -> Self { +impl From for DeviceObject { + fn from(value: crate::gui::view_model::Device) -> Self { let name = transport_name(&value.transport); Self::new(&value.id, &value.transport, name) } } -impl From<&crate::view_model::Device> for DeviceObject { - fn from(value: &crate::view_model::Device) -> Self { +impl From<&crate::gui::view_model::Device> for DeviceObject { + fn from(value: &crate::gui::view_model::Device) -> Self { let name = transport_name(&value.transport); Self::new(&value.id, &value.transport, name) } } -impl TryFrom for crate::view_model::Device { +impl TryFrom for crate::gui::view_model::Device { type Error = String; fn try_from(value: DeviceObject) -> Result { diff --git a/xyz-iinuwa-credential-manager-portal-gtk/src/view_model/gtk/mod.rs b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/mod.rs similarity index 93% rename from xyz-iinuwa-credential-manager-portal-gtk/src/view_model/gtk/mod.rs rename to xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/mod.rs index b5f23254..d74a0f1f 100644 --- a/xyz-iinuwa-credential-manager-portal-gtk/src/view_model/gtk/mod.rs +++ b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/mod.rs @@ -1,7 +1,10 @@ +mod application; pub mod credential; pub mod device; +mod window; use async_std::channel::{Receiver, Sender}; +use gettextrs::{gettext, LocaleCategory}; use glib::clone; use gtk::gdk::Texture; use gtk::gdk_pixbuf::Pixbuf; @@ -12,13 +15,16 @@ use gtk::subclass::prelude::*; use qrcode::QrCode; use tracing::debug; -use self::credential::CredentialObject; -use self::device::DeviceObject; +use crate::config::{GETTEXT_PACKAGE, LOCALEDIR, RESOURCES_FILE}; +use application::ExampleApplication; use super::Transport; use super::{Credential, Device}; use super::{ViewEvent, ViewUpdate}; +use self::credential::CredentialObject; +use self::device::DeviceObject; + mod imp { use std::cell::RefCell; @@ -51,7 +57,7 @@ mod imp { #[property(get, set)] pub failed: RefCell, - // pub(super) vm: RefCell>, + // pub(super) vm: RefCell>, pub(super) rx: RefCell>>, pub(super) tx: RefCell>>, // hybrid_qr_state: HybridState, @@ -337,3 +343,22 @@ impl ViewModel { tx.send(event).await.unwrap(); } } + +pub fn start_gtk_app( + tx_event: async_std::channel::Sender, + rx_update: async_std::channel::Receiver, +) { + // Prepare i18n + gettextrs::setlocale(LocaleCategory::LcAll, ""); + gettextrs::bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR).expect("Unable to bind the text domain"); + gettextrs::textdomain(GETTEXT_PACKAGE).expect("Unable to switch to the text domain"); + + if glib::application_name().is_none() { + glib::set_application_name(&gettext("Credential Manager")); + } + let res = gio::Resource::load(RESOURCES_FILE).expect("Could not load gresource file"); + gio::resources_register(&res); + + let app = ExampleApplication::new(tx_event, rx_update); + app.run(); +} diff --git a/xyz-iinuwa-credential-manager-portal-gtk/src/window.rs b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/window.rs similarity index 98% rename from xyz-iinuwa-credential-manager-portal-gtk/src/window.rs rename to xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/window.rs index 4da4aa50..2db244ba 100644 --- a/xyz-iinuwa-credential-manager-portal-gtk/src/window.rs +++ b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/gtk/window.rs @@ -9,10 +9,10 @@ use gtk::{ }; use gtk::{prelude::*, Picture}; -use crate::application::ExampleApplication; +use super::application::ExampleApplication; +use super::{device::DeviceObject, ViewModel}; use crate::config::{APP_ID, PROFILE}; -use crate::view_model::gtk::{device::DeviceObject, ViewModel}; -use crate::view_model::Transport; +use crate::gui::view_model::Transport; mod imp { use gtk::Picture; diff --git a/xyz-iinuwa-credential-manager-portal-gtk/src/view_model/mod.rs b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/mod.rs similarity index 93% rename from xyz-iinuwa-credential-manager-portal-gtk/src/view_model/mod.rs rename to xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/mod.rs index c33b91b2..ed35dd4e 100644 --- a/xyz-iinuwa-credential-manager-portal-gtk/src/view_model/mod.rs +++ b/xyz-iinuwa-credential-manager-portal-gtk/src/gui/view_model/mod.rs @@ -31,15 +31,13 @@ where devices: Vec, selected_device: Option, - providers: Vec, - + // providers: Vec, usb_pin_tx: Option>>>, usb_cred_tx: Option>>>, hybrid_qr_state: HybridState, hybrid_qr_code_data: Option>, - - hybrid_linked_state: HybridState, + // hybrid_linked_state: HybridState, } impl ViewModel { @@ -60,52 +58,12 @@ impl ViewModel { title: String::default(), devices: Vec::new(), selected_device: None, - providers: Vec::new(), usb_pin_tx: None, usb_cred_tx: None, hybrid_qr_state: HybridState::default(), hybrid_qr_code_data: None, - hybrid_linked_state: HybridState::default(), } } - fn start_authentication(&self) {} // open page - fn cancel_authentication(&self) {} - - fn start_fingerprint_authentication(&self) { - todo!("not implemented"); - } - fn cancel_fingerprint_authentication(&self) {} - - fn start_hybrid_qr_authentication(&self) {} - fn cancel_hybrid_qr_authentication(&self) { - todo!("not implemented"); - } - - fn start_hybrid_linked_authentication(&self) { - todo!("not implemented"); - } - fn cancel_hybrid_linked_authentication(&self) { - todo!("not implemented"); - } - - // Can this be used for internal uv method too? - fn start_usb_authentication(&self) { - todo!("not implemented"); - } - fn cancel_usb_authentication(&self) { - todo!("not implemented"); - } - fn send_usb_device_pin(&self) { - todo!("not implemented"); - } - - fn select_uv_method(&self) { - todo!("not implemented"); - } - - fn finish_authentication(&self) { - todo!("not implemented"); - } async fn update_title(&mut self) { self.title = match self.operation { @@ -396,7 +354,7 @@ pub enum FingerprintSensorState { #[derive(Debug)] pub enum CredentialType { Passkey, - Password, + // Password, } #[derive(Clone, Debug, PartialEq)] @@ -466,10 +424,6 @@ pub enum Transport { Usb, } -pub enum Error { - ConversionError, -} - impl TryInto for String { type Error = String; diff --git a/xyz-iinuwa-credential-manager-portal-gtk/src/main.rs b/xyz-iinuwa-credential-manager-portal-gtk/src/main.rs index 2a3c28f1..de43e1c0 100644 --- a/xyz-iinuwa-credential-manager-portal-gtk/src/main.rs +++ b/xyz-iinuwa-credential-manager-portal-gtk/src/main.rs @@ -1,4 +1,3 @@ -mod application; mod cbor; #[rustfmt::skip] mod config; @@ -7,10 +6,7 @@ mod credential_service; mod dbus; mod gui; mod serde; -#[allow(dead_code)] -mod view_model; mod webauthn; -mod window; use std::{error::Error, sync::Arc};