Support mounting encrypted drive, fixes #144

This commit is contained in:
Jeremy Soller 2024-10-11 16:43:16 -06:00
parent 12d47c8c80
commit 583d3dfa0d
No known key found for this signature in database
GPG key ID: D02FD439211AF56F
4 changed files with 70 additions and 6 deletions

View file

@ -212,6 +212,7 @@ enum Cmd {
enum Event {
Changed,
Items(MounterItems),
MountResult(MounterItem, Result<bool, String>),
NetworkAuth(String, MounterAuth, mpsc::Sender<MounterAuth>),
NetworkResult(String, Result<bool, String>),
}
@ -324,7 +325,7 @@ impl Gvfs {
event_tx.send(Event::Items(items(&monitor, IconSizes::default()))).unwrap();
}
Cmd::Mount(mounter_item) => {
let MounterItem::Gvfs(item) = mounter_item else { continue };
let MounterItem::Gvfs(ref item) = mounter_item else { continue };
let ItemKind::Volume = item.kind else { continue };
for (i, volume) in monitor.volumes().into_iter().enumerate() {
if i != item.index {
@ -338,14 +339,24 @@ impl Gvfs {
}
log::info!("mount {}", name);
//TODO: do not use name as a URI for mount_op
let mount_op = mount_op(name.to_string(), event_tx.clone());
let event_tx = event_tx.clone();
let mounter_item = mounter_item.clone();
VolumeExt::mount(
&volume,
gio::MountMountFlags::NONE,
//TODO: gio::MountOperation needed for network shares with auth
gio::MountOperation::NONE,
Some(&mount_op),
gio::Cancellable::NONE,
move |result| {
log::info!("mount {}: result {:?}", name, result);
move |res| {
log::info!("mount {}: result {:?}", name, res);
event_tx.send(Event::MountResult(mounter_item, match res {
Ok(()) => Ok(true),
Err(err) => match err.kind::<gio::IOErrorEnum>() {
Some(gio::IOErrorEnum::FailedHandled) => Ok(false),
_ => Err(format!("{}", err))
}
})).unwrap();
},
);
}
@ -355,7 +366,7 @@ impl Gvfs {
let mount_op = mount_op(uri.clone(), event_tx.clone());
let event_tx = event_tx.clone();
file.mount_enclosing_volume(
gio::MountMountFlags::empty(),
gio::MountMountFlags::NONE,
Some(&mount_op),
gio::Cancellable::NONE,
move |res| {
@ -499,6 +510,10 @@ impl Mounter for Gvfs {
match event {
Event::Changed => command_tx.send(Cmd::Rescan).unwrap(),
Event::Items(items) => output.send(MounterMessage::Items(items)).await.unwrap(),
Event::MountResult(item, res) => output
.send(MounterMessage::MountResult(item, res))
.await
.unwrap(),
Event::NetworkAuth(uri, auth, auth_tx) => output
.send(MounterMessage::NetworkAuth(uri, auth, auth_tx))
.await

View file

@ -85,6 +85,7 @@ pub type MounterItems = Vec<MounterItem>;
#[derive(Clone, Debug)]
pub enum MounterMessage {
Items(MounterItems),
MountResult(MounterItem, Result<bool, String>),
NetworkAuth(String, MounterAuth, mpsc::Sender<MounterAuth>),
NetworkResult(String, Result<bool, String>),
}