Add unimplemented open/close encryption to the partition menu (#795617)

Add new item to the partition menu to allow the user to open and close
the LUKS mapping.  However for now the menu item is always disabled and
there is no implementation behind it to actually open or close the LUKS
mapping.  Fragment of the partition menu is now:

    ...
    Format to       >
    -----------------
    Open Encryption      <- New menu item
    Mount
    -----------------
    Name Partition
    ...

Has to be two separate menu items to clearly represent to the user that
LUKS mappings and file system mounting are two separate busy states.
And also in the case of an open but unmounted file system to offer both
actions; close encryption and mount file system.

The text of the menu item automatically changes similarly to how it does
for the Mount/Unmount, Swapon/Swapoff, Activate/Deactivate item
depending on the state of the LUKS mapping.  For open LUKS mappings it
will show "Close Encryption" and for all other cases (closed LUKS
mapping or partition is not encrypted) "Open Encryption".  Again similar
to how the default of "Mount" is shown for unallocated and unknown
partitions.

Bug 795617 - Implement opening and closing of LUKS mappings
This commit is contained in:
Mike Fleetwood 2016-10-25 10:47:38 +01:00 committed by Curtis Gedak
parent f898910e90
commit e4959c520f
4 changed files with 72 additions and 16 deletions

View File

@ -107,6 +107,9 @@ private:
void allow_format( bool state ) {
toggle_item( state, MENU_FORMAT ) ; }
void allow_toggle_crypt_busy_state( bool state ) {
toggle_item( state, MENU_TOGGLE_CRYPT_BUSY ); }
void allow_toggle_fs_busy_state( bool state ) {
toggle_item( state, MENU_TOGGLE_FS_BUSY ); }
@ -177,6 +180,7 @@ private:
void activate_delete();
void activate_info();
void activate_format( FSType new_fs );
void toggle_crypt_busy_state();
bool check_toggle_busy_allowed( const Glib::ustring & disallowed_msg );
void show_toggle_failure_dialog( const Glib::ustring & failure_summary,
const Glib::ustring & marked_up_error );
@ -258,6 +262,7 @@ private:
MENU_COPY, TOOLBAR_COPY,
MENU_PASTE, TOOLBAR_PASTE,
MENU_FORMAT,
MENU_TOGGLE_CRYPT_BUSY,
MENU_TOGGLE_FS_BUSY,
MENU_MOUNT,
MENU_NAME_PARTITION,

View File

@ -27,6 +27,7 @@ namespace GParted
class luks : public FileSystem
{
public:
const Glib::ustring get_custom_text( CUSTOM_TEXT ttype, int index = 0 ) const;
FS get_filesystem_support();
bool is_busy( const Glib::ustring & path );
void set_used_sectors( Partition & partition );

View File

@ -69,6 +69,7 @@ Win_GParted::Win_GParted( const std::vector<Glib::ustring> & user_devices )
MENU_COPY = TOOLBAR_COPY =
MENU_PASTE = TOOLBAR_PASTE =
MENU_FORMAT =
MENU_TOGGLE_CRYPT_BUSY =
MENU_TOGGLE_FS_BUSY =
MENU_MOUNT =
MENU_NAME_PARTITION =
@ -373,7 +374,13 @@ void Win_GParted::init_partition_menu()
menu_partition .items() .push_back( Gtk::Menu_Helpers::SeparatorElem() ) ;
index++ ;
menu_partition.items().push_back(
// Placeholder text, replaced in set_valid_operations() before the menu is shown
Gtk::Menu_Helpers::MenuElem( "--toggle crypt busy--",
sigc::mem_fun( *this, &Win_GParted::toggle_crypt_busy_state ) ) );
MENU_TOGGLE_CRYPT_BUSY = index++;
menu_partition .items() .push_back(
// Placeholder text, replaced in set_valid_operations() before the menu is shown
Gtk::Menu_Helpers::MenuElem( "--toggle fs busy--",
@ -1050,13 +1057,19 @@ bool Win_GParted::Quit_Check_Operations()
void Win_GParted::set_valid_operations()
{
allow_new( false ); allow_delete( false ); allow_resize( false ); allow_copy( false );
allow_paste( false ); allow_format( false ); allow_toggle_fs_busy_state( false );
allow_paste( false ); allow_format( false );
allow_toggle_crypt_busy_state( false ); allow_toggle_fs_busy_state( false );
allow_name_partition( false ); allow_manage_flags( false ); allow_check( false );
allow_label_filesystem( false ); allow_change_uuid( false ); allow_info( false );
// Set default name for the open/close crypt menu item.
const FileSystem * luks_filesystem_object = gparted_core.get_filesystem_object( FS_LUKS );
g_assert( luks_filesystem_object != NULL ); // Bug: LUKS FileSystem object not found
dynamic_cast<Gtk::Label*>( menu_partition.items()[MENU_TOGGLE_CRYPT_BUSY].get_child() )
->set_label( luks_filesystem_object->get_custom_text( CTEXT_ACTIVATE_FILESYSTEM ) );
// Set default name for the file system active/deactivate menu item.
dynamic_cast<Gtk::Label*>( menu_partition.items()[MENU_TOGGLE_FS_BUSY].get_child() )
->set_label( FileSystem::get_generic_text ( CTEXT_DEACTIVATE_FILESYSTEM ) ) ;
->set_label( FileSystem::get_generic_text( CTEXT_ACTIVATE_FILESYSTEM ) );
menu_partition.items()[MENU_TOGGLE_FS_BUSY].show();
menu_partition .items()[ MENU_MOUNT ] .hide() ;
@ -1076,19 +1089,33 @@ void Win_GParted::set_valid_operations()
//if there's something, there's some info ;)
allow_info( true ) ;
// Set an appropriate name for the activate/deactivate menu item.
const FileSystem * filesystem_object = gparted_core.get_filesystem_object( selected_filesystem.filesystem );
if ( filesystem_object )
dynamic_cast<Gtk::Label*>( menu_partition.items()[MENU_TOGGLE_FS_BUSY].get_child() )
->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_FS_BUSY].get_child() )
->set_label( FileSystem::get_generic_text ( selected_filesystem.busy
? CTEXT_DEACTIVATE_FILESYSTEM
: CTEXT_ACTIVATE_FILESYSTEM )
) ;
// Set appropriate name for the open/close crypt menu item.
if ( selected_partition_ptr->filesystem == FS_LUKS )
{
dynamic_cast<Gtk::Label*>( menu_partition.items()[MENU_TOGGLE_CRYPT_BUSY].get_child() )
->set_label( luks_filesystem_object->get_custom_text( selected_partition_ptr->busy
? CTEXT_DEACTIVATE_FILESYSTEM
: CTEXT_ACTIVATE_FILESYSTEM ) );
}
// Set appropriate name for the file system active/deactivate menu item.
if ( selected_partition_ptr->filesystem != FS_LUKS || selected_partition_ptr->busy )
{
const FileSystem * filesystem_object = gparted_core.get_filesystem_object( selected_filesystem.filesystem );
if ( filesystem_object )
{
dynamic_cast<Gtk::Label*>( menu_partition.items()[MENU_TOGGLE_FS_BUSY].get_child() )
->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_FS_BUSY].get_child() )
->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
@ -2385,6 +2412,12 @@ void Win_GParted::activate_format( FSType new_fs )
temp_ptn = NULL;
}
void Win_GParted::toggle_crypt_busy_state()
{
// Method not yet implemented as MENU_TOGGLE_CRYPT_BUSY item "Open/Close encrypted
// volume" in the partition menu is never enabled.
}
bool Win_GParted::unmount_partition( const Partition & partition, Glib::ustring & error )
{
const std::vector<Glib::ustring> fs_mountpoints = partition.get_mountpoints();

View File

@ -22,6 +22,23 @@
namespace GParted
{
const Glib::ustring luks::get_custom_text( CUSTOM_TEXT ttype, int index ) const
{
/* TO TRANSLATORS: these labels will be used in the partition menu */
static const Glib::ustring activate_text = _("Open Encryption");
static const Glib::ustring deactivate_text = _("Close Encryption");
switch ( ttype )
{
case CTEXT_ACTIVATE_FILESYSTEM:
return index == 0 ? activate_text : "";
case CTEXT_DEACTIVATE_FILESYSTEM:
return index == 0 ? deactivate_text : "";
default:
return "";
}
}
FS luks::get_filesystem_support()
{
FS fs;