From cf81ebb3d1e37162a830145b3c04dffa5f35997b Mon Sep 17 00:00:00 2001 From: Jamie Cameron Date: Sat, 24 Nov 2007 06:24:48 +0000 Subject: [PATCH] Partially complete UI re-write and support for includes --- pam/edit_inc.cgi | 55 ++++++++++++++++++ pam/edit_mod.cgi | 79 +++++++++++++------------- pam/edit_pam.cgi | 141 +++++++++++++++++++++++++---------------------- pam/lang/en | 21 ++++++- pam/save_inc.cgi | 45 +++++++++++++++ 5 files changed, 236 insertions(+), 105 deletions(-) create mode 100644 pam/edit_inc.cgi create mode 100755 pam/save_inc.cgi diff --git a/pam/edit_inc.cgi b/pam/edit_inc.cgi new file mode 100644 index 000000000..4f3fa3041 --- /dev/null +++ b/pam/edit_inc.cgi @@ -0,0 +1,55 @@ +#!/usr/local/bin/perl +# Edit a PAM include for some service + +require './pam-lib.pl'; +&ReadParse(); + +@pam = &get_pam_config(); +$pam = $pam[$in{'idx'}]; +if ($in{'midx'} ne '') { + $mod = $pam->{'mods'}->[$in{'midx'}]; + $inc = $mod->{'module'}; + $type = $mod->{'type'}; + &ui_print_header(undef, $text{'inc_edit'}, ""); + } +else { + &ui_print_header(undef, $text{'inc_create'}, ""); + $type = $in{'type'}; + } + + +print &ui_form_start("save_mod.cgi"); +print &ui_hidden("idx", $in{'idx'}); +print &ui_hidden("midx", $in{'midx'}); +print &ui_hidden("_type", $in{'type'}); +print &ui_table_start($text{'inc_header'}, undef, 2, [ "width=30%" ]); + +# PAM service name +$t = $text{'desc_'.$pam->{'name'}}; +print &ui_table_row($text{'mod_name'}, + "".&html_escape($pam->{'name'})." ". + ($pam->{'desc'} ? "($pam->{'desc'})" : $t ? "($t)" : "")); + +# Authentication step +print &ui_table_row($text{'mod_type'}, + $text{'mod_type_'.$type}); + +# Included service +print &ui_table_row($text{'inc_inc'}, + &ui_select("inc", $inc, + [ map { [ $_->{'name'}, $text{'desc_'.$_->{'name'}} || $_->{'name'} ] } + @pam ], 1, 0, $inc ? 1 : 0)); + +print &ui_table_end(); + +if ($in{'midx'} ne '') { + print &ui_form_end([ [ undef, $text{'save'} ], + [ 'delete', $text{'delete'} ] ]); + } +else { + print &ui_form_end([ [ undef, $text{'create'} ] ]); + } + +&ui_print_footer("edit_pam.cgi?idx=$in{'idx'}", $text{'edit_return'}, + "", $text{'index_return'}); + diff --git a/pam/edit_mod.cgi b/pam/edit_mod.cgi index b86068030..038dad184 100755 --- a/pam/edit_mod.cgi +++ b/pam/edit_mod.cgi @@ -4,6 +4,12 @@ require './pam-lib.pl'; &ReadParse(); +if ($in{'inc'}) { + # Redirect to include form + &redirect("edit_inc.cgi?idx=$in{'idx'}&type=$in{'type'}"); + return; + } + @pam = &get_pam_config(); $pam = $pam[$in{'idx'}]; if ($in{'midx'} ne '') { @@ -20,42 +26,39 @@ else { } -print "
\n"; -print "\n"; -print "\n"; -print "\n"; -print "\n"; +print &ui_form_start("save_mod.cgi"); +print &ui_hidden("idx", $in{'idx'}); +print &ui_hidden("midx", $in{'midx'}); +print &ui_hidden("_module", $in{'module'}); +print &ui_hidden("_type", $in{'type'}); +print &ui_table_start($text{'mod_header'}, undef, 4); -print "\n"; -print "\n"; -print "
$text{'mod_header'}
\n"; - -print "\n"; +# PAM service name $t = $text{'desc_'.$pam->{'name'}}; -print "\n"; +print &ui_table_row($text{'mod_name'}, + "".&html_escape($pam->{'name'})." ". + ($pam->{'desc'} ? "($pam->{'desc'})" : $t ? "($t)" : "")); -print "\n"; +# PAM module name $t = $text{$module}; -print "\n"; +print &ui_table_row($text{'mod_mod'}, + "$module ".($t ? "($t)" : "")); -print "\n"; -print "\n"; +print &ui_table_row($text{'mod_type'}, + $text{'mod_type_'.$type}); -print "\n"; -print "\n"; +# Control mode +print &ui_table_row($text{'mod_control'}, + &ui_select("control", $mod->{'control'}, + [ map { [ $_, $text{'control_'.$_}." (". + $text{'control_desc_'.$_}.")" ] } + ('required', 'requisite', 'sufficient', 'optional') ], + 1, 0, $in{'midx'} eq '' ? 0 : 1)); if (-r "./$module.pl") { do "./$module.pl"; if (!$module_has_no_args) { - print "\n"; + print &ui_table_hr(); foreach $a (split(/\s+/, $mod->{'args'})) { if ($a =~ /^([^\s=]+)=(\S*)$/) { $args{$1} = $2; @@ -68,22 +71,22 @@ if (-r "./$module.pl") { } } else { - print "\n"; - print "\n"; - print "\n"; + # Text-only args + print &ui_table_hr(); + print &ui_table_row($text{'mod_args'}, + &ui_textbox("args", $mod->{'args'}, 60), 3); } -print "
$text{'mod_name'}",&html_escape($pam->{'name'})," ", - $pam->{'desc'} ? "($pam->{'desc'})" : - $t ? "($t)" : "","$text{'mod_mod'}$module ",$t ? "($t)" : "","
$text{'mod_type'}",$text{'mod_type_'.$type},"$text{'mod_control'}


