From abc13fad781d5141025b439e0e28a7f51146ad25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20H=C3=A4cker?= Date: Mon, 27 May 2024 23:18:15 +0200 Subject: [PATCH 1/3] flatpak: Add filemonitor for keyring files --- src/data/flatpak.rs | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/data/flatpak.rs b/src/data/flatpak.rs index bbf828c..5d12407 100644 --- a/src/data/flatpak.rs +++ b/src/data/flatpak.rs @@ -4,11 +4,12 @@ use std::rc::Rc; use gio::prelude::*; use gio::subclass::prelude::*; -use glib::Properties; +use glib::{clone, Properties}; use gtk::{gio, glib}; use super::KrItem; use crate::utils; +use crate::utils::error::DisplayError; mod imp { use super::*; @@ -32,6 +33,7 @@ mod imp { pub item_count: Cell, pub keyring: RefCell>>, + monitor: OnceCell, pub app_info: OnceCell, pub vec: RefCell>, @@ -53,6 +55,27 @@ mod imp { self.app_info .set(crate::utils::AppInfo::new(&self.obj().app_id())) .unwrap(); + + let keyring_file = gio::File::for_path(self.keyring_path()); + let monitor = keyring_file.monitor(gio::FileMonitorFlags::NONE, gio::Cancellable::NONE); + + match monitor { + Ok(monitor) => { + monitor.set_rate_limit(1000); + monitor.connect_changed(clone!(@weak self as this => move |_, _, _, e| { + if e == gio::FileMonitorEvent::Changed || e == gio::FileMonitorEvent::ChangesDoneHint { + glib::MainContext::default().spawn_local(clone!(@weak this => async move { + this.obj().load_keyring().await; + if this.n_items() != 0 { + this.obj().load_items().await.handle_error("Unable to reload items"); + } + })); + } + })); + self.monitor.set(monitor).unwrap(); + }, + Err(_) => monitor.handle_error("Unable to setup file monitor"), + } } } @@ -117,6 +140,14 @@ mod imp { pub fn keyring(&self) -> Option> { self.keyring.borrow().clone() } + + pub fn keyring_path(&self) -> std::path::PathBuf { + let mut path = glib::home_dir(); + path.push(".var/app"); + path.push(self.obj().app_id()); + path.push("data/keyrings/default.keyring"); + path + } } } @@ -130,8 +161,6 @@ impl KrFlatpak { let imp = self.imp(); if let Some(keyring) = imp.keyring() { - imp.clear(); - let items: Vec<_> = keyring.items().await; let mut vec = Vec::new(); @@ -143,6 +172,7 @@ impl KrFlatpak { vec.push(item); } + imp.clear(); let len = vec.len().try_into().unwrap(); { *imp.vec.borrow_mut() = vec; @@ -162,11 +192,7 @@ impl KrFlatpak { let imp = self.imp(); let secret = oo7::portal::Secret::from((*(self.item().secret())).clone()); - let mut path = glib::home_dir(); - - path.push(".var/app"); - path.push(self.app_id()); - path.push("data/keyrings/default.keyring"); + let path = self.imp().keyring_path(); match oo7::portal::Keyring::load(&path, secret).await { Ok(keyring) => { -- GitLab From a026a6d3be963d524d218331ea8d747f8c7e8ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20H=C3=A4cker?= Date: Fri, 14 Jun 2024 09:54:12 +0200 Subject: [PATCH 2/3] flatpak: Add error handling for load_keyring() --- src/data/flatpak.rs | 35 ++++++++++++++---------------- src/widgets/pages/overview_page.rs | 4 +++- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/data/flatpak.rs b/src/data/flatpak.rs index 5d12407..1232dc2 100644 --- a/src/data/flatpak.rs +++ b/src/data/flatpak.rs @@ -62,18 +62,20 @@ mod imp { match monitor { Ok(monitor) => { monitor.set_rate_limit(1000); - monitor.connect_changed(clone!(@weak self as this => move |_, _, _, e| { + monitor.connect_changed(clone!(@weak self as imp => move |_, _, _, e| { if e == gio::FileMonitorEvent::Changed || e == gio::FileMonitorEvent::ChangesDoneHint { - glib::MainContext::default().spawn_local(clone!(@weak this => async move { - this.obj().load_keyring().await; - if this.n_items() != 0 { - this.obj().load_items().await.handle_error("Unable to reload items"); + glib::MainContext::default().spawn_local(clone!(@weak imp => async move { + imp.obj().load_keyring().await.handle_error("Unable to reload keyring"); + + // Only reload keyring items if they were previously loaded + if imp.n_items() != 0 { + imp.obj().load_items().await.handle_error("Unable to reload items"); } })); } })); self.monitor.set(monitor).unwrap(); - }, + } Err(_) => monitor.handle_error("Unable to setup file monitor"), } } @@ -188,26 +190,21 @@ impl KrFlatpak { Ok(()) } - pub async fn load_keyring(&self) { + pub async fn load_keyring(&self) -> Result<(), oo7::Error> { let imp = self.imp(); let secret = oo7::portal::Secret::from((*(self.item().secret())).clone()); let path = self.imp().keyring_path(); - match oo7::portal::Keyring::load(&path, secret).await { - Ok(keyring) => { - let keyring = Rc::new(keyring); + let keyring = Rc::new(oo7::portal::Keyring::load(&path, secret).await?); - let item_count = keyring.n_items().await.try_into().unwrap(); - imp.item_count.set(item_count); - self.notify_item_count(); + let item_count = keyring.n_items().await.try_into().unwrap(); + imp.item_count.set(item_count); + self.notify_item_count(); - *imp.keyring.borrow_mut() = Some(keyring.clone()); - } - Err(err) => { - eprintln!("Failed to load keyring file: {path:?}: {err}"); - } - } + *imp.keyring.borrow_mut() = Some(keyring.clone()); + + Ok(()) } pub async fn delete_item(&self, item: &KrItem) -> Result<(), oo7::Error> { diff --git a/src/widgets/pages/overview_page.rs b/src/widgets/pages/overview_page.rs index 4a33f55..3922323 100644 --- a/src/widgets/pages/overview_page.rs +++ b/src/widgets/pages/overview_page.rs @@ -12,6 +12,8 @@ use crate::{ }; mod imp { + use crate::utils::error::DisplayError; + use super::*; #[derive(Debug, Default, CompositeTemplate)] @@ -127,7 +129,7 @@ mod imp { self.flatpak_model.get().unwrap().insert(index, &flatpak); glib::MainContext::default().spawn_local(clone!(@weak flatpak => async move { - flatpak.load_keyring().await; + flatpak.load_keyring().await.handle_error("Unable to load keyring"); })); flatpak.connect_item_count_notify(clone!(@weak self as this => move |_| { -- GitLab From a37e49d5409fe99cfab1d46203b4776a49e22dd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20H=C3=A4cker?= Date: Fri, 14 Jun 2024 10:05:44 +0200 Subject: [PATCH 3/3] flatpak: Don't check for `changed` file monitor event --- src/data/flatpak.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/flatpak.rs b/src/data/flatpak.rs index 1232dc2..de8a590 100644 --- a/src/data/flatpak.rs +++ b/src/data/flatpak.rs @@ -63,11 +63,11 @@ mod imp { Ok(monitor) => { monitor.set_rate_limit(1000); monitor.connect_changed(clone!(@weak self as imp => move |_, _, _, e| { - if e == gio::FileMonitorEvent::Changed || e == gio::FileMonitorEvent::ChangesDoneHint { + if e == gio::FileMonitorEvent::ChangesDoneHint { glib::MainContext::default().spawn_local(clone!(@weak imp => async move { imp.obj().load_keyring().await.handle_error("Unable to reload keyring"); - // Only reload keyring items if they were previously loaded + // Only reload keyring items if they were previously loaded if imp.n_items() != 0 { imp.obj().load_items().await.handle_error("Unable to reload items"); } -- GitLab