#!/usr/bin/perl use strict; use diagnostics; use lib qw(/usr/lib/libDrakX); use standalone; use MDK::Common; use common; use mygtk2 qw(gtknew gtkset); use ugtk2 qw(:create :dialogs :helpers :wrappers); $ugtk2::wm_icon = "/usr/share/mcc/themes/default/drakperm-mdk.png"; require_root_capability(); #- vars declaration my ($level) = chomp_(`cat /etc/sysconfig/msec | grep SECURE_LEVEL= |cut -d= -f2`); my $default_perm_level = "level " . $level; my %perm_files = ($default_perm_level => '/usr/share/msec/perm.' . $level, 'editable' => '/etc/security/msec/perm.local', ); my %perm_l10n = ($default_perm_level => N("System settings"), 'editable' => N("Custom settings"), 'all' => N("Custom & system settings"), ); my %rev_perm_l10n = reverse %perm_l10n; my ($editable, $modified) = (0, 0); my @rules; #- Widget declaration my $w = ugtk2->new(N("Security Permissions")); $w->{rwindow}->set_size_request(620, 400) unless $::isEmbedded; my $W = $w->{window}; $W->signal_connect(delete_event => sub { ugtk2->exit }); my $model = Gtk2::ListStore->new("Gtk2::Gdk::Pixbuf", ("Glib::String") x 5); my $permList = Gtk2::TreeView->new_with_model($model); my $pixbuf = gtknew('Pixbuf', file => 'non-editable'); my @column_sizes = (150, 100, 100, 15, -1); # TreeView layout is (Editable, Path, User, Group, Permissions, [hidden]index_id) $permList->append_column(Gtk2::TreeViewColumn->new_with_attributes(N("Editable"), Gtk2::CellRendererPixbuf->new, 'pixbuf' => 0)); each_index { my $col = Gtk2::TreeViewColumn->new_with_attributes($_, Gtk2::CellRendererText->new, 'text' => $::i + 1); $col->set_min_width($column_sizes[$::i+1]); $permList->append_column($col); } (N("Path"), N("User"), N("Group"), N("Permissions")); my $index = 0; load_perms(); #- widgets settings my $combo_perm_value = $perm_l10n{all}; my $combo_perm = gtknew('ComboBox', list => [ sort(values %perm_l10n) ], text_ref => \$combo_perm_value); sub add_callback() { row_setting_dialog(N("Add a new rule")); $modified++; } sub edit_callback() { my (undef, $iter) = $permList->get_selection->get_selected; return unless $iter; row_setting_dialog(N("Edit current rule"), $iter); } my @buttons; sub del_callback() { my ($tree, $iter) = $permList->get_selection->get_selected; my $removed_idx = $tree->get($iter, 5); @rules = grep { $_->{index} ne $removed_idx } @rules; $tree->remove($iter); sensitive_buttons(0); $modified++; } sub move_callback { my ($direction) = @_; my ($model, $iter) = $permList->get_selection->get_selected; return if !$iter; my $path = $model->get_path($iter) or return; $direction eq 'up' ? $path->prev : $path->next; my $iter2 = $model->get_iter($path); return if !$iter2 || $model->get($iter2, 0); $model->swap($iter, $iter2); $modified = 1; hide_up_button_iffirst_item($path); hide_down_button_iflast_item($path); $permList->get_selection->select_iter($iter); $permList->queue_draw; } $permList->signal_connect(button_press_event => sub { return unless $editable; my (undef, $event) = @_; my (undef, $iter) = $permList->get_selection->get_selected; return unless $iter; row_setting_dialog(N("Edit current rule"), $iter) if $event->type eq '2button-press'; }); my $tips = Gtk2::Tooltips->new; $W->add(gtknew('VBox', spacing => 5, children => [ 0, gtknew('Label_Left', text => N("Here you can see files to use in order to fix permissions, owners, and groups via msec.\nYou can also edit your own rules which will owerwrite the default rules."), alignment => [ 0.5, 0 ]), 1, gtknew('VBox', border_width => 0, children => [ 0, gtknew('Label_Left', text => N("The current security level is %s. Select permissions to see/edit", $level), alignment => [ 0, 0 ]), 0, gtknew('HButtonBox', layout => 'start', children => [ 0, $combo_perm, ]), 0, gtknew('Label'), 1, gtknew('ScrolledWindow', child => $permList), 0, my $up_down_box = gtknew('HBox', spacing => 5, children_loose => [ @buttons = map { gtkset_tip($tips, gtknew('Button', text => $_->[0], clicked => $_->[2]), $_->[1]); } ([ N("Up"), N("Move selected rule up one level"), sub { move_callback('up') } ], [ N("Down"), N("Move selected rule down one level"), sub { move_callback('down') } ], [ N("Add a rule"), N("Add a new rule at the end"), \&add_callback ], [ N("Delete"), N("Delete selected rule"), \&del_callback ], [ N("Edit"), N("Edit current rule"), \&edit_callback ]) ]), 0, gtknew('VBox'), ]), 0, create_okcancel({ cancel_clicked => sub { ugtk2->exit }, ok_clicked => \&save_perm, }, undef, undef, '', [ N("Help"), sub { run_program::raw({ detach => 1 }, 'drakhelp', '--id', 'drakperm') } ], ) ]) ); $W->show_all; $w->{rwindow}->set_position('center') unless $::isEmbedded; display_perm('all'); my $_combo_sig = $combo_perm->entry->signal_connect(changed => sub { my $class = $rev_perm_l10n{$combo_perm_value}; $permList->set_reorderable($class eq 'editable'); display_perm($class , @_); }); $permList->get_selection->signal_connect('changed' => sub { my ($select) = @_; my (undef, $iter) = $select->get_selected; return if !$iter; my $locked = $model->get($iter, 0); sensitive_buttons($iter ? $editable && !$locked : 0); return if $locked; Merge pull request #4607 from marc1706/ticket/14953