diff options
Diffstat (limited to 'perl-install/standalone/draksec')
| -rwxr-xr-x | perl-install/standalone/draksec | 369 | 
1 files changed, 166 insertions, 203 deletions
diff --git a/perl-install/standalone/draksec b/perl-install/standalone/draksec index 929d125ac..1e6c60d71 100755 --- a/perl-install/standalone/draksec +++ b/perl-install/standalone/draksec @@ -1,8 +1,9 @@  #!/usr/bin/perl  #*****************************************************************************  # -# Copyright (c) 2002-2004 Christian Belisle -#                         Thierry Vignaud <tvignaud@mandrakesoft.com> +# Copyright (c) 2002-2008 Christian Belisle +#                         Thierry Vignaud <thierry.vignaud.com> +#			  Eugeni Dodonov <eugeni@andriva.com>  #  # This program is free software; you can redistribute it and/or modify  #  it under the terms of the GNU General Public License version 2, as @@ -24,7 +25,9 @@ use lib qw(/usr/lib/libDrakX);  use common;  use standalone;  use vars qw($MODE %options); -use ugtk2 qw(:helpers :wrappers :ask :create); +use interactive; +use mygtk3 qw(gtknew gtkset); +use ugtk3 qw(:helpers :wrappers :ask :create);  use run_program;  use security::level;  use security::msec; @@ -38,255 +41,215 @@ use security::l10n;  #/^-?-(\S+)$/ and $options{$1} = 1 foreach @ARGV; -my ($w, %fields); +my $_in = 'interactive'->vnew('su'); # enforce being root + +$ugtk3::wm_icon = "/usr/share/mcc/themes/default/draksec-mdk.png"; +my ($w);  ############################    I18N     ################################### -my %inv_translations = map { translate($_) => $_ } N_("ALL"), N_("LOCAL"), N_("NONE"), N_("default"), N_("default"), N_("ignore"), N_("no"), N_("yes"); -my %translations = reverse %inv_translations; + + +my %translations = ( +	'ALL'     => N("ALL"), +	'LOCAL'   => N("LOCAL"), +	'NONE'    => N("NONE"), +	'default' => N("Default"), +	'ignore'  => N("Ignore"), + 	'no'      => N("No"), +	'yes'     => N("Yes"), +); +my %inv_translations = reverse %translations;  sub to_i18n { map { $translations{$_} || $_ } @_ }  sub from_i18n { $inv_translations{$_[0]} || $_[0] } -sub resize { gtkset_size_request($_[0], 50, -1) } +sub resize { gtkset($_[0], width => 50) } -%fields = security::l10n::fields(); -my %inv_fields = reverse %fields; - -# factorize this with rpmdrake and harddrake2 +# factorize this with drakrpm and harddrake2  sub wait_msg { -    my $mainw = ugtk2->new('wait', (modal => 1, if_(!$::isEmbedded, transient => $w->{rwindow}))); -    $mainw->{window}->add(new Gtk2::WrappedLabel($_[0])); +    my $mainw = ugtk3->new(N("Please wait"), (modal => 1, transient => $w->{real_window})); +    $mainw->{window}->add(gtknew('WrappedLabel', text => $_[0]));      $mainw->{rwindow}->show_all; -    gtkset_mousecursor_wait($mainw->{rwindow}->window); -    gtkflush(); +    gtkset_mousecursor_wait($mainw->{rwindow}->get_window); +    # ugly workaround for gtk+ not displaying subdialog contents: +    Glib::Timeout->add(300, sub { Gtk3->main_quit; 0 }); +    Gtk3->main;      $mainw;  }  sub remove_wait_msg { $_[0]->destroy } -sub basic_seclevel_explanations() { -    my $text = gtkset_markup(Gtk2::WrappedLabel->new, -#-PO Do not alter the <span ..> and </span> tags -#-PO Translate the security levels (Poor, Standard, High, Higher and Paranoid) in the same way, you translated these individuals words -                             formatAlaTeX(N("Here, you can setup the security level and administrator of your machine. - +sub new_nonedit_combo { +    my ($string_list, $o_default_value) = @_; +    gtknew('ComboBox', text => to_i18n($o_default_value), list => [ to_i18n(@$string_list) ]); +} -The Security Administrator is the one who will receive security alerts if the -'Security Alerts' option is set. It can be a username or an email. +#my $msec = security::msec->new; +$w = ugtk3->new(N("Security Level and Checks")); +my $window = $w->{window}; -The Security Level menu allows you to select one of the six preconfigured security levels -provided with msec. These levels range from poor security and ease of use, to -paranoid config, suitable for very sensitive server applications: +############################ MAIN WINDOW ################################### +# Set different options to Gtk3::Window +unless ($::isEmbedded) { +    $w->{rwindow}->set_position('center'); +    $w->{rwindow}->set_title("DrakSec"); +    $window->set_size_request(598, 520); +} +# Connect the signals +$window->signal_connect('delete_event', sub { $window->destroy }); +$window->signal_connect('destroy', sub { ugtk3->exit }); -<span foreground=\"royalblue3\">Poor</span>: This is a totally unsafe but very -easy to use security level. It should only be used for machines not connected to -any network and that are not accessible to everybody. +$window->add(my $vbox = gtkshow(gtknew('VBox'))); +my $common_opts = { col_spacings => 10, row_spacings => 5, mcc => 1 }; -<span foreground=\"royalblue3\">Standard</span>: This is the standard security -recommended for a computer that will be used to connect to the Internet as a -client. +######################## AUTH ################################### +my %progs; +my $auth_string = N("Configure authentication required to access %s tools", N("Mageia")); -<span foreground=\"royalblue3\">High</span>: There are already some -restrictions, and more automatic checks are run every night. +my %auth = ( +      default => N("Default"), +      no_passwd => N("No password"), +      root_passwd => N("Administrator password"), +      user_passwd => N("User password"), +); +my $polkit_rules_file = "/etc/polkit-1/rules.d/51-draksec.rules"; +my %overrides = map { if (/case '([^']+)': return polkit\.Result\.(YES|AUTH_ADMIN_KEEP|AUTH_SELF_KEEP)/) { ($1, $2) } } cat_($polkit_rules_file); -<span foreground=\"royalblue3\">Higher</span>: The security is now high enough -to use the system as a server which can accept connections from many clients. If -your machine is only a client on the Internet, you should choose a lower level. +sub default_auth_value { +    my ($prog) = @_; -<span foreground=\"royalblue3\">Paranoid</span>: This is similar to the previous -level, but the system is entirely closed and security features are at their -maximum"))); -    create_scrolled_window($text, [ 'never', 'automatic' ]); +    return $auth{no_passwd} if $overrides{$prog} eq 'YES'; +    return $auth{root_passwd} if $overrides{$prog} eq 'AUTH_ADMIN_KEEP'; +    return $auth{user_passwd} if $overrides{$prog} eq 'AUTH_SELF_KEEP'; +    return $auth{default};  } -sub new_nonedit_combo { -    my ($string_list, $o_default_value) = @_; -    my $w = new Gtk2::OptionMenu(); -    $w->set_popdown_strings(to_i18n(@$string_list)) unless is_empty_array_ref $string_list; -    $w->entry->set_text(to_i18n($o_default_value)) if $o_default_value; -    $w; +sub set_auth_value { +    my ($prog, $auth) = @_; +    if ($auth eq 'no_passwd') { +        $overrides{$prog} = 'YES'; +    } elsif ($auth eq 'root_passwd') { +        $overrides{$prog} = 'AUTH_ADMIN_KEEP'; +    } elsif ($auth eq 'user_passwd') { +        $overrides{$prog} = 'AUTH_SELF_KEEP'; +    } else { +        delete $overrides{$prog}; +    }  } -sub set_help_tip { -     my ($entry, $default, $opt) = @_; -     my $help = $security::help::help{$opt}; -     gtkset_tip(new Gtk2::Tooltips, $entry, formatAlaTeX($help) . "\n" . N("(default value: %s)", to_i18n($default))); +sub write_rules() { +    my $contents = ''; +    keys %overrides; +    while (my ($k, $v) = each %overrides) { +        $contents .= "case '$k': return polkit.Result.$v;\n" if $k && $v; +    } + +    if ($contents) { +        output($polkit_rules_file, <<EOF); +// This file is written by draksec. Do not edit. +var drakToolAuth = function(tool){switch (tool){ +$contents +}return polkit.Result.NOT_HANDLED;}; +EOF +    } else { +        rm_rf($polkit_rules_file) if -f $polkit_rules_file; +    } + +    system('systemctl', 'try-restart', 'polkit.service');  } -my $msec = new security::msec; -$w = ugtk2->new('draksec'); -my $window = $w->{window}; +my %descr = ( +     +    drakrpm => N("Software Management"), +    'drakrpm-update' => N("%s Update", N("Mageia")), +    'drakrpm-editmedia' => N("Software Media Manager"), +    drak3d => N("Configure 3D Desktop effects"), +    drakx11 => N("Graphical Server Configuration"), +    drakmouse => N("Mouse Configuration"), +    drakkeyboard => N("Keyboard Configuration"), +    drakups => N("UPS Configuration"), +    drakconnect => N("Network Configuration"), +    drakhosts => N("Hosts definitions"), +    draknetcenter => N("Network Center"), +    drakroam => N("Wireless Network Roaming"), +    drakvpn => N("VPN"), +    drakproxy => N("Proxy Configuration"), +    drakgw => N("Connection Sharing"), +    drakauth => N("Authentication"), +    drakbackup => N("Backups"), +    drakfont => N("Import fonts"), +    draklog => N("Logs"), +    drakxservices => N("Services"), +    drakuser => N("Users"), +    drakclock => N("Date, Clock & Time Zone Settings"), +    drakboot => N("Boot Configuration"), +    isodumper => N("Isodumper"), +); -############################ MAIN WINDOW ################################### -# Set different options to Gtk2::Window -unless ($::isEmbedded) { -    $w->{rwindow}->set_position('center'); -    $w->{rwindow}->set_title("DrakSec"); -    $window->set_size_request(598, 520); -} - -# Connect the signals -$window->signal_connect('delete_event', sub { $window->destroy }); -$window->signal_connect('destroy', sub { ugtk2->exit }); - -$window->add(my $vbox = gtkshow(new Gtk2::VBox(0, 0))); - -# Create the notebook (for bookmarks at the top) -my $notebook = create_notebook(); - -my $common_opts = { col_spacings => 10, row_spacings => 5 }; - -######################## BASIC OPTIONS PAGE ################################ -my ($seclevel_entry, $secadmin_entry); - -$notebook->append_page(gtkshow(gtkpack_(new Gtk2::VBox(0, 0), -                                       1, basic_seclevel_explanations(), -                                       0, create_packtable($common_opts, -                                                        [  -                                                          do { -                                                              my @sec_levels = security::level::get_common_list(); -                                                              my $current_level = security::level::get_string(); -                                                               -                                                              push(@sec_levels, $current_level) unless member($current_level, @sec_levels); -                                                              $seclevel_entry = new_nonedit_combo(\@sec_levels, $current_level); -                                                               -                                                              new Gtk2::Label(N("Security Level:")), $seclevel_entry; -                                                          } -                                                          ], -                                                        [ new Gtk2::Label(N("Security Alerts:")),  -                                                          my $secadmin_check = gtksignal_connect(Gtk2::CheckButton->new, toggled => sub { -                                                                                                     $secadmin_entry->set_sensitive($_[0]->get_active); -                                                                                                 }) ], -                                                        [ new Gtk2::Label(N("Security Administrator:")), -                                                          $secadmin_entry = Gtk2::Entry->new_with_text($msec->get_check_value("MAIL_USER")) ]))), -                               new Gtk2::Label(N("Basic options"))); -                        -if ($msec->get_check_value("MAIL_WARN") eq "yes") { -    $secadmin_check->set_active(1); -} else { -    $secadmin_entry->set_sensitive(0); - } -                        -######################### NETWORK & SYSTEM OPTIONS ######################### -my @yesno_choices    = qw(yes no default ignore); -my @alllocal_choices = qw(ALL LOCAL NONE default); -my @all_choices = (@yesno_choices, @alllocal_choices); -my %options_values; -my $help_msg = N("The following options can be set to customize your\nsystem security. If you need an explanation, look at the help tooltip.\n"); - -foreach ([ 'network', N("Network Options") ], [ 'system', N("System Options") ]) { -    my ($domain, $label) = @$_; -    my %values; -    $notebook->append_page(gtkshow(gtkpack_(Gtk2::VBox->new, -                                            0, Gtk2::Label->new($help_msg), -                                            1, create_scrolled_window(create_packtable($common_opts, -                                                                                       map { -                                                                                           my $i = $_; -                                                                                            -                                                                                           my $entry; -                                                                                           my $opt = $inv_fields{$i} || $i; -                                                                                           my $default = $msec->get_function_default($opt); -                                                                                           if (member($default, @all_choices)) { -                                                                                               $values{$i} = new_nonedit_combo(member($default, @yesno_choices) ? \@yesno_choices : if_(member($default, @alllocal_choices), \@alllocal_choices)); -                                                                                               $entry = $values{$i}->entry; -                                                                                           } else { -                                                                                               $values{$i} = new Gtk2::Entry(); -                                                                                               $entry = $values{$i}; -                                                                                           } -                                                                                           $entry->set_text(to_i18n($msec->get_function_value($opt))); -                                                                                           set_help_tip($entry, $default, $opt); -                                                                                           [ Gtk2::WrappedLabel->new($i), resize($values{$i}) ]; -                                                                                       } sort map { $fields{$_} || $_ } $msec->list_functions($domain), -                                                                                      ), -                                                                      [ 'never', 'automatic' ], -                                                                     ), -                                           ) -                                  ), -                           Gtk2::WrappedLabel->new($label)); -    $options_values{$domain} = \%values; -} -######################## PERIODIC CHECKS ################################### -my %security_checks_value; - -$notebook->append_page(gtkshow(gtkpack_(Gtk2::VBox->new, -                                        0, Gtk2::Label->new($help_msg), -                                        1, create_scrolled_window(create_packtable($common_opts, -                                                                                   map { -                                                                                       my $i = $_; -                                                                                       my $opt = $inv_fields{$i} || $i; -                                                                                       $security_checks_value{$i} = new_nonedit_combo([ 'yes', 'no', 'default' ], $msec->get_check_value($opt)); -                                                                                       my $entry = $security_checks_value{$i}->entry; -                                                                                       set_help_tip($entry, $msec->get_check_default($opt), $opt); -                                                                                       [ gtkshow(Gtk2::WrappedLabel->new($i)), resize($security_checks_value{$i}) ]; -                                                                                   } sort map { $fields{$_} || $_ } $msec->list_checks)))), -                       new Gtk2::Label(N("Periodic Checks")));  ####################### OK CANCEL BUTTONS ##################################  gtkpack_($vbox, -         1, gtkshow($notebook), +	 0, gtkshow(gtknew('VBox', spacing => 5, children => [ +			if_(!$::isEmbedded, 0, Gtk3::Banner->new('/usr/share/mcc/themes/default/drakperm-mdk.png', N("Permissions"))), +			0, gtknew('Label', text => $auth_string, alignment => [ 0.5, 0 ]) +		])), +         1, gtkshow(create_scrolled_window( +			gtknew('VBox', children => [ +			    map { +				my ($title, $progs) = @$_; +				(0, gtknew('Expander', use_markup => 1, text => mygtk3::title1_to_markup($title), child => create_packtable( +				$common_opts, +				     map { +					 [ +					     gtkshow(gtknew('Label_Left', line_wrap => 1, text => $descr{$_} || $_)), +						 $progs{$_} = new_nonedit_combo([ +						     @auth{qw(default user_passwd root_passwd no_passwd)} +						 ], +										default_auth_value($_) +										#$msec->get_check_value($opt) +									    ) +					 ]; +				     } split(' ', $progs) +				))); +			    } ( +				[ N("Software Management"), 'drakrpm drakrpm-update drakrpm-editmedia' ], +				[ N("Hardware"), 'drak3d drakx11 drakmouse drakkeyboard drakups' ], +				[ N("Network"), 'drakconnect drakhosts draknetcenter drakroam drakvpn drakproxy drakgw' ], +				[ N("System"), 'drakauth drakfont draklog drakxservices drakuser drakclock isodumper' ], +				[ N("Boot"), 'drakboot' ], +			    ) +			]))), +           0, create_okcancel(my $oc =                              { -                             cancel_clicked => sub { ugtk2->exit(0) }, +                             cancel_clicked => sub { ugtk3->exit(0) },                               ok_clicked => sub { -                                my $seclevel_value = $seclevel_entry->entry->get_text; -                                my $secadmin_check_value = $secadmin_check->get_active; -                                my $secadmin_value = $secadmin_entry->get_text; -                                my $w; - -                                log::explanations("Configuring msec"); - -                                if ($seclevel_value ne security::level::get_string()) { -                                    $w = wait_msg(N("Please wait, setting security level...")); -                                    log::explanations(qq(Setting security level to "$seclevel_value")); -                                    security::level::set(security::level::from_string($seclevel_value)); -                                    remove_wait_msg($w); +                                log::explanations("Setting up right delegation"); +                                my %rev_auth = reverse %auth; +                                foreach my $key (keys %progs) { +                                    my $value = $progs{$key}->get_text; +                                    set_auth_value($key, $rev_auth{$value});                                  } -                                $w = wait_msg(N("Please wait, setting security options...")); -                                log::explanations(qq(Setting security administrator option to ") . bool2yesno($secadmin_check_value) . '"'); -                                $msec->set_check('MAIL_WARN', bool2yesno($secadmin_check_value)); - -                                if ($secadmin_value ne $msec->get_check_value('MAIL_USER') && $secadmin_check_value) { -                                    log::explanations(qq(Setting security administrator contact to "$secadmin_value")); -                                    $msec->set_check('MAIL_USER', $secadmin_value); -                                  } - -                                log::explanations("Setting security periodic checks"); -                                foreach my $key (keys %security_checks_value) { -                                    $msec->set_check($inv_fields{$key} || $key, from_i18n($security_checks_value{$key}->entry->get_text)); -                                } -                                $msec->apply_checks; - -                                foreach my $domain (keys %options_values) { -                                    log::explanations("Setting msec functions related to $domain"); -                                    foreach my $key (keys %{$options_values{$domain}}) { -                                        my $opt = $options_values{$domain}{$key}; -                                        $msec->set_function($inv_fields{$key} || $key, from_i18n($opt->get_text)); -                                    } -                                } -                                $msec->apply_functions; -                                log::explanations("Applying msec changes"); -                                run_program::rooted($::prefix, "/usr/sbin/msec"); - +                                write_rules();                                  remove_wait_msg($w); - -                                ugtk2->exit(0); +                                ugtk3->exit(0);                              }                              }, -                            undef, undef, '', -                            [ N("Help"), sub { unless (fork()) { exec("drakhelp --id draksec") } } ], +                            undef, undef, ''                             ),          ); -$oc->{cancel}->can_default(1); + +$oc->{cancel}->set_can_default(1);  $oc->{cancel}->grab_default;  $w->main; -ugtk2->exit(0); +ugtk3->exit(0);  | 