$text{'mod_args'}
\n"; -print "\n"; -print "\n"; +print &ui_table_end(); + if ($in{'midx'} ne '') { - print "\n"; + print &ui_form_end([ [ undef, $text{'save'} ], + [ 'delete', $text{'delete'} ] ]); + } +else { + print &ui_form_end([ [ undef, $text{'create'} ] ]); } -print "
\n"; -print "
\n"; &ui_print_footer("edit_pam.cgi?idx=$in{'idx'}", $text{'edit_return'}, - "", $text{'index_return'}); + "", $text{'index_return'}); diff --git a/pam/edit_pam.cgi b/pam/edit_pam.cgi index 24d37f266..ef2f005cb 100755 --- a/pam/edit_pam.cgi +++ b/pam/edit_pam.cgi @@ -9,82 +9,91 @@ require './pam-lib.pl'; @pams = &get_pam_config(); $pam = $pams[$in{'idx'}]; -print "\n"; -print "\n"; -print "
$text{'edit_header'}
\n"; +print &ui_table_start($text{'edit_header'}, "width=100%", 2); -print "\n"; $t = $text{'desc_'.$pam->{'name'}}; -print "\n"; -print "\n"; +print &ui_table_row($text{'edit_name'}, + "".&html_escape($pam->{'name'})." ". + ($pam->{'desc'} ? "($pam->{'desc'})" : $t ? "($t)" : "")); foreach $t ('auth', 'account', 'session', 'password') { - print "\n"; - } -print "\n"; -print "
$text{'edit_name'}",&html_escape($pam->{'name'})," ", - $pam->{'desc'} ? "($pam->{'desc'})" : - $t ? "($t)" : "","
\n"; - print "
\n"; - print "\n"; - print "\n"; - print "
",$text{"edit_header_$t"},"
\n"; - + my $ptable; + $ptable .= &ui_form_start("edit_mod.cgi"); local @mods = grep { $_->{'type'} eq $t } @{$pam->{'mods'}}; - print "\n"; if (@mods) { - print " ", - " ", - " ", - " ", - "\n"; + @tds = ( "width=20%", "width=35%", "width=20%", + "width=20%", "width=5%" ); + $ptable .= &ui_columns_start([ $text{'edit_mod'}, + $text{'edit_desc'}, + $text{'edit_control'}, + $text{'edit_args'}, + $text{'edit_move'} ], \@tds); + foreach $m (@mods) { + local $mn = $m->{'module'}; + $mn =~ s/^.*\///; + local @cols; + if ($m->{'control'} eq 'include') { + # Including some other file + push(@cols, "{'index'}'>". + &text('edit_inc', "$mn").""); + @rtds = ( "colspan=4", "width=5%" ); + } + else { + # Regular PAM module + push(@cols, "{'index'}'>". + "$mn"); + push(@cols, $text{$mn}); + push(@cols, $text{'control_'.$m->{'control'}}); + push(@cols, $m->{'args'}); + @rtds = @tds; + } + local $mv; + if ($m eq $mods[$#mods]) { + $mv .= ""; + } + else { + $mv .= "{'index'}&down=1'>"; + } + if ($m eq $mods[0]) { + $mv .= ""; + } + else { + $mv .= "{'index'}&up=1'>"; + } + push(@cols, $mv); + $ptable .= &ui_columns_row(\@cols, \@rtds); + } + $ptable .= &ui_columns_end(); } else { - print "\n"; + $ptable .= "$text{'edit_none'}

\n"; } - foreach $m (@mods) { - local $mn = $m->{'module'}; - $mn =~ s/^.*\///; - print "

