summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorquentin konieczko <konieczko@gmail.com>2023-01-17 07:13:28 +0100
committerquentin konieczko <konieczko@gmail.com>2023-01-17 07:13:28 +0100
commit8f97774d2fa6f8fbe3308e0d96d738f9181ecd2c (patch)
tree27046981fe8365aa30105444b38007a4a1d42acb /src
parent9c76216bd585ab9a5d59df9b5e570f4f3046d654 (diff)
password
Diffstat (limited to 'src')
-rw-r--r--src/cryptsetup.rs37
-rw-r--r--src/event_exec.rs13
-rw-r--r--src/mode.rs15
-rw-r--r--src/term_manager.rs10
4 files changed, 62 insertions, 13 deletions
diff --git a/src/cryptsetup.rs b/src/cryptsetup.rs
index 9b199d5..01a3d3f 100644
--- a/src/cryptsetup.rs
+++ b/src/cryptsetup.rs
@@ -3,6 +3,22 @@ use std::process::{Command, Stdio};
use crate::fm_error::{FmError, FmResult};
+#[derive(Debug, Clone, Copy)]
+pub enum PasswordKind {
+ 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",
+ };
+ write!(f, "{}", asker)
+ }
+}
+
#[derive(Default)]
pub struct PasswordHolder {
sudo: Option<String>,
@@ -27,7 +43,7 @@ impl PasswordHolder {
Ok(self
.cryptsetup
.clone()
- .ok_or_else(|| FmError::custom("PasswordHolder", "sudo password isn't set"))?)
+ .ok_or_else(|| FmError::custom("PasswordHolder", "cryptsetup password isn't set"))?)
}
/// Reads the sudo password
@@ -244,4 +260,23 @@ impl CryptoDevice {
block.update_from_line(&filter_crypto_devices_lines(get_devices()?, &self.uuid)[0])?;
Ok(block.mountpoints.is_some())
}
+
+ pub fn is_opened(&self) -> FmResult<bool> {
+ Ok(true)
+ }
+
+ pub fn as_string(&self) -> FmResult<String> {
+ let is_mounted = self.is_mounted()?;
+ let mounted_char = if is_mounted { 'm' } else { 'u' };
+ let opened_char = if self.is_opened()? { 'o' } else { 'c' };
+ let address = "/dev/sdb";
+ let mut s = format!("{} {} {}", mounted_char, opened_char, address);
+
+ if let Some(mountpoints) = &self.mountpoints {
+ s.push_str(" -> ");
+ s.push_str(&mountpoints);
+ }
+
+ Ok(s)
+ }
}
diff --git a/src/event_exec.rs b/src/event_exec.rs
index c4e834a..74d7065 100644
--- a/src/event_exec.rs
+++ b/src/event_exec.rs
@@ -1259,10 +1259,16 @@ impl EventExec {
must_refresh = false;
EventExec::exec_filter(status)?
}
+ Mode::InputSimple(InputSimple::Password(password_kind)) => {
+ EventExec::exec_password_store(status, password_kind)?
+ }
Mode::Navigate(Navigate::Jump) => EventExec::exec_jump(status)?,
Mode::Navigate(Navigate::History) => EventExec::exec_history(status.selected())?,
Mode::Navigate(Navigate::Shortcut) => EventExec::exec_shortcut(status.selected())?,
Mode::Navigate(Navigate::Trash) => EventExec::event_trash_restore_file(status)?,
+ Mode::Navigate(Navigate::EncryptedDrive(_)) => {
+ EventExec::event_toggle_encrypted_drive(status)?
+ }
Mode::InputCompleted(InputCompleted::Exec) => EventExec::exec_exec(status.selected())?,
Mode::InputCompleted(InputCompleted::Search) => {
must_refresh = false;
@@ -1276,7 +1282,6 @@ impl EventExec {
| Mode::InputCompleted(InputCompleted::Nothing)
| Mode::InputSimple(InputSimple::Sort)
| Mode::InputSimple(InputSimple::Marks(_)) => (),
- Mode::InputSimple(InputSimple::EncryptedDrive(_)) => (),
};
status.selected().input.reset();
@@ -1546,11 +1551,15 @@ impl EventExec {
pub fn event_encrypted_drive(status: &mut Status) -> FmResult<()> {
status
.selected()
- .set_mode(Mode::InputSimple(InputSimple::EncryptedDrive(
+ .set_mode(Mode::Navigate(Navigate::EncryptedDrive(
EncryptedDrive::PickDevices,
)));
Ok(())
}
+
+ pub fn event_toggle_encrypted_drive(_status: &mut Status) -> FmResult<()> {
+ Ok(())
+ }
}
fn string_to_path(path_string: &str) -> FmResult<path::PathBuf> {
diff --git a/src/mode.rs b/src/mode.rs
index d0fe54c..eddeada 100644
--- a/src/mode.rs
+++ b/src/mode.rs
@@ -1,6 +1,6 @@
use std::fmt;
-use crate::completion::InputCompleted;
+use crate::{completion::InputCompleted, cryptsetup::PasswordKind};
/// Different kind of mark actions.
/// Either we jump to an existing mark or we save current path to a mark.
@@ -83,7 +83,7 @@ pub enum InputSimple {
/// Filter by extension, name, directory or no filter
Filter,
///
- EncryptedDrive(EncryptedDrive),
+ Password(PasswordKind),
}
/// Different modes in which we display a bunch of possible destinations.
@@ -98,6 +98,8 @@ pub enum Navigate {
Shortcut,
///
Trash,
+ ///
+ EncryptedDrive(EncryptedDrive),
}
/// Different mode in which the application can be.
@@ -135,11 +137,11 @@ impl fmt::Display for Mode {
Mode::InputSimple(InputSimple::Sort) => {
write!(f, "Sort: Kind Name Modif Size Ext Rev :")
}
- Mode::InputSimple(InputSimple::EncryptedDrive(EncryptedDrive)) => {
- write!(f, "{:?}", EncryptedDrive)
- }
Mode::InputSimple(InputSimple::Marks(_)) => write!(f, "Marks jump:"),
Mode::InputSimple(InputSimple::Filter) => write!(f, "Filter: "),
+ Mode::InputSimple(InputSimple::Password(password_kind)) => {
+ write!(f, "Password for {}", password_kind)
+ }
Mode::InputCompleted(InputCompleted::Exec) => write!(f, "Exec: "),
Mode::InputCompleted(InputCompleted::Goto) => write!(f, "Goto : "),
Mode::InputCompleted(InputCompleted::Search) => write!(f, "Search: "),
@@ -148,6 +150,9 @@ impl fmt::Display for Mode {
Mode::Navigate(Navigate::History) => write!(f, "History :"),
Mode::Navigate(Navigate::Shortcut) => write!(f, "Shortcut :"),
Mode::Navigate(Navigate::Trash) => write!(f, "Trash :"),
+ Mode::Navigate(Navigate::EncryptedDrive(encrypted_drive)) => {
+ write!(f, "{:?}", encrypted_drive)
+ }
Mode::NeedConfirmation(_) => write!(f, "Y/N :"),
Mode::Preview => write!(f, "Preview : "),
}
diff --git a/src/term_manager.rs b/src/term_manager.rs
index ce0545e..c155cb2 100644
--- a/src/term_manager.rs
+++ b/src/term_manager.rs
@@ -366,14 +366,14 @@ impl<'a> Draw for WinSecondary<'a> {
Mode::Navigate(Navigate::History) => self.destination(canvas, &self.tab.history),
Mode::Navigate(Navigate::Shortcut) => self.destination(canvas, &self.tab.shortcut),
Mode::Navigate(Navigate::Trash) => self.trash(canvas, &self.status.trash),
+ Mode::Navigate(Navigate::EncryptedDrive(EncryptedDrive::PickDevices)) => {
+ self.encrypted_devices(self.status, self.tab, canvas)
+ }
Mode::NeedConfirmation(confirmed_mode) => {
self.confirmation(self.status, self.tab, confirmed_mode, canvas)
}
Mode::InputCompleted(_) => self.completion(self.tab, canvas),
Mode::InputSimple(InputSimple::Marks(_)) => self.marks(self.status, self.tab, canvas),
- Mode::InputSimple(InputSimple::EncryptedDrive(EncryptedDrive::PickDevices)) => {
- self.encrypted_devices(self.status, self.tab, canvas)
- }
_ => Ok(()),
}?;
self.cursor(self.tab, canvas)?;
@@ -520,10 +520,10 @@ 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 {
+ 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.as_string())?;
+ canvas.print(row, 3, &device.as_string()?)?;
}
}
Ok(())