Skip to content

Commit 583d3df

Browse files
committed
Support mounting encrypted drive, fixes pop-os#144
1 parent 12d47c8 commit 583d3df

File tree

4 files changed

+70
-6
lines changed

4 files changed

+70
-6
lines changed

i18n/en/cosmic_files.ftl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ create-archive = Create archive
3535
empty-trash = Empty trash
3636
empty-trash-warning = Are you sure you want to permanently delete all the items in Trash?
3737
38+
## Mount Error Dialog
39+
mount-error = Unable to access drive
40+
3841
## New File/Folder Dialog
3942
create-new-file = Create new file
4043
create-new-folder = Create new folder

src/app.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ pub enum Message {
274274
Modifiers(Modifiers),
275275
MoveToTrash(Option<Entity>),
276276
MounterItems(MounterKey, MounterItems),
277+
MountResult(MounterKey, MounterItem, Result<bool, String>),
277278
NavBarClose(Entity),
278279
NavBarContext(Entity),
279280
NavMenuAction(NavMenuAction),
@@ -405,6 +406,11 @@ pub enum DialogPage {
405406
},
406407
EmptyTrash,
407408
FailedOperation(u64),
409+
MountError {
410+
mounter_key: MounterKey,
411+
item: MounterItem,
412+
error: String,
413+
},
408414
NetworkAuth {
409415
mounter_key: MounterKey,
410416
uri: String,
@@ -1630,6 +1636,15 @@ impl Application for App {
16301636
DialogPage::FailedOperation(id) => {
16311637
log::warn!("TODO: retry operation {}", id);
16321638
}
1639+
DialogPage::MountError {
1640+
mounter_key,
1641+
item,
1642+
error: _,
1643+
} => {
1644+
if let Some(mounter) = MOUNTERS.get(&mounter_key) {
1645+
return mounter.mount(item).map(|_| message::none());
1646+
}
1647+
}
16331648
DialogPage::NetworkAuth {
16341649
mounter_key: _,
16351650
uri: _,
@@ -1834,6 +1849,22 @@ impl Application for App {
18341849

18351850
return Command::batch(commands);
18361851
}
1852+
Message::MountResult(mounter_key, item, res) => match res {
1853+
Ok(true) => {
1854+
log::info!("connected to {:?}", item);
1855+
}
1856+
Ok(false) => {
1857+
log::info!("cancelled connection to {:?}", item);
1858+
}
1859+
Err(error) => {
1860+
log::warn!("failed to connect to {:?}: {}", item, error);
1861+
self.dialog_pages.push_back(DialogPage::MountError {
1862+
mounter_key,
1863+
item,
1864+
error,
1865+
});
1866+
}
1867+
},
18371868
Message::NetworkAuth(mounter_key, uri, auth, auth_tx) => {
18381869
self.dialog_pages.push_back(DialogPage::NetworkAuth {
18391870
mounter_key,
@@ -3198,6 +3229,19 @@ impl Application for App {
31983229
widget::button::standard(fl!("cancel")).on_press(Message::DialogCancel),
31993230
)
32003231
}
3232+
DialogPage::MountError {
3233+
mounter_key: _,
3234+
item: _,
3235+
error,
3236+
} => widget::dialog(fl!("mount-error"))
3237+
.body(error)
3238+
.icon(widget::icon::from_name("dialog-error").size(64))
3239+
.primary_action(
3240+
widget::button::standard(fl!("try-again")).on_press(Message::DialogComplete),
3241+
)
3242+
.secondary_action(
3243+
widget::button::standard(fl!("cancel")).on_press(Message::DialogCancel),
3244+
),
32013245
DialogPage::NetworkAuth {
32023246
mounter_key,
32033247
uri,
@@ -3988,6 +4032,7 @@ impl Application for App {
39884032
subscriptions.push(mounter.subscription().map(move |mounter_message| {
39894033
match mounter_message {
39904034
MounterMessage::Items(items) => Message::MounterItems(key, items),
4035+
MounterMessage::MountResult(item, res) => Message::MountResult(key, item, res),
39914036
MounterMessage::NetworkAuth(uri, auth, auth_tx) => {
39924037
Message::NetworkAuth(key, uri, auth, auth_tx)
39934038
}

src/mounter/gvfs.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ enum Cmd {
212212
enum Event {
213213
Changed,
214214
Items(MounterItems),
215+
MountResult(MounterItem, Result<bool, String>),
215216
NetworkAuth(String, MounterAuth, mpsc::Sender<MounterAuth>),
216217
NetworkResult(String, Result<bool, String>),
217218
}
@@ -324,7 +325,7 @@ impl Gvfs {
324325
event_tx.send(Event::Items(items(&monitor, IconSizes::default()))).unwrap();
325326
}
326327
Cmd::Mount(mounter_item) => {
327-
let MounterItem::Gvfs(item) = mounter_item else { continue };
328+
let MounterItem::Gvfs(ref item) = mounter_item else { continue };
328329
let ItemKind::Volume = item.kind else { continue };
329330
for (i, volume) in monitor.volumes().into_iter().enumerate() {
330331
if i != item.index {
@@ -338,14 +339,24 @@ impl Gvfs {
338339
}
339340

340341
log::info!("mount {}", name);
342+
//TODO: do not use name as a URI for mount_op
343+
let mount_op = mount_op(name.to_string(), event_tx.clone());
344+
let event_tx = event_tx.clone();
345+
let mounter_item = mounter_item.clone();
341346
VolumeExt::mount(
342347
&volume,
343348
gio::MountMountFlags::NONE,
344-
//TODO: gio::MountOperation needed for network shares with auth
345-
gio::MountOperation::NONE,
349+
Some(&mount_op),
346350
gio::Cancellable::NONE,
347-
move |result| {
348-
log::info!("mount {}: result {:?}", name, result);
351+
move |res| {
352+
log::info!("mount {}: result {:?}", name, res);
353+
event_tx.send(Event::MountResult(mounter_item, match res {
354+
Ok(()) => Ok(true),
355+
Err(err) => match err.kind::<gio::IOErrorEnum>() {
356+
Some(gio::IOErrorEnum::FailedHandled) => Ok(false),
357+
_ => Err(format!("{}", err))
358+
}
359+
})).unwrap();
349360
},
350361
);
351362
}
@@ -355,7 +366,7 @@ impl Gvfs {
355366
let mount_op = mount_op(uri.clone(), event_tx.clone());
356367
let event_tx = event_tx.clone();
357368
file.mount_enclosing_volume(
358-
gio::MountMountFlags::empty(),
369+
gio::MountMountFlags::NONE,
359370
Some(&mount_op),
360371
gio::Cancellable::NONE,
361372
move |res| {
@@ -499,6 +510,10 @@ impl Mounter for Gvfs {
499510
match event {
500511
Event::Changed => command_tx.send(Cmd::Rescan).unwrap(),
501512
Event::Items(items) => output.send(MounterMessage::Items(items)).await.unwrap(),
513+
Event::MountResult(item, res) => output
514+
.send(MounterMessage::MountResult(item, res))
515+
.await
516+
.unwrap(),
502517
Event::NetworkAuth(uri, auth, auth_tx) => output
503518
.send(MounterMessage::NetworkAuth(uri, auth, auth_tx))
504519
.await

src/mounter/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ pub type MounterItems = Vec<MounterItem>;
8585
#[derive(Clone, Debug)]
8686
pub enum MounterMessage {
8787
Items(MounterItems),
88+
MountResult(MounterItem, Result<bool, String>),
8889
NetworkAuth(String, MounterAuth, mpsc::Sender<MounterAuth>),
8990
NetworkResult(String, Result<bool, String>),
9091
}

0 commit comments

Comments
 (0)