diff options
Diffstat (limited to 'perl-install/standalone/drakperm')
-rwxr-xr-x | perl-install/standalone/drakperm | 369 |
1 files changed, 0 insertions, 369 deletions
diff --git a/perl-install/standalone/drakperm b/perl-install/standalone/drakperm deleted file mode 100755 index 60ce05307..000000000 --- a/perl-install/standalone/drakperm +++ /dev/null @@ -1,369 +0,0 @@ -#!/usr/bin/perl - -use strict; - -use lib qw(/usr/lib/libDrakX); -use standalone; - -use common; -use ugtk2 qw(:helpers :wrappers :create); -use interactive; - -my $in = 'interactive'->vnew('su', 'default'); -local $_ = join '', @ARGV; - -#- vars declaration -my ($default_perm_level) = "level ".chomp_(`cat /etc/sysconfig/msec | grep SECURE_LEVEL= |cut -d= -f2`); -my %CURENT; -my $perm_path = '/usr/share/msec/'; -my $local_path = '/etc/security/msec/'; -my %perm = ( 'level 1' => $perm_path.'perm.1', - 'level 2' => $perm_path.'perm.2', - 'level 3' => $perm_path.'perm.3', - 'level 4' => $perm_path.'perm.4', - 'level 5' => $perm_path.'perm.5', - 'editable' => $local_path.'perm.local', - ); -my $rows_cnt = 0; -my $editable = 0; -my $modified = 0; -my $prec_txt = $default_perm_level; - -#- Widget declaration -my $w = ugtk2->new('drakperm'); -my $W = $w->{window}; -$W->signal_connect(delete_event => sub { ugtk2->exit }); -my $treeModel = Gtk2::TreeStore->new((Gtk2::GType->STRING) x 4); -my $permList = Gtk2::TreeView->new_with_model($treeModel); - -my @column_sizes = (150, 100, 100, 15, -1); - -each_index { - my $col = Gtk2::TreeViewColumn->new_with_attributes($_, Gtk2::CellRendererText->new, 'text' => $::i); - $col->set_min_width($column_sizes[$::i]); - $permList->append_column($col); -} (N("path"), N("user"), N("group"), N("permissions")); - -#- widgets settings -my $combo_perm = new Gtk2::Combo; -$combo_perm->entry->set_editable(0); -$combo_perm->set_popdown_strings(sort(keys %perm)); - -sub add_callback { - row_setting_dialog($treeModel->append_set(undef, [ 0 => 'new', 1 => '-', 2 => '-', 3 => '-' ])); - $rows_cnt++; - $modified++; -} - -sub edit_callback { - my (undef, $iter) = $permList->get_selection->get_selected; - return unless $iter; - %CURENT = ('data' => [ - $treeModel->_get($iter, 0), - $treeModel->_get($iter, 1), - $treeModel->_get($iter, 2), - $treeModel->_get($iter, 3), - ] - ); - row_setting_dialog($iter); -} - -sub del_callback { - my ($tree, $iter) = $permList->get_selection->get_selected(); - $tree->remove($iter); - $rows_cnt--; - $modified++; -} - -sub down_callback { - #- broken - # my $row = ${$CURENT{clicked}}{row}; - # $permList->row_move($row, $row+1); - # $permList->unselect_all; - # $permList->select_row($row+1,0); - # $CURENT{clicked}{row} = $row+1; -} - -sub up_callback { - #- broken - # my $row = ${$CURENT{clicked}}{row}; - # $permList->row_move($row, $row-1); - # $permList->unselect_all; - # $permList->select_row($row-1,0); - # $CURENT{clicked}{row} = $row-1; -} - -my $combo_sig = $combo_perm->entry->signal_connect( changed => sub { display_perm($combo_perm->entry->get_text , @_) }); -$permList->signal_connect(button_press_event => sub { - my (undef, $event) = @_; - my (undef, $iter) = $permList->get_selection->get_selected; - row_setting_dialog($iter) if $event->type eq '2button_press'; - }); - - -my $up_down_box = new Gtk2::HBox(0,5); -my $tips = new Gtk2::Tooltips; - -foreach ([ N("Up"), N("Move selected rule up one level"), \&up_callback ], - [ N("Down"), N("Move selected rule down one level"), \&down_callback ], - [ 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 ]) { - $up_down_box->add(gtkset_tip($tips, - gtksignal_connect(Gtk2::Button->new($_->[0]), - clicked => $_->[2] - ), - $_->[1])); -} - - - - -$W->add(gtkpack_(Gtk2::VBox->new(0,5), - 0, Gtk2::Label->new(N("Drakperm is used to 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.")), - 1, gtkadd(Gtk2::Frame->new, - gtkpack_(Gtk2::VBox->new(0,5), - 0, gtkadd(Gtk2::HBox->new(0,5), - Gtk2::Label->new(N("select perm file to see/edit")), - $combo_perm - ), - 1, create_scrolled_window($permList), - 0, $up_down_box, - 0, gtkadd(Gtk2::HBox->new(0,5), - gtksignal_connect(Gtk2::Button->new(N("Save")), clicked => \&save_perm), - gtksignal_connect(Gtk2::Button->new(N("Quit")), clicked => sub { ugtk2->exit }) - ) - ) - ) - ) - ); -$W->show_all; -$w->{rwindow}->set_position('center') unless $::isEmbedded; - -display_perm($default_perm_level); -$combo_perm->entry->set_text($default_perm_level); - -$w->main; -ugtk2->exit; - - -sub check_save { - $modified or return 0; - my $sav_ = $in->ask_okcancel('Warning', 'your changed will be lost do you wish to continue?'); - $sav_ - and $modified = 0; - return $sav_; -} - -sub display_perm { - my $perm_level = shift @_; - my $file = $perm{$perm_level}; - my $sav_ = &check_save; - my $i = 0; - if ($modified && ! $sav_) { - $combo_perm->entry->signal_handler_block($combo_sig); - $combo_perm->entry->set_text($prec_txt); - $combo_perm->entry->signal_handler_unblock($combo_sig); - return 0; - } - - $editable = $perm_level =~ /^level \d/ ? 0 : 1; - - $treeModel->clear(); - local *F; - open F, $file; - local $_; - while (<F>) { - next unless m/^([^#]\S+)\s+([^.\s]+)(\.(\S+))?\s+(\d+)/; - $treeModel->append_set(undef, [ 0 => $1, 1 => $2, 2 => $4, 3 => $5 ]); - } - close F; - $up_down_box->set_sensitive($editable); - - $rows_cnt = $i; - $prec_txt = $perm_level; - undef(%CURENT); -} - -sub save_perm { - $modified or return 0; - local *F; - open F, '>'.$local_path.'perm.local' or die("F CHIER BORDEL"); - foreach my $i (0..$rows_cnt) { - my $line = $permList->get_text($i, 0) . "\t" . $permList->get_text($i,1) . ($permList->get_text($i,2) ? "." . $permList->get_text($i,2) : "") . "\t" . $permList->get_text($i,3) . "\n"; - print F $line; - } - close F; - $modified = 0; -} - -sub row_setting_dialog { - my ($iter) = @_; - - my %perms; - my $dlg = new Gtk2::Dialog(); - $dlg->set_transient_for($w->{rwindow}) unless $::isEmbedded; - $dlg->set_modal(1); -# $dlg->set_resizable(0); - my $ok = new Gtk2::Button('ok'); - my $cancel = new Gtk2::Button('cancel'); - my $browse = new Gtk2::Button(N("browse")); - my $users = new Gtk2::Combo; - my $groups = new Gtk2::Combo; - my $file = new Gtk2::Entry; - my $usr_hbox = new Gtk2::HBox(0,5); - my $usr_vbox = new Gtk2::VBox(0,5); - my $usr_check = new Gtk2::CheckButton(N("Current user")); - my $hb_rights = new Gtk2::HBox(0,15); - my $vb_rights = new Gtk2::VBox(0,15); - my $F_rights = new Gtk2::Frame(N("Permissions")); - my $F_usr = new Gtk2::Frame(N("Property")); - my $vb_specials = new Gtk2::VBox(0,5); - my $sticky = new Gtk2::CheckButton(N("sticky-bit")); - my $suid = new Gtk2::CheckButton(N("Set-UID")); - my $gid = new Gtk2::CheckButton(N("Set-GID")); - my $rght = ${$CURENT{data}}[3]; - my $s = length($rght) == 4 ? substr($rght,0,1) : 0; - my $user = $s ? substr($rght,1,1) : substr($rght,0,1); - my $group = $s ? substr($rght,2,1) : substr($rght,1,1); - my $other = $s ? substr($rght,3,1) : substr($rght,2,1); - - my %rights = (user => $user, group => $group, other => $other); - my @check = ('', 'read', 'write', 'execute'); - - $vb_rights->add(new Gtk2::Label($_)) foreach @check; - $hb_rights->add($vb_rights); - - foreach my $r (keys %rights) { - $perms{$r} = { get_right($rights{$r}) }; - my $vbox = gtkadd(Gtk2::VBox->new(0,5), Gtk2::Label->new($r)); - foreach my $c (@check) { - $c eq '' and next; - my $active = $perms{$r}{$c}; - $perms{$r}{$c} = Gtk2::CheckButton->new; - $perms{$r}{$c}->set_active($active); - $vbox->add($perms{$r}{$c}); - } - $hb_rights->add($vbox); - } - - $vb_specials->add(new Gtk2::Label(' ')); - $vb_specials->add($suid); - $vb_specials->add($gid); - $vb_specials->add($sticky); - $hb_rights->add($vb_specials); - - #- dlg widgets settings - my %s_right = get_right($s); - $s_right{execute} and $sticky->set_active(1); - $s_right{write} and $gid->set_active(1); - $s_right{read} and $suid->set_active(1); - - $file->set_text(${$CURENT{data}}[0]); - - $users->set_popdown_strings(&get_user_or_group('users')); - $users->entry->set_text(${$CURENT{data}}[1]); - $users->entry->set_editable(0); - - $groups->set_popdown_strings(&get_user_or_group); - $groups->entry->set_text(${$CURENT{data}}[2]); - $groups->entry->set_editable(0); - - if (${$CURENT{data}}[1] eq 'current') { - $usr_check->set_active(1); - $groups->set_sensitive(0); - $users->set_sensitive(0); - } - - $tips->set_tip($sticky, N("Used for directory:\n only owner of directory or file in this directory can delete it")); - $tips->set_tip($suid, N("Use owner id for execution")); - $tips->set_tip($gid, N("Use group id for execution")); - $tips->set_tip($usr_check, N("when checked, owner and group won't be changed")); - - $cancel->signal_connect(clicked => sub { $dlg->destroy }); - $browse->signal_connect(clicked => sub { - my $file_dlg = new Gtk2::FileSelection(N("Path selection")); - $file_dlg->set_modal(1); - $file_dlg->show; - $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; - }); - }); - $ok->signal_connect(clicked => sub { - $treeModel->set($iter, [ 0 => $file->get_text ]); - if ($usr_check->get_active) { - $treeModel->set($iter, [ 1 => 'current' ]); - $treeModel->set($iter, [ 2 => '' ]); - } else { - $treeModel->set($iter, [ 1 => $users->entry->get_text ]); - $treeModel->set($iter, [ 2 => $groups->entry->get_text ]); - } - $user = ($perms{user}{read}->get_active ? 4 : 0)+($perms{user}{write}->get_active ? 2 : 0)+($perms{user}{execute}->get_active ? 1 : 0); - $group = ($perms{group}{read}->get_active ? 4 : 0)+($perms{group}{write}->get_active ? 2 : 0)+($perms{group}{execute}->get_active ? 1 : 0); - $other = ($perms{other}{read}->get_active ? 4 : 0)+($perms{other}{write}->get_active ? 2 : 0)+($perms{other}{execute}->get_active ? 1 : 0); - my $s = ($sticky->get_active ? 1 : 0) + ($suid->get_active ? 4 : 0) + ($gid->get_active ? 2 : 0); - $treeModel->set($iter, [ 3 => ($s || '') . $user . $group . $other ]); - $dlg->destroy; - $modified++; - }); - $usr_check->signal_connect(clicked => sub { - my $bool = $usr_check->get_active; - $groups->set_sensitive(!$bool); - $users->set_sensitive(!$bool); - }); - - - $usr_vbox->add($usr_check); - $usr_vbox->add($usr_hbox); - - $usr_hbox->add(new Gtk2::Label(N("user :"))); - $usr_hbox->add($users); - $usr_hbox->add(new Gtk2::Label(N("group :"))); - $usr_hbox->add($groups); - - $F_rights->add($hb_rights); - $F_usr->add($usr_vbox); - - gtkpack_($dlg->vbox, - 0, gtkadd(new Gtk2::Frame(N("Path")), - gtkpack_(Gtk2::HBox->new(0,5), - 1, $file, - 0, $browse - ) - ), - 0, $F_usr, - 1, $F_rights - ); - $dlg->action_area->add($ok); - $dlg->action_area->add($cancel); - - $dlg->show_all; - -} - -sub get_user_or_group { - my $what = @_; - my @users; - local *F; - open F, $what eq 'users' ? '/etc/passwd' : '/etc/group'; - - local $_; - while (<F>) { - m/^([^#:]+):[^:]+:[^:]+:/ or next; - push @users, $1; - } - close F; - return sort(@users); -} - -sub get_right { - my ($right) = @_; - my %rght = ('read' => 0, 'write' => 0, 'execute' => 0); - $right - 4 >= 0 and $rght{read}=1 and $right = $right-4; - $right - 2 >= 0 and $rght{write}=1 and $right = $right-2; - $right - 1 >= 0 and $rght{execute}=1 and $right = $right-1; - return %rght; -} |