\n"; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - } - print "
$text{'edit_mod'}$text{'edit_desc'}$text{'edit_control'}$text{'edit_args'}$text{'edit_move'}
$text{'edit_none'}", - "
{'index'}'>$mn",$text{$mn} ? $text{$mn} : "
","
",$text{'control_'.$m->{'control'}},"",$m->{'args'} ? $m->{'args'} : "
","
"; - if ($m eq $mods[$#mods]) { - print ""; - } - else { - print "{'index'}&down=1'>"; - } - if ($m eq $mods[0]) { - print ""; - } - else { - print "{'index'}&up=1'>"; - } - print "
\n"; - print "\n"; - print "\n"; - print "\n"; - print "
\n"; -print "\n"; -print "\n"; -print "\n"; + # Form to add module + $ptable .= &ui_hidden("idx", $in{'idx'}); + $ptable .= &ui_hidden("type", $t); + $ptable .= &ui_submit($text{'edit_addmod'}),"\n"; + $ptable .= &ui_select("module", undef, + [ map { [ $_, $text{$_} ? "$_ ($text{$_})" : $_ ] } + &list_modules() ]); + $ptable .= " "; + $ptable .= &ui_submit($text{'edit_addinc'}, "inc"); + $ptable .= &ui_form_end(); + + print &ui_table_row($text{"edit_header_$t"}, $ptable); + } +print &ui_table_end(); + +# Delete whole service form +print &ui_form_start("delete_pam.cgi"); +print &ui_hidden("idx", $in{'idx'}); +print &ui_form_end([ [ undef, $text{'edit_delete'} ] ]); &ui_print_footer("", $text{'index_return'}); diff --git a/pam/lang/en b/pam/lang/en index 035c345e7..971012e9f 100644 --- a/pam/lang/en +++ b/pam/lang/en @@ -6,6 +6,7 @@ index_return=service list index_none=No PAM configuration files were found on your system in the directory $1. Maybe PAM is not supported, or your module configuration is incorrect. desc_su=Switch user +desc_su-l=Switch user (with login) desc_login=Local or remote login desc_samba=Samba Windows file server desc_imap=IMAP mail server @@ -69,6 +70,17 @@ desc_proftpd=ProFTPd file transfer server desc_qpopper=$desc_qpop desc_dovecot=POP / IMAP mail server desc_cron=Scheduled commands daemon +desc_runuser=Run command as user +desc_runuser-l=Run command as user (with login) +desc_postgresql=PostgreSQL database +desc_crond=Cron daemon +desc_smtp=SMTP authentication +desc_smtp.postfix=Postfix SMTP authentication +desc_smtp.sendmail=Sendmail SMTP authentication +desc_config-util=Configuration utilities +desc_newrole=SELinux new role +desc_radius=RADIUS dialup login +desc_pptpconfig=Point-to-point tunneling protocol edit_title=Edit PAM Service edit_header=PAM service details @@ -81,11 +93,13 @@ edit_mod=PAM module edit_desc=Description edit_args=Parameters edit_addmod=Add step for: +edit_addinc=Add included service edit_control=Failure level -edit_none=No PAM modules specified for this step +edit_none=No PAM modules specified for this step. edit_delete=Delete PAM service edit_move=Move edit_return=PAM service +edit_inc=Include service $1 pam_pwdb.so=Unix password authentication pam_securetty.so=Secure TTY check for root @@ -248,3 +262,8 @@ log_mod_delete=Deleted PAM module $1 in service $2 log_mod_move=Swapped PAM modules in service $3 log_mod_move_l=Swapped PAM modules $1 and $2 in service $3 +inc_edit=Edit Included Service +inc_create=Create Included Service +inc_header=Included PAM service details +inc_inc=Included PAM service + diff --git a/pam/save_inc.cgi b/pam/save_inc.cgi new file mode 100755 index 000000000..b919e7a89 --- /dev/null +++ b/pam/save_inc.cgi @@ -0,0 +1,45 @@ +#!/usr/local/bin/perl +# Update an include for a service + +require './pam-lib.pl'; +&ReadParse(); +&error_setup($text{'inc_err'}); +@pam = &get_pam_config(); +$pam = $pam[$in{'idx'}]; + +&lock_file($pam->{'file'}); +if ($in{'delete'}) { + # Deleting an include + $mod = $pam->{'mods'}->[$in{'midx'}]; + &delete_module($pam->{'name'}, $mod); + } +else { + if ($in{'_module'}) { + # Adding a new include + $mod = { 'type' => $in{'_type'}, + 'module' => $in{'_module'} }; + $module = $in{'_module'}; + } + else { + # Existing module entry + # XXX + $mod = $pam->{'mods'}->[$in{'midx'}]; + $module = $mod->{'module'}; + $module =~ s/^.*\///; + } + + if ($in{'_module'}) { + # Add the PAM include entry + &create_module($pam->{'name'}, $mod); + } + else { + # Update the existing include + &modify_module($pam->{'name'}, $mod); + } + } +&unlock_file($pam->{'file'}); +&webmin_log($in{'delete'} ? "delete" : $in{'_module'} ? "create" : "modify", + "inc", $pam->{'name'}, $mod); +&redirect("edit_pam.cgi?idx=$in{'idx'}"); + +