Implement mount/umount of encrypted file systems (#774818)

Adapts the swapon/swapoff, activate/deactivate Volume Group and mount/
unmount file system code to work with the Partition object directly
containing the file system.

Bug 774818 - Implement LUKS read-write actions NOT requiring a
             passphrase
This commit is contained in:
Mike Fleetwood 2016-09-14 07:14:47 +01:00 committed by Curtis Gedak
parent 313c5fcb1c
commit 112ddef9df
1 changed files with 48 additions and 44 deletions

View File

@ -47,6 +47,7 @@
#include <gtkmm/radiobuttongroup.h>
#include <gtkmm/main.h>
#include <gtkmm/separator.h>
#include <glibmm/ustring.h>
namespace GParted
{
@ -1087,28 +1088,28 @@ void Win_GParted::set_valid_operations()
allow_info( true ) ;
// Set an appropriate name for the activate/deactivate menu item.
const FileSystem * filesystem_object = gparted_core.get_filesystem_object( selected_partition_ptr->filesystem );
const FileSystem * filesystem_object = gparted_core.get_filesystem_object( selected_filesystem.filesystem );
if ( filesystem_object )
dynamic_cast<Gtk::Label*>( menu_partition .items()[ MENU_TOGGLE_BUSY ] .get_child() )
->set_label( filesystem_object->get_custom_text( selected_partition_ptr->busy
->set_label( filesystem_object->get_custom_text( selected_filesystem.busy
? CTEXT_DEACTIVATE_FILESYSTEM
: CTEXT_ACTIVATE_FILESYSTEM ) );
else
dynamic_cast<Gtk::Label*>( menu_partition .items()[ MENU_TOGGLE_BUSY ] .get_child() )
->set_label( FileSystem::get_generic_text ( selected_partition_ptr->busy
->set_label( FileSystem::get_generic_text ( selected_filesystem.busy
? CTEXT_DEACTIVATE_FILESYSTEM
: CTEXT_ACTIVATE_FILESYSTEM )
) ;
// Only permit file system mount/unmount and swapon/swapoff when available
if ( selected_partition_ptr->status == STAT_REAL
&& selected_partition_ptr->type != TYPE_EXTENDED
&& selected_partition_ptr->filesystem != FS_LVM2_PV
&& selected_partition_ptr->filesystem != FS_LINUX_SWRAID
&& selected_partition_ptr->filesystem != FS_LUKS
&& ( selected_partition_ptr->busy
|| selected_partition_ptr->get_mountpoints().size() /* Have mount point(s) */
|| selected_partition_ptr->filesystem == FS_LINUX_SWAP
if ( selected_partition_ptr->status == STAT_REAL
&& selected_partition_ptr->type != TYPE_EXTENDED
&& selected_filesystem.filesystem != FS_LVM2_PV
&& selected_filesystem.filesystem != FS_LINUX_SWRAID
&& selected_filesystem.filesystem != FS_LUKS
&& ( selected_filesystem.busy
|| selected_filesystem.get_mountpoints().size() /* Have mount point(s) */
|| selected_filesystem.filesystem == FS_LINUX_SWAP
)
)
allow_toggle_busy_state( true ) ;
@ -1117,9 +1118,9 @@ void Win_GParted::set_valid_operations()
// For now specifically allow activation of an exported VG, which LVM will fail
// with "Volume group "VGNAME" is exported", otherwise user won't know why the
// inactive PV can't be activated.
if ( selected_partition_ptr->status == STAT_REAL
&& selected_partition_ptr->filesystem == FS_LVM2_PV // Active VGNAME from mount point
&& ( selected_partition_ptr->busy || selected_partition_ptr->get_mountpoints().size() > 0 )
if ( selected_partition_ptr->status == STAT_REAL
&& selected_filesystem.filesystem == FS_LVM2_PV // Active VGNAME from mount point
&& ( selected_filesystem.busy || selected_filesystem.get_mountpoints().size() > 0 )
)
allow_toggle_busy_state( true ) ;
@ -1247,17 +1248,18 @@ void Win_GParted::set_valid_operations()
// Generate Mount on submenu, except for LVM2 PVs borrowing mount point to
// display the VGNAME and read-only supported LUKS.
if ( selected_partition_ptr->filesystem != FS_LVM2_PV &&
selected_partition_ptr->filesystem != FS_LUKS &&
selected_partition_ptr->get_mountpoints().size() )
if ( selected_filesystem.filesystem != FS_LVM2_PV &&
selected_filesystem.filesystem != FS_LUKS &&
selected_filesystem.get_mountpoints().size() )
{
menu = menu_partition .items()[ MENU_MOUNT ] .get_submenu() ;
menu ->items() .clear() ;
for ( unsigned int t = 0 ; t < selected_partition_ptr->get_mountpoints().size() ; t++ )
std::vector<Glib::ustring> temp_mountpoints = selected_filesystem.get_mountpoints();
for ( unsigned int t = 0 ; t < temp_mountpoints.size() ; t++ )
{
menu ->items() .push_back(
Gtk::Menu_Helpers::MenuElem(
selected_partition_ptr->get_mountpoints()[t],
temp_mountpoints[t],
sigc::bind<unsigned int>( sigc::mem_fun(*this, &Win_GParted::activate_mount_partition), t ) ) );
dynamic_cast<Gtk::Label*>( menu ->items() .back() .get_child() ) ->set_use_underline( false ) ;
@ -2325,42 +2327,43 @@ void Win_GParted::toggle_busy_state()
Glib::ustring disallowed_msg;
Glib::ustring pulse_msg;
Glib::ustring failure_msg;
if ( selected_partition_ptr->filesystem == FS_LINUX_SWAP && selected_partition_ptr->busy )
const Partition & filesystem_ptn = selected_partition_ptr->get_filesystem_partition();
if ( filesystem_ptn.filesystem == FS_LINUX_SWAP && filesystem_ptn.busy )
{
action = SWAPOFF;
disallowed_msg = _("The swapoff action cannot be performed when there are operations pending for the partition.");
pulse_msg = String::ucompose( _("Deactivating swap on %1"), selected_partition_ptr->get_path() );
pulse_msg = String::ucompose( _("Deactivating swap on %1"), filesystem_ptn.get_path() );
failure_msg = _("Could not deactivate swap");
}
else if ( selected_partition_ptr->filesystem == FS_LINUX_SWAP && ! selected_partition_ptr->busy )
else if ( filesystem_ptn.filesystem == FS_LINUX_SWAP && ! filesystem_ptn.busy )
{
action = SWAPON;
disallowed_msg = _("The swapon action cannot be performed when there are operations pending for the partition.");
pulse_msg = String::ucompose( _("Activating swap on %1"), selected_partition_ptr->get_path() );
pulse_msg = String::ucompose( _("Activating swap on %1"), filesystem_ptn.get_path() );
failure_msg = _("Could not activate swap");
}
else if ( selected_partition_ptr->filesystem == FS_LVM2_PV && selected_partition_ptr->busy )
else if ( filesystem_ptn.filesystem == FS_LVM2_PV && filesystem_ptn.busy )
{
action = DEACTIVATE_VG;
disallowed_msg = _("The deactivate Volume Group action cannot be performed when there are operations pending for the partition.");
pulse_msg = String::ucompose( _("Deactivating Volume Group %1"),
selected_partition_ptr->get_mountpoint() ); // VGNAME from point point
filesystem_ptn.get_mountpoint() ); // VGNAME from point point
failure_msg = _("Could not deactivate Volume Group");
}
else if ( selected_partition_ptr->filesystem == FS_LVM2_PV && ! selected_partition_ptr->busy )
else if ( filesystem_ptn.filesystem == FS_LVM2_PV && ! filesystem_ptn.busy )
{
action = ACTIVATE_VG;
disallowed_msg = _("The activate Volume Group action cannot be performed when there are operations pending for the partition.");
pulse_msg = String::ucompose( _("Activating Volume Group %1"),
selected_partition_ptr->get_mountpoint() ); // VGNAME from point point
filesystem_ptn.get_mountpoint() ); // VGNAME from point point
failure_msg = _("Could not activate Volume Group");
}
else if ( selected_partition_ptr->busy )
else if ( filesystem_ptn.busy )
{
action = UNMOUNT;
disallowed_msg = _("The unmount action cannot be performed when there are operations pending for the partition.");
pulse_msg = String::ucompose( _("Unmounting %1"), selected_partition_ptr->get_path() );
failure_msg = String::ucompose( _("Could not unmount %1"), selected_partition_ptr->get_path() );
pulse_msg = String::ucompose( _("Unmounting %1"), filesystem_ptn.get_path() );
failure_msg = String::ucompose( _("Could not unmount %1"), filesystem_ptn.get_path() );
}
else
// Impossible. Mounting a file system calls activate_mount_partition().
@ -2385,27 +2388,27 @@ void Win_GParted::toggle_busy_state()
switch ( action )
{
case SWAPOFF:
cmd = "swapoff -v " + selected_partition_ptr->get_path();
cmd = "swapoff -v " + filesystem_ptn.get_path();
success = ! Utils::execute_command( cmd, output, error );
error_msg = "<i># " + cmd + "\n" + error + "</i>";
break;
case SWAPON:
cmd = "swapon -v " + selected_partition_ptr->get_path();
cmd = "swapon -v " + filesystem_ptn.get_path();
success = ! Utils::execute_command( cmd, output, error );
error_msg = "<i># " + cmd + "\n" + error + "</i>";
break;
case DEACTIVATE_VG:
cmd = "lvm vgchange -a n " + selected_partition_ptr->get_mountpoint();
cmd = "lvm vgchange -a n " + filesystem_ptn.get_mountpoint();
success = ! Utils::execute_command( cmd, output, error );
error_msg = "<i># " + cmd + "\n" + error + "</i>";
break;
case ACTIVATE_VG:
cmd = "lvm vgchange -a y " + selected_partition_ptr->get_mountpoint();
cmd = "lvm vgchange -a y " + filesystem_ptn.get_mountpoint();
success = ! Utils::execute_command( cmd, output, error );
error_msg = "<i># " + cmd + "\n" + error + "</i>";
break;
case UNMOUNT:
success = unmount_partition( *selected_partition_ptr, error_msg );
success = unmount_partition( filesystem_ptn, error_msg );
break;
default:
// Impossible
@ -2436,25 +2439,26 @@ void Win_GParted::activate_mount_partition( unsigned int index )
Glib::ustring error;
Glib::ustring error_msg;
const Partition & filesystem_ptn = selected_partition_ptr->get_filesystem_partition();
show_pulsebar( String::ucompose( _("mounting %1 on %2"),
selected_partition_ptr->get_path(),
selected_partition_ptr->get_mountpoints()[index] ) );
filesystem_ptn.get_path(),
filesystem_ptn.get_mountpoints()[index] ) );
// First try mounting letting mount (libblkid) determine the file system type.
cmd = "mount -v " + selected_partition_ptr->get_path() +
" \"" + selected_partition_ptr->get_mountpoints()[index] + "\"";
cmd = "mount -v " + filesystem_ptn.get_path() +
" \"" + filesystem_ptn.get_mountpoints()[index] + "\"";
success = ! Utils::execute_command( cmd, output, error );
if ( ! success )
{
error_msg = "<i># " + cmd + "\n" + error + "</i>";
Glib::ustring type = Utils::get_filesystem_kernel_name( selected_partition_ptr->filesystem );
Glib::ustring type = Utils::get_filesystem_kernel_name( filesystem_ptn.filesystem );
if ( ! type.empty() )
{
// Second try mounting specifying the GParted determined file
// system type.
cmd = "mount -v -t " + type + " " + selected_partition_ptr->get_path() +
" \"" + selected_partition_ptr->get_mountpoints()[index] + "\"";
cmd = "mount -v -t " + type + " " + filesystem_ptn.get_path() +
" \"" + filesystem_ptn.get_mountpoints()[index] + "\"";
success = ! Utils::execute_command( cmd, output, error );
if ( ! success )
error_msg += "\n<i># " + cmd + "\n" + error + "</i>";
@ -2464,8 +2468,8 @@ void Win_GParted::activate_mount_partition( unsigned int index )
if ( ! success )
{
Glib::ustring failure_msg = String::ucompose( _("Could not mount %1 on %2"),
selected_partition_ptr->get_path(),
selected_partition_ptr->get_mountpoints()[index] );
filesystem_ptn.get_path(),
filesystem_ptn.get_mountpoints()[index] );
show_toggle_failure_dialog( failure_msg, error_msg );
}