summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorquentin konieczko <konieczko@gmail.com>2023-01-17 11:55:08 +0100
committerquentin konieczko <konieczko@gmail.com>2023-01-17 11:55:08 +0100
commit78a2cbec6b10ad6d5f58e10662e7d4d6de60012f (patch)
treebbde3de5a6d880e8b655c8cb9ba29b5df02736f8 /src
parent90fb9f1aad1d6f546362c395134e6c46923f2102 (diff)
navigable devices
Diffstat (limited to 'src')
-rw-r--r--src/cryptsetup.rs50
-rw-r--r--src/event_exec.rs15
-rw-r--r--src/status.rs18
-rw-r--r--src/term_manager.rs8
4 files changed, 54 insertions, 37 deletions
diff --git a/src/cryptsetup.rs b/src/cryptsetup.rs
index 8146c5b..5498910 100644
--- a/src/cryptsetup.rs
+++ b/src/cryptsetup.rs
@@ -2,18 +2,19 @@ use std::io::Write;
use std::process::{Command, Stdio};
use crate::fm_error::{FmError, FmResult};
+use crate::impl_selectable_content;
#[derive(Debug, Clone, Copy)]
pub enum PasswordKind {
- SUDO(usize),
- CRYPTSETUP(usize),
+ SUDO,
+ CRYPTSETUP,
}
impl std::fmt::Display for PasswordKind {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let asker = match self {
- Self::SUDO(_) => "sudo",
- Self::CRYPTSETUP(_) => "cryptsetup",
+ Self::SUDO => "sudo",
+ Self::CRYPTSETUP => "cryptsetup",
};
write!(f, "{}", asker)
}
@@ -61,6 +62,14 @@ impl PasswordHolder {
.clone()
.ok_or_else(|| FmError::custom("PasswordHolder", "sudo password isn't set"))?)
}
+
+ pub fn can_mount(&self) -> bool {
+ self.sudo.is_some() && self.cryptsetup.is_some()
+ }
+
+ pub fn can_umount(&self) -> bool {
+ self.sudo.is_some()
+ }
}
/// get devices list from lsblk
@@ -290,12 +299,12 @@ impl CryptoDevice {
}
#[derive(Debug, Clone, Default)]
-pub struct DeviceOpener {
+pub struct Device {
pub cryptdevice: CryptoDevice,
pub password_holder: PasswordHolder,
}
-impl DeviceOpener {
+impl Device {
pub fn from_line(line: &str) -> FmResult<Self> {
Ok(Self {
cryptdevice: CryptoDevice::from_line(line)?,
@@ -303,3 +312,32 @@ impl DeviceOpener {
})
}
}
+
+#[derive(Debug, Clone, Default)]
+pub struct DeviceOpener {
+ pub content: Vec<Device>,
+ index: usize,
+}
+
+impl DeviceOpener {
+ pub fn update(&mut self) -> FmResult<()> {
+ self.content = filter_crypto_devices_lines(get_devices()?, "crypto")
+ .iter()
+ .map(|line| Device::from_line(line))
+ .filter_map(|r| r.ok())
+ .collect();
+ self.index = 0;
+ Ok(())
+ }
+
+ pub fn set_password(&mut self, password_kind: PasswordKind, password: String) {
+ match password_kind {
+ PasswordKind::SUDO => self.content[self.index].password_holder.set_sudo(password),
+ PasswordKind::CRYPTSETUP => self.content[self.index]
+ .password_holder
+ .set_cryptsetup(password),
+ }
+ }
+}
+
+impl_selectable_content!(Device, DeviceOpener);
diff --git a/src/event_exec.rs b/src/event_exec.rs
index a5f4216..e33b801 100644
--- a/src/event_exec.rs
+++ b/src/event_exec.rs
@@ -1561,18 +1561,9 @@ impl EventExec {
pub fn exec_password_store(status: &mut Status, password_kind: PasswordKind) -> FmResult<()> {
let password = status.selected_non_mut().input.string();
- if let Some(devices) = &mut status.encrypted_devices {
- match password_kind {
- PasswordKind::SUDO(index) => {
- let device_opener = &mut devices[index];
- device_opener.password_holder.set_sudo(password)
- }
- PasswordKind::CRYPTSETUP(index) => {
- let device_opener = &mut devices[index];
- device_opener.password_holder.set_cryptsetup(password)
- }
- }
- }
+ status
+ .encrypted_devices
+ .set_password(password_kind, password);
status.selected().reset_mode();
status.clear_flags_and_reset_view()?;
Ok(())
diff --git a/src/status.rs b/src/status.rs
index 1eb6823..c130471 100644
--- a/src/status.rs
+++ b/src/status.rs
@@ -14,7 +14,7 @@ use crate::args::Args;
use crate::config::{Colors, Config};
use crate::constant_strings_paths::OPENER_PATH;
use crate::copy_move::{copy_move, CopyMove};
-use crate::cryptsetup::{filter_crypto_devices_lines, get_devices, DeviceOpener};
+use crate::cryptsetup::DeviceOpener;
use crate::flagged::Flagged;
use crate::fm_error::{FmError, FmResult};
use crate::marks::Marks;
@@ -60,7 +60,7 @@ pub struct Status {
/// The trash
pub trash: Trash,
pub config_colors: Colors,
- pub encrypted_devices: Option<Vec<DeviceOpener>>,
+ pub encrypted_devices: DeviceOpener,
}
impl Status {
@@ -86,7 +86,7 @@ impl Status {
tab.shortcut
.extend_with_mount_points(&Self::disks_mounts(sys.disks()));
let trash = Trash::new()?;
- let encrypted_devices = None;
+ let encrypted_devices = DeviceOpener::default();
Ok(Self {
tabs: [tab.clone(), tab],
@@ -321,17 +321,7 @@ impl Status {
}
pub fn read_encrypted_devices(&mut self) -> FmResult<()> {
- self.encrypted_devices = Some(
- filter_crypto_devices_lines(get_devices()?, "crypto")
- .iter()
- .map(|line| DeviceOpener::from_line(line))
- .filter_map(|r| r.ok())
- .collect(),
- );
+ self.encrypted_devices.update()?;
Ok(())
}
-
- pub fn drop_encrypted_devices(&mut self) {
- self.encrypted_devices = None;
- }
}
diff --git a/src/term_manager.rs b/src/term_manager.rs
index df986fa..2ebf481 100644
--- a/src/term_manager.rs
+++ b/src/term_manager.rs
@@ -520,11 +520,9 @@ impl<'a> WinSecondary<'a> {
canvas: &mut dyn Canvas,
) -> FmResult<()> {
canvas.print_with_attr(2, 1, "encrypted devices", Self::ATTR_YELLOW)?;
- if let Some(encrypted_devices) = &status.encrypted_devices {
- for (i, device) in encrypted_devices.iter().enumerate() {
- let row = calc_line_row(i, tab) + 2;
- canvas.print(row, 3, &device.cryptdevice.as_string()?)?;
- }
+ for (i, device) in status.encrypted_devices.content.iter().enumerate() {
+ let row = calc_line_row(i, tab) + 2;
+ canvas.print(row, 3, &device.cryptdevice.as_string()?)?;
}
Ok(())
}