Provide virtual Partition::get_filesystem_partition() method (#774818)

There are multiple cases of code wanting to work with the Partition
object directly containing the file system, regardless of whether it is
within a PartitionLUKS object or not.  The code had to do something
similar to this to access it:

    const Partition * filesystem_ptn = &partition;
    if ( partition.filesystem == FS_LUKS && partition.busy )
            filesystem_ptn = &dynamic_cast<const PartitionLUKS *>( &partition )->get_encrypted();
    ...
    // Access Partition object directly containing the file system
    filesystem_ptn-> ...

Implement and use virtual accessor get_filesystem_partition() which
allows the code to be simplified like this:

    const Partition & filesystem_ptn = partition.get_filesystem_partition();
    ...
    // Access Partition object directly containing the file system
    filesystem_ptn. ...

Bug 774818 - Implement LUKS read-write actions NOT requiring a
             passphrase
This commit is contained in:
Mike Fleetwood 2016-09-06 07:33:26 +01:00 committed by Curtis Gedak
parent 2be136b9fd
commit 53fd80e6ca
7 changed files with 58 additions and 63 deletions

View File

@ -50,7 +50,6 @@ private:
bool drawingarea_on_expose( GdkEventExpose *ev );
const Partition & partition; // (Alias to element in Win_GParted::display_partitions[] vector).
const Partition * filesystem; // (Alias to above partition or encrypted file system within).
Gtk::HBox *hbox ;
Gtk::DrawingArea drawingarea ;

View File

@ -131,6 +131,10 @@ public:
void append_messages( const std::vector<Glib::ustring> msgs )
{ messages.insert( messages.end(), msgs.begin(), msgs.end() ); }
// Interface to return reference to the Partition object directly containing the
// file system. Will be overridden in derived PartitionLUKS.
virtual const Partition & get_filesystem_partition() const { return *this; };
bool operator==( const Partition & partition ) const ;
bool operator!=( const Partition & partition ) const ;

View File

@ -53,6 +53,8 @@ public:
virtual std::vector<Glib::ustring> get_messages() const;
virtual void clear_messages();
virtual const Partition & get_filesystem_partition() const;
private:
Partition encrypted;
Sector header_size; // Size of the LUKS header (everything up to the start of the mapping)

View File

@ -30,12 +30,6 @@ namespace GParted
Dialog_Partition_Info::Dialog_Partition_Info( const Partition & partition ) : partition( partition )
{
// Filesystem points to the Partition object, or for an open LUKS mapping, the
// encrypted Partition object member within containing the encrypted file system.
filesystem = &partition;
if ( partition.filesystem == FS_LUKS && partition.busy )
filesystem = &dynamic_cast<const PartitionLUKS *>( &partition )->get_encrypted();
this ->set_has_separator( false ) ;
// Set minimum dialog height so it fits on an 800x600 screen without too much
// whitespace (~500 px max for GNOME desktop). Allow extra space if have any
@ -203,7 +197,7 @@ void Dialog_Partition_Info::init_drawingarea()
color_text .set( "black" );
this ->get_colormap() ->alloc_color( color_text ) ;
color_partition.set( Utils::get_color( filesystem->filesystem ) );
color_partition.set( Utils::get_color( partition.get_filesystem_partition().filesystem ) );
this ->get_colormap() ->alloc_color( color_partition ) ;
//set text of pangolayout
@ -224,11 +218,16 @@ void Dialog_Partition_Info::Display_Info()
//+-+------------+-------------+-------------+------------+---------------+
//0 1 2 3 4 5 6
// Refers to the Partition object containing the file system. Either the same as
// partition, or for an open LUKS mapping, the encrypted Partition object member
// within containing the encrypted file system.
const Partition & filesystem_ptn = partition.get_filesystem_partition();
Sector ptn_sectors = partition .get_sector_length() ;
Glib::ustring vgname = "" ; //Also used in partition status message
if ( filesystem->filesystem == FS_LVM2_PV )
vgname = LVM2_PV_Info::get_vg_name( filesystem->get_path() );
if ( filesystem_ptn.filesystem == FS_LVM2_PV )
vgname = LVM2_PV_Info::get_vg_name( filesystem_ptn.get_path() );
bool filesystem_accessible = false;
if ( partition.filesystem != FS_LUKS || partition.busy )
@ -265,13 +264,13 @@ void Dialog_Partition_Info::Display_Info()
Gtk::FILL ) ;
if ( filesystem_accessible )
{
table->attach( *Utils::mk_label( Utils::get_filesystem_string( filesystem->filesystem ), true, false, true ),
table->attach( *Utils::mk_label( Utils::get_filesystem_string( filesystem_ptn.filesystem ), true, false, true ),
2, 3, top, bottom, Gtk::FILL );
}
top++, bottom++;
//label
if ( filesystem->type != TYPE_UNALLOCATED && filesystem->type != TYPE_EXTENDED )
if ( filesystem_ptn.type != TYPE_UNALLOCATED && filesystem_ptn.type != TYPE_EXTENDED )
{
table ->attach( * Utils::mk_label( "<b>" + Glib::ustring( _("Label:") ) + "</b>"),
1, 2,
@ -279,14 +278,14 @@ void Dialog_Partition_Info::Display_Info()
Gtk::FILL) ;
if ( filesystem_accessible )
{
table->attach( *Utils::mk_label( filesystem->get_filesystem_label(), true, false, true ),
table->attach( *Utils::mk_label( filesystem_ptn.get_filesystem_label(), true, false, true ),
2, 3, top, bottom, Gtk::FILL);
}
top++, bottom++;
}
// file system uuid
if ( filesystem->type != TYPE_UNALLOCATED && filesystem->type != TYPE_EXTENDED )
if ( filesystem_ptn.type != TYPE_UNALLOCATED && filesystem_ptn.type != TYPE_EXTENDED )
{
table ->attach( * Utils::mk_label( "<b>" + Glib::ustring( _("UUID:") ) + "</b>"),
1, 2,
@ -294,7 +293,7 @@ void Dialog_Partition_Info::Display_Info()
Gtk::FILL) ;
if ( filesystem_accessible )
{
table->attach( *Utils::mk_label( filesystem->uuid, true, false, true ),
table->attach( *Utils::mk_label( filesystem_ptn.uuid, true, false, true ),
2, 3, top, bottom, Gtk::FILL);
}
top++, bottom++;
@ -310,7 +309,7 @@ void Dialog_Partition_Info::Display_Info()
static Glib::ustring luks_closed = _("Closed");
//status
if ( filesystem->type != TYPE_UNALLOCATED && filesystem->status != STAT_NEW )
if ( filesystem_ptn.type != TYPE_UNALLOCATED && filesystem_ptn.status != STAT_NEW )
{
//status
Glib::ustring str_temp ;
@ -325,9 +324,9 @@ void Dialog_Partition_Info::Display_Info()
*/
str_temp = _("Not accessible (Encrypted)");
}
else if ( filesystem->busy )
else if ( filesystem_ptn.busy )
{
if ( filesystem->type == TYPE_EXTENDED )
if ( filesystem_ptn.type == TYPE_EXTENDED )
{
/* TO TRANSLATORS: Busy (At least one logical partition is mounted)
* means that this extended partition contains at least one logical
@ -335,9 +334,9 @@ void Dialog_Partition_Info::Display_Info()
*/
str_temp = _("Busy (At least one logical partition is mounted)") ;
}
else if ( filesystem->filesystem == FS_LINUX_SWAP ||
filesystem->filesystem == FS_LINUX_SWRAID ||
filesystem->filesystem == FS_LVM2_PV )
else if ( filesystem_ptn.filesystem == FS_LINUX_SWAP ||
filesystem_ptn.filesystem == FS_LINUX_SWRAID ||
filesystem_ptn.filesystem == FS_LVM2_PV )
{
/* TO TRANSLATORS: Active
* means that this linux swap, linux software raid partition, or
@ -345,7 +344,7 @@ void Dialog_Partition_Info::Display_Info()
*/
str_temp = _("Active") ;
}
else if ( filesystem->filesystem == FS_LUKS )
else if ( filesystem_ptn.filesystem == FS_LUKS )
{
// NOTE: LUKS within LUKS
// Only ever display LUKS information in the file system
@ -353,15 +352,15 @@ void Dialog_Partition_Info::Display_Info()
// another LUKS encryption!
str_temp = luks_open;
}
else if ( filesystem->get_mountpoints().size() )
else if ( filesystem_ptn.get_mountpoints().size() )
{
str_temp = String::ucompose(
/* TO TRANSLATORS: looks like Mounted on /mnt/mymountpoint */
_("Mounted on %1"),
Glib::build_path( ", ", filesystem->get_mountpoints() ) );
Glib::build_path( ", ", filesystem_ptn.get_mountpoints() ) );
}
}
else if ( filesystem->type == TYPE_EXTENDED )
else if ( filesystem_ptn.type == TYPE_EXTENDED )
{
/* TO TRANSLATORS: Not busy (There are no mounted logical partitions)
* means that this extended partition contains no mounted or otherwise
@ -369,8 +368,8 @@ void Dialog_Partition_Info::Display_Info()
*/
str_temp = _("Not busy (There are no mounted logical partitions)") ;
}
else if ( filesystem->filesystem == FS_LINUX_SWAP ||
filesystem->filesystem == FS_LINUX_SWRAID )
else if ( filesystem_ptn.filesystem == FS_LINUX_SWAP ||
filesystem_ptn.filesystem == FS_LINUX_SWRAID )
{
/* TO TRANSLATORS: Not active
* means that this linux swap or linux software raid partition
@ -378,12 +377,12 @@ void Dialog_Partition_Info::Display_Info()
*/
str_temp = _("Not active") ;
}
else if ( filesystem->filesystem == FS_LUKS )
else if ( filesystem_ptn.filesystem == FS_LUKS )
{
// NOTE: LUKS within LUKS
str_temp = luks_closed;
}
else if ( filesystem->filesystem == FS_LVM2_PV )
else if ( filesystem_ptn.filesystem == FS_LVM2_PV )
{
if ( vgname .empty() )
/* TO TRANSLATORS: Not active (Not a member of any volume group)
@ -419,7 +418,7 @@ void Dialog_Partition_Info::Display_Info()
}
//Optional, LVM2 Volume Group name
if ( filesystem->filesystem == FS_LVM2_PV )
if ( filesystem_ptn.filesystem == FS_LVM2_PV )
{
//Volume Group
table ->attach( * Utils::mk_label( "<b>" + Glib::ustring( _("Volume Group:") ) + "</b>"),
@ -429,18 +428,18 @@ void Dialog_Partition_Info::Display_Info()
}
//Optional, members of multi-device file systems
if ( filesystem->filesystem == FS_LVM2_PV ||
filesystem->filesystem == FS_BTRFS )
if ( filesystem_ptn.filesystem == FS_LVM2_PV ||
filesystem_ptn.filesystem == FS_BTRFS )
{
//Members
table ->attach( * Utils::mk_label( "<b>" + Glib::ustring( _("Members:") ) + "</b>", true, false, false, 0.0 /* ALIGN_TOP */ ),
1, 2, top, bottom, Gtk::FILL ) ;
std::vector<Glib::ustring> members ;
switch ( filesystem->filesystem )
switch ( filesystem_ptn.filesystem )
{
case FS_BTRFS:
members = btrfs::get_members( filesystem->get_path() );
members = btrfs::get_members( filesystem_ptn.get_path() );
break ;
case FS_LVM2_PV:
if ( ! vgname .empty() )
@ -454,7 +453,7 @@ void Dialog_Partition_Info::Display_Info()
2, 3, top++, bottom++, Gtk::FILL );
}
if ( filesystem->filesystem == FS_LVM2_PV )
if ( filesystem_ptn.filesystem == FS_LVM2_PV )
{
//Logical Volumes
table ->attach( * Utils::mk_label( "<b>" + Glib::ustring( _("Logical Volumes:") ) + "</b>", true, false, false, 0.0 /* ALIGN_TOP */ ),

View File

@ -100,12 +100,7 @@ void DrawingAreaVisualDisk::set_static_data( const PartitionVector & partitions,
Sector partition_length = partitions[ t ] .get_sector_length() ;
visual_partitions .back() .fraction = partition_length / static_cast<double>( length ) ;
Glib::ustring color_str = Utils::get_color( partitions[t].filesystem );
if ( partitions[t].filesystem == FS_LUKS && partitions[t].busy )
{
const Partition & encrypted = dynamic_cast<const PartitionLUKS *>( &partitions[t] )->get_encrypted();
color_str = Utils::get_color( encrypted.filesystem );
}
Glib::ustring color_str = Utils::get_color( partitions[t].get_filesystem_partition().filesystem );
visual_partitions.back().color.set( color_str );
get_colormap() ->alloc_color( visual_partitions .back() .color );

View File

@ -201,4 +201,11 @@ void PartitionLUKS::clear_messages()
encrypted.clear_messages();
}
const Partition & PartitionLUKS::get_filesystem_partition() const
{
if ( busy )
return encrypted;
return *this;
}
} //GParted

View File

@ -24,6 +24,7 @@
#include <gtkmm/cellrenderer.h>
#include <gtkmm/cellrenderertext.h>
#include <pangomm/layout.h>
#include <glibmm/ustring.h>
namespace GParted
{
@ -154,10 +155,8 @@ void TreeView_Detail::create_row( const Gtk::TreeRow & treerow,
bool & show_mountpoints,
bool & show_labels )
{
const Partition * filesystem_ptn = &partition;
if ( partition.filesystem == FS_LUKS && partition.busy )
filesystem_ptn = &dynamic_cast<const PartitionLUKS *>( &partition )->get_encrypted();
if ( filesystem_ptn->busy )
const Partition & filesystem_ptn = partition.get_filesystem_partition();
if ( filesystem_ptn.busy )
treerow[ treeview_detail_columns .icon1 ] =
render_icon( Gtk::Stock::DIALOG_AUTHENTICATION, Gtk::ICON_SIZE_BUTTON );
@ -183,42 +182,32 @@ void TreeView_Detail::create_row( const Gtk::TreeRow & treerow,
if ( ! partition.name.empty() )
show_names = true;
// file system
treerow[treeview_detail_columns.color] = Utils::get_color_as_pixbuf( filesystem_ptn.filesystem, 16, 16 );
if ( partition.filesystem == FS_LUKS && partition.busy )
{
const Partition & encrypted = dynamic_cast<const PartitionLUKS *>( &partition )->get_encrypted();
// file system
treerow[treeview_detail_columns.color] = Utils::get_color_as_pixbuf( encrypted.filesystem, 16, 16 );
/* TO TRANSLATORS: means that this is an encrypted file system */
treerow[treeview_detail_columns.filesystem] = "[" + Glib::ustring( _("Encrypted") ) + "] " +
Utils::get_filesystem_string( encrypted.filesystem );
// mount point
treerow[treeview_detail_columns.mountpoint] = Glib::build_path( ", ", encrypted.get_mountpoints() );
}
else if ( partition.filesystem == FS_LUKS && ! partition.busy )
{
// file system
treerow[treeview_detail_columns.color] = Utils::get_color_as_pixbuf( partition.filesystem, 16, 16 );
treerow[treeview_detail_columns.filesystem] = "[" + Glib::ustring( _("Encrypted") ) + "]";
// mount point
treerow[treeview_detail_columns.mountpoint] = Glib::build_path( ", ", partition.get_mountpoints() );
}
else
{
// file system
treerow[treeview_detail_columns.color] = Utils::get_color_as_pixbuf( partition.filesystem, 16, 16 );
treerow[treeview_detail_columns.filesystem] = Utils::get_filesystem_string( partition.filesystem );
// mount point
treerow[treeview_detail_columns.mountpoint] = Glib::build_path( ", ", partition.get_mountpoints() );
}
if ( ! static_cast<Glib::ustring>( treerow[treeview_detail_columns.mountpoint] ).empty() )
// mount point
std::vector<Glib::ustring> temp_mountpoints = filesystem_ptn.get_mountpoints();
treerow[treeview_detail_columns.mountpoint] = Glib::build_path( ", ", temp_mountpoints );
if ( ! temp_mountpoints.empty() )
show_mountpoints = true;
//label
Glib::ustring temp_filesystem_label = partition.get_filesystem_label();
Glib::ustring temp_filesystem_label = filesystem_ptn.get_filesystem_label();
treerow[treeview_detail_columns.label] = temp_filesystem_label;
if ( ! temp_filesystem_label.empty() )
show_labels = true;