summaryrefslogtreecommitdiffstats
path: root/perl-install/standalone/drakperm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/standalone/drakperm')
-rwxr-xr-xperl-install/standalone/drakperm235
1 files changed, 122 insertions, 113 deletions
diff --git a/perl-install/standalone/drakperm b/perl-install/standalone/drakperm
index 39579af91..fa69be838 100755
--- a/perl-install/standalone/drakperm
+++ b/perl-install/standalone/drakperm
@@ -5,12 +5,13 @@ use diagnostics;
use lib qw(/usr/lib/libDrakX);
use standalone;
+use MDK::Common;
use common;
-use ugtk2 qw(:helpers :wrappers :create);
+use mygtk3 qw(gtknew gtkset);
+use ugtk3 qw(:create :dialogs :helpers :wrappers);
-$ugtk2::wm_icon = "/usr/share/mcc/themes/default/drakperm-mdk.png";
+$ugtk3::wm_icon = "/usr/share/mcc/themes/default/drakperm-mdk.png";
require_root_capability();
-local $_ = join '', @ARGV;
#- vars declaration
my ($level) = chomp_(`cat /etc/sysconfig/msec | grep SECURE_LEVEL= |cut -d= -f2`);
@@ -29,21 +30,21 @@ my ($editable, $modified) = (0, 0);
my @rules;
#- Widget declaration
-my $w = ugtk2->new('drakperm');
+my $w = ugtk3->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);
+$W->signal_connect(delete_event => sub { ugtk3->exit });
+my $model = Gtk3::ListStore->new("Gtk3::Gdk::Pixbuf", ("Glib::String") x 5);
+my $permList = Gtk3::TreeView->new_with_model($model);
-my $pixbuf = gtkcreate_pixbuf('non-editable');
+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));
+$permList->append_column(Gtk3::TreeViewColumn->new_with_attributes(N("Editable"), Gtk3::CellRendererPixbuf->new, 'pixbuf' => 0));
each_index {
- my $col = Gtk2::TreeViewColumn->new_with_attributes($_, Gtk2::CellRendererText->new, 'text' => $::i + 1);
+ my $col = Gtk3::TreeViewColumn->new_with_attributes($_, Gtk3::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"));
@@ -52,17 +53,18 @@ my $index = 0;
load_perms();
#- widgets settings
-my $combo_perm = Gtk2::ComboBox->new_with_strings([ sort(values %perm_l10n) ]);
+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();
+ 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($iter);
+ row_setting_dialog(N("Edit current rule"), $iter);
}
my @buttons;
@@ -97,51 +99,48 @@ $permList->signal_connect(button_press_event => sub {
my (undef, $event) = @_;
my (undef, $iter) = $permList->get_selection->get_selected;
return unless $iter;
- row_setting_dialog($iter) if $event->type eq '2button-press';
+ row_setting_dialog(N("Edit current rule"), $iter) if $event->type eq '2button-press';
});
-my $tips = Gtk2::Tooltips->new;
-
-$W->add(gtkpack_(Gtk2::VBox->new(0,5),
- 0, Gtk2::WrappedLabel->new(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."), 0.5),
- 1, gtkadd(Gtk2::Frame->new,
- gtkpack_(gtkset_border_width(Gtk2::VBox->new, 5),
- 0, Gtk2::WrappedLabel->new(N("The current security level is %s.
-Select permissions to see/edit", $level), 0.5),
- 0, gtkpack_(gtkset_layout(Gtk2::HButtonBox->new, 'spread'),
+$W->add(gtknew('VBox', spacing => 5, children => [
+ if_(!$::isEmbedded, 0, Gtk3::Banner->new('/usr/share/mcc/themes/default/drakperm-mdk.png', N("Permissions"))),
+ 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 overwrite 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,
- ),
- 1, create_scrolled_window($permList),
- 0, my $up_down_box = gtkadd(Gtk2::HBox->new(0, 5), @buttons =
+ ]),
+ 0, gtknew('Label'),
+ 1, gtknew('ScrolledWindow', child => $permList),
+ 0, my $up_down_box = gtknew('HBox', spacing => 5, children_loose => [ @buttons =
map {
- gtkset_tip($tips,
- gtksignal_connect(Gtk2::Button->new($_->[0]), clicked => $_->[2]),
+ gtkset_tip(
+ 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, Gtk2::VBox->new,
- ),
- ),
+ [ N("Edit"), N("Edit current rule"), \&edit_callback ]) ]),
+ 0, gtknew('VBox'),
+ ]),
0, create_okcancel({
- cancel_clicked => sub { ugtk2->exit },
+ cancel_clicked => sub { ugtk3->exit },
ok_clicked => \&save_perm,
},
undef, undef, '',
- [ N("Help"), sub { unless (fork()) { exec("drakhelp --id drakperm") } } ],
+ [ N("Help"), sub { run_program::raw({ detach => 1 }, 'drakhelp', '--id', 'drakperm') } ],
)
- )
+ ])
);
$W->show_all;
$w->{rwindow}->set_position('center') unless $::isEmbedded;
-$combo_perm->entry->set_text($perm_l10n{all});
display_perm('all');
my $_combo_sig = $combo_perm->entry->signal_connect(changed => sub {
- my $class = $rev_perm_l10n{$combo_perm->entry->get_text};
+ my $class = $rev_perm_l10n{$combo_perm_value};
$permList->set_reorderable($class eq 'editable');
display_perm($class , @_);
});
@@ -159,7 +158,7 @@ $permList->get_selection->signal_connect('changed' => sub {
});
$w->main;
-ugtk2->exit;
+ugtk3->exit;
sub hide_up_button_iffirst_item {
@@ -187,7 +186,7 @@ sub display_perm {
foreach my $rule (@rules) {
next if !$show_all_rules && ($show_user_rules && $rule->{editable} || $show_sys_rules && !$rule->{editable});
$model->append_set(map_index { if_(defined $rule->{$_}, $::i => $rule->{$_}) } qw(editable path user group perms index));
- };
+ }
# alter button box behavior
$editable = $perm_level =~ /^level \d/ ? 0 : 1;
@@ -210,7 +209,7 @@ sub save_perm() {
close $F;
}
$modified = 0;
- ugtk2->exit;
+ ugtk3->exit;
}
sub load_perms() {
@@ -233,15 +232,13 @@ sub load_perms() {
}
sub row_setting_dialog {
- my ($iter) = @_;
+ my ($title, $o_iter) = @_;
- my $dlg = Gtk2::Dialog->new;
- $dlg->set_transient_for($w->{rwindow}) unless $::isEmbedded;
- $dlg->set_modal(1);
+ my $dlg = gtknew('Dialog', transient_for => $w->{real_window}, title => $title);
# $dlg->set_resizable(0);
- my $browse = Gtk2::Button->new(N("browse"));
- my $file = Gtk2::Entry->new;
- my ($other, $group, $user, $s) = reverse(split(//, $model->get($iter, 4))) if $iter;
+ my $browse = gtknew('Button', text => N("browse"));
+ my $file = gtknew('Entry', $o_iter ? (text => $model->get($o_iter, 1)) : ());
+ my ($other, $group, $user, $s) = $o_iter ? reverse(split(//, $model->get($o_iter, 4))) : ();
my @bits = qw(sticky gid suid);
my @rights = qw(read write execute);
my @owners = (N_("user"), N_("group"), N_("other"));
@@ -252,21 +249,21 @@ sub row_setting_dialog {
label => N("Read"),
tip => { map { $_ =>
#-PO: here %s will be either "user", "group" or "other"
- N("Enable \"%s\" to read the file", translate($_))
+ N("Enable \"%s\" to read the file", translate($_));
} keys %rights },
},
'write' => {
label => N("Write"),
tip => { map { $_ =>
#-PO: here %s will be either "user", "group" or "other"
- N("Enable \"%s\" to write the file", translate($_))
+ N("Enable \"%s\" to write the file", translate($_));
} keys %rights },
},
'execute' => {
label => N("Execute"),
tip => { map { $_ =>
#-PO: here %s will be either "user", "group" or "other"
- N("Enable \"%s\" to execute the file", translate($_))
+ N("Enable \"%s\" to execute the file", translate($_));
} keys %rights },
},
sticky => { label => N("Sticky-bit"), tip => N("Used for directory:\n only owner of directory or file in this directory can delete it") },
@@ -277,122 +274,130 @@ sub row_setting_dialog {
#- dlg widgets settings
my %s_right = get_right($s);
- my $alrd_exsts = defined $iter;
- $file->set_text($model->get($iter, 1)) if $iter;
+ my $alrd_exsts = defined $o_iter;
- my $users = Gtk2::ComboBox->new_with_strings([ get_user_or_group('users') ]);
- $users->entry->set_text($model->get($iter, 2)) if $iter;
+ my $users = gtknew('ComboBox', list => [ my @users = get_user_or_group('users') ]);
+ $users->entry->set_text($model->get($o_iter, 2)) if $o_iter;
+ $users->set_wrap_width(3);
- my $groups = Gtk2::ComboBox->new_with_strings([ get_user_or_group() ]);
- $groups->entry->set_text($model->get($iter, 3)) if $iter;
-
- my $id_box = gtkadd(Gtk2::HBox->new,
- Gtk2::Label->new(N("User:")),
- $users,
- Gtk2::Label->new(N("Group:")),
- $groups,
+ my $groups = gtknew('ComboBox', list => [ my @groups = get_user_or_group('groups') ]);
+ $groups->entry->set_text($model->get($o_iter, 3)) if $o_iter;
+ $groups->set_wrap_width(3);
+
+ my $id_box = gtknew('Table', homogeneous => 0, xpadding => 0.1, ypadding => 0, border_width => 0, children => [
+ [ gtknew('Label_Left', text => N("User:")), $users ],
+ [ gtknew('Label_Left', text => N("Group:")), $groups ],
+ ]
);
- my $usr_check = gtksignal_connect(gtkset_tip($tips, Gtk2::CheckButton->new(N("Current user")),
- N("When checked, owner and group won't be changed")),
+ my $usr_check = gtksignal_connect(gtkset_tip(gtknew('CheckButton', text => N("Current user")),
+ N("When checked, owner and group will not be changed")),
clicked => sub { $id_box->set_sensitive(!$_[0]->get_active) });
- if ($iter && $model->get($iter, 2) eq 'current') {
+ if ($o_iter && $model->get($o_iter, 2) eq 'current') {
$usr_check->set_active(1);
- $id_box->set_sensitive(0)
+ $id_box->set_sensitive(0);
} else { $usr_check->set_active(0) }
$browse->signal_connect(clicked => sub {
- my $file_dlg = Gtk2::FileSelection->new(N("Path selection"));
- $file_dlg->set_modal(1);
- $file_dlg->set_transient_for($dlg);
- $file_dlg->show;
+ my $file_dlg = gtknew('FileChooserDialog', title => N("Path selection"), action => 'select_folder',
+ modal => 1, transient_for => $dlg);
$file_dlg->set_filename($file->get_text);
- $file_dlg->cancel_button->signal_connect(clicked => sub { $file_dlg->destroy });
- $file_dlg->ok_button->signal_connect(clicked => sub {
- $file->set_text($file_dlg->get_filename);
- $file_dlg->destroy;
- });
+ $file_dlg->show;
+ my $answer = $file_dlg->run;
+ if ($answer eq 'ok') {
+ $file->set_text($file_dlg->get_filename);
+ }
+ $file_dlg->hide;
+ $file_dlg->destroy;
});
my %perms;
- gtkpack_($dlg->vbox,
- 0, gtkadd(Gtk2::Frame->new(N("Path")),
- gtkpack_(gtkset_border_width(Gtk2::HBox->new, 3),
+ gtkpack_($dlg->get_child,
+ 0, gtknew('Title2', label => N("Path")),
+ 0, gtknew('HBox', border_width => 18, children => [
1, $file,
0, $browse
- )
+ ]
),
- 0, gtkadd(Gtk2::Frame->new(N("Property")),
- gtkadd(gtkset_border_width(Gtk2::VBox->new, 3),
- $usr_check,
- $id_box,
- ),
+ 0, gtknew('Title2', label => N("Property")),
+ 0, gtknew('VBox', border_width => 18, children => [
+ 0, $usr_check,
+ ]
),
- 1, gtkadd(Gtk2::Frame->new(N("Permissions")),
- gtkpack(gtkset_border_width(Gtk2::HBox->new, 3),
- gtkadd(Gtk2::VBox->new,
- Gtk2::Label->new(""),
- map { Gtk2::Label->new($checks{$_}{label}) } @rights,
- ),
+ 0, $id_box,
+ 0, gtknew('Title2', label => N("Permissions")),
+ 1, gtknew('HBox', border_width => 0, children_loose => [
+ gtknew('VBox', border_width => 0, children_loose => [
+ gtknew('Label', text => ""),
+ map { gtknew('Label_Left', text => $checks{$_}{label}, alignment => [ 0, 0 ]) } @rights,
+ ]),
(map {
my $owner = $_;
$perms{$owner} = { get_right($rights{$owner}) };
- my $vbox = gtkadd(Gtk2::VBox->new,
- Gtk2::Label->new($rights_labels{$owner}),
+ my $vbox = gtknew('VBox', children_loose => [
+ gtknew('Label', text => $rights_labels{$owner}),
map {
my $c = $_;
my $active = $perms{$owner}{$c};
- $perms{$owner}{$c} = Gtk2::CheckButton->new;
- $tips->set_tip($perms{$owner}{$c},
+ $perms{$owner}{$c} = gtkset_tip(gtknew('CheckButton'),
$checks{$c}{tip}{$owner},
);
gtkset_active($perms{$owner}{$c}, $active);
} @rights,
- );
+ ]);
$vbox;
} @owners),
- gtkpack(Gtk2::VBox->new,
- Gtk2::Label->new(' '),
- map { $perms{$_} = gtkset_tip($tips, Gtk2::CheckButton->new($checks{$_}{label}), $checks{$_}{tip}) } @bits,
- ),
- ),
- ),
+ gtknew('VBox', children_loose => [
+ gtknew('Label', text => ' '),
+ map { $perms{$_} = gtkset(gtknew('CheckButton', text => $checks{$_}{label}), tip => $checks{$_}{tip}) } @bits,
+ ]),
+ ]),
);
$perms{sticky}->set_active($s_right{execute});
$perms{gid}->set_active($s_right{write});
$perms{suid}->set_active($s_right{read});
- $dlg->set_has_separator(0);
-
- gtkadd($dlg->action_area,
+ gtkadd($dlg->get_action_area,
create_okcancel(my $w =
{
cancel_clicked => sub { $dlg->destroy },
ok_clicked => sub {
my ($path, $user, $group, $perms, $_idx);
$path = $file->get_text;
+ if ($path !~ m!^/!) {
+ err_dialog(N("Warning"), N("The first character of the path must be a slash (\"/\"):\n\"%s\"", $path));
+ return 1;
+ }
if ($usr_check->get_active) {
$user = 'current';
$group = '';
} else {
$user = $users->entry->get_text;
$group = $groups->entry->get_text;
+ if (!member($user, @users) || !member($group, @groups)) {
+ err_dialog(N("Warning"), join("\n", N("Both the username and the group must valid!"),
+ N("User: %s", $user),
+ N("Group: %s", $group),
+ )
+ );
+ return 1;
+ }
}
$perms = sprintf("%03o", eval(join('', "0b",
(map { $perms{$_}->get_active || 0 } reverse @bits),
(map { my $owner = $_;map_index {
- $perms{$owner}{$_}->get_active || 0
+ $perms{$owner}{$_}->get_active || 0;
} @rights } @owners))));
# create new item if needed (that is when adding a new one) at end of list
- if (!$iter) {
- $iter = $model->append;
+ if (!$o_iter) {
+ $o_iter = $model->append;
push @rules, { path => $path, user => $user, group => $group, perms => $perms, index => $index };
- $model->set($iter, 5 => $index++);
+ $model->set($o_iter, 5 => $index++);
}
- $model->set($iter, 1 => $path, 2 => $user, 3 => $group, 4 => $perms);
+ $model->set($o_iter, 1 => $path, 2 => $user, 3 => $group, 4 => $perms);
$dlg->destroy;
$modified++;
}
@@ -400,7 +405,7 @@ sub row_setting_dialog {
),
);
- $w->{ok}->set_sensitive(!$model->get($iter, 0)) if $alrd_exsts;
+ $w->{ok}->set_sensitive(!$model->get($o_iter, 0)) if $alrd_exsts;
$dlg->show_all;
}
@@ -410,9 +415,13 @@ sub get_user_or_group {
my @users;
local $_;
- foreach (cat_($what eq 'users' ? '/etc/passwd' : '/etc/group')) {
- m/^([^#:]+):[^:]+:[^:]+:/ or next;
- push @users, $1;
+ my $is_users = $what eq 'users';
+ foreach (cat_($is_users ? '/etc/passwd' : '/etc/group')) {
+ if ($is_users) {
+ push @users, $1 if m/^([^#:]+):[^:]+:[^:]+:/; # or next;
+ } else {
+ push @users, $1 if m/^([^#:]+):[^:]*:[^:]*:/; # or next;
+ }
}
return sort(@users);
}