php IHDR w Q )Ba pHYs sRGB gAMA a IDATxMk\U s&uo,mD )Xw+e?tw.oWp;QHZnw`gaiJ9̟灙a=nl[ ʨ G;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ y H@E7j 1j+OFRg}ܫ;@Ea~ j`u'o> j- $_q?qS XzG'ay
files >> /usr/libexec/webmin/virtual-server/ |
files >> //usr/libexec/webmin/virtual-server/edit_user.cgi |
#!/usr/bin/perl # edit_user.cgi # Display a form for editing or adding a user. This can be a local user, # or a domain mailbox user require './virtual-server-lib.pl'; &ReadParse(); if ($in{'dom'}) { $d = &get_domain($in{'dom'}); &can_edit_domain($d) || &error($text{'users_ecannot'}); } else { &can_edit_local() || &error($text{'users_ecannot2'}); } &can_edit_users() || &error($text{'users_ecannot'}); $din = $d ? &domain_in($d) : undef; $tmpl = $d ? &get_template($d->{'template'}) : &get_template(0); if ($in{'new'}) { $suffix = $in{'web'} ? 'web' : ''; &ui_print_header($din, $text{'user_create'.$suffix}, ""); $user = &create_initial_user($d, undef, $in{'web'}); } else { @users = &list_domain_users($d); ($user) = grep { ($_->{'user'} eq $in{'user'} || &remove_userdom($_->{'user'}, $d) eq $in{'user'}) && $_->{'unix'} == $in{'unix'} } @users; $mailbox = $d && $d->{'user'} eq $user->{'user'} && $user->{'unix'}; $suffix = $user->{'webowner'} ? 'web' : ''; &ui_print_header($din, $text{'user_edit'.$suffix}, ""); } # FTP user in a sub-server .. check if FTP restrictions are active if ($user->{'webowner'} && $d->{'parent'} && $config{'ftp'}) { my @chroots = &list_ftp_chroots(); my ($home) = grep { $_->{'dir'} eq '~' } @chroots; if (!$home) { print "<b>$text{'user_chrootwarn'}</b><p>\n"; } } @tds = ( "width=30%", "width=70%" ); print &ui_form_start("save_user.cgi", "post"); print &ui_hidden("new", $in{'new'}); print &ui_hidden("dom", $in{'dom'}); print &ui_hidden("old", $in{'user'}); print &ui_hidden("unix", $in{'unix'}); print &ui_hidden("web", $in{'web'}); print &ui_hidden_table_start($mailbox ? $text{'user_mheader'} : $user->{'webowner'} ? $text{'user_wheader'} : $d ? $text{'user_header'} : $text{'user_lheader'}, "width=100%", 2, "table1", 1); # Show username, editable if this is not the domain owner $ulabel = $d->{'mail'} ? &hlink($text{'user_user'}, "username") : &hlink($text{'user_user2'}, "username2"); if ($mailbox) { # Domain owner print &ui_table_row($ulabel, "<tt>$user->{'user'}</tt>", 2, \@tds); $pop3 = $user->{'user'}; } else { # Regular user $pop3 = $d && !$user->{'noappend'} ? &remove_userdom($user->{'user'}, $d) : $user->{'user'}; print &ui_table_row($ulabel, &ui_textbox("mailuser", $pop3, 13). ($d ? "\@".&show_domain_name($d) : ""), 2, \@tds); print &ui_hidden("oldpop3", $pop3),"\n"; # Full username differs if ($pop3 ne $user->{'user'}) { print &ui_table_row( $d->{'mail'} ? &hlink($text{'user_imap'}, 'user_imap') : &hlink($text{'user_imapf'},'user_imapf'), "<tt>$user->{'user'}</tt>"); } # MySQL username differs if ($user->{'mysql_user'} && $user->{'mysql_user'} ne $user->{'user'}) { print &ui_table_row( &hlink($text{'user_mysqluser2'}, 'user_mysqluser2'), "<tt>$user->{'mysql_user'}</tt>"); } } # Real name - only for true Unix users or LDAP persons if ($user->{'person'}) { print &ui_table_row(&hlink($text{'user_real'}, "realname"), $mailbox ? $user->{'real'} : &ui_textbox("real", $user->{'real'}, 40), 2, \@tds); } # Password cannot be edited for domain owners (because it is the domain pass) if (!$mailbox) { $pwfield = ""; if ($in{'new'}) { $pwfield = &new_password_input("mailpass"); } else { # For an existing user, offer to change password $pwfield = &ui_opt_textbox("mailpass", undef, 13, $text{'user_passdef'}."\n". (defined($user->{'plainpass'}) ? &show_password_popup($d, $user) : ""), $text{'user_passset'}); if ($user->{'unix'} && $user->{'change'}) { local $tm = timelocal(gmtime($user->{'change'} * 60*60*24)); $pwfield .= &text('user_lastch', &make_date($tm, 1)); } } if (!$user->{'alwaysplain'}) { # Option to disable $pwfield .= "<br>" if ($pwfield !~ /\/table>/); $pwfield .= &ui_checkbox("disable", 1, $text{'user_disabled'}, $user->{'pass'} =~ /^\!/ ? 1 : 0); } print &ui_table_row(&hlink($text{'user_pass'}, "password"), $pwfield, 2, \@tds); # Password recovery field print &ui_table_row(&hlink($text{'user_recovery'}, "recovery"), &ui_opt_textbox("recovery", $user->{'recovery'}, 40, $text{'user_norecovery'}, $text{'user_gotrecovery'})); } print &ui_hidden_table_end(); $showmailquota = !$mailbox && $user->{'mailquota'}; $showquota = !$mailbox && $user->{'unix'} && !$user->{'noquota'}; $showhome = &can_mailbox_home($user) && $d && $d->{'home'} && !$mailbox && !$user->{'fixedhome'}; if ($showmailquota || $showquota || $showhome) { # Start quota and home table print &ui_hidden_table_start($text{'user_header2'}, "width=100%", 2, "table2", 0); } if ($showmailquota) { # Show Qmail/VPOPMail quota field $user->{'qquota'} = "" if ($user->{'qquota'} eq "none"); print &ui_table_row(&hlink($text{'user_qquota'},"qmailquota"), &ui_radio("qquota_def", $user->{'qquota'} ? 0 : 1, [ [ 1, $text{'form_unlimit'} ], [ 0, " " ] ])." ". &ui_textbox("qquota", $user->{'qquota'} || "", 10)." ". $text{'form_bytes'}, 2, \@tds); } if ($showquota) { # Show quotas field(s) if (&has_home_quotas()) { print &ui_table_row( &hlink($qsame ? $text{'user_umquota'} : $text{'user_uquota'}, "diskquota"), "a_field("quota", $user->{'quota'}, $user->{'uquota'}, "home", $user), 2, \@tds); } if (&has_mail_quotas()) { print &ui_table_row(&hlink($text{'user_mquota'}, "diskmquota"), "a_field("mquota", $user->{'mquota'}, $user->{'umquota'}, "mail", $user), 2, \@tds); } } if ($showhome) { # Show home directory editing field local $reshome = &resolve_links($user->{'home'}); local $helppage = "userhome"; if ($user->{'brokenhome'}) { # Home directory is in odd location, and so cannot be edited $homefield = "<tt>$user->{'home'}</tt>"; print &ui_hidden("brokenhome", 1),"\n"; } elsif ($user->{'webowner'}) { # Home can be public_html or a sub-dir local $phd = &public_html_dir($d); local $auto = $in{'new'} || $reshome eq &resolve_links($phd); $homefield = &ui_radio("home_def", $auto ? 1 : 0, [ [ 1, $text{'user_home2'} ], [ 0, $text{'user_homeunder2'} ] ])." ". &ui_textbox("home", $auto ? "" : substr($user->{'home'}, length($phd)+1), 20); $helppage = "userhomeftp"; } else { # Home is under server root, and so can be edited local $auto = $in{'new'} || $reshome eq &resolve_links("$d->{'home'}/$config{'homes_dir'}/$pop3"); $homefield = &ui_radio("home_def", $auto ? 1 : 0, [ [ 1, $text{'user_home1'} ], [ 0, &text('user_homeunder') ] ])." ". &ui_textbox("home", $auto ? "" : substr($user->{'home'}, length($d->{'home'})+1), 20); } print &ui_table_row(&hlink($text{'user_home'}, $helppage), $homefield, 2, \@tds); } if ($showmailquota || $showquota || $showhome) { print &ui_hidden_table_end("table2"); } # Start third table, for email settings $hasprimary = $d && !$user->{'noprimary'} && $d->{'mail'}; $hasmailfile = !$in{'new'} && ($user->{'email'} || @{$user->{'extraemail'}}) && !$user->{'nomailfile'}; $hasextra = !$user->{'noextra'}; $hassend = &will_send_user_email($d, $in{'new'}); $hasspam = $config{'spam'} && $hasprimary; $hasemail = $hasprimary || $hasmailfile || $hasextra || $hassend || $hasspam; if ($hasemail) { print &ui_hidden_table_start($text{'user_header2a'}, "width=100%", 2, "table2a", 0); } if ($hasprimary) { # Show primary email address field print &ui_table_row(&hlink($text{'user_mailbox'}, "mailbox"), &ui_yesno_radio("mailbox", $user->{'email'} || $in{'new'} ? 1 : 0), 2, \@tds); } if ($hasmailfile) { # Show the user's mail file local ($sz, $umf, $lastmod) = &mail_file_size($user); local $link = &read_mail_link($user, $d); if ($link) { $mffield = "<a href='$link'><tt>$umf</tt></a>\n"; } else { $mffield = "<tt>$umf</tt>\n"; } if ($lastmod) { $mffield .= "(".&text('user_lastmod', &make_date($lastmod)).")"; } if ($user->{'spam_quota'}) { $mffield .= "<br><font color=#ff0000>". &text($user->{'spam_quota_diff'} ? 'user_spamquota' : 'user_soamquota2', &nice_size($user->{'spam_quota_diff'})). "</font>\n"; } print &ui_table_row(&hlink($text{'user_mail'}, "mailfile"), $mffield, 2, \@tds); } if ($hasextra) { # Show extra email addresses print &ui_table_row(&hlink($text{'user_extra'}, "extraemail"), &ui_textarea("extra", join("\n", @{$user->{'extraemail'}}), 5, 50), 2, \@tds); } if ($in{'new'} && &will_send_user_email($d, 1)) { # Show address for confirmation email (for the mailbox itself) print &ui_table_row(&hlink($text{'user_newmail'},"newmail"), &ui_opt_textbox("newmail", undef, 40, $user->{'email'} ? $text{'user_newmail1'} : $text{'user_newmail2'}, $text{'user_newmail0'}), 2, \@tds); } elsif (!$in{'new'} && &will_send_user_email($d, 0)) { # Show option to re-send info email print &ui_table_row(&hlink($text{'user_remail'},"remail"), &ui_radio("remail_def", 1, [ [ 1, $text{'user_remail1'} ], [ 0, $text{'user_remail0'} ] ])." ". &ui_textbox("remail", $user->{'email'}, 40), 2, \@tds); } # Show spam check flag if ($hasspam) { $awl_link = undef; if (!$in{'new'} && &foreign_available("spam")) { # Create AWL link &foreign_require("spam", "spam-lib.pl"); if (defined(&spam::can_edit_awl) && &spam::supports_auto_whitelist() == 2 && &spam::get_auto_whitelist_file($user->{'user'}) && &spam::can_edit_awl($user->{'user'})) { $awl_link = " ( <a href='../spam/edit_awl.cgi?". "user=".&urlize($user->{'user'}). "'>$text{'user_awl'}</a> )"; } } print &ui_table_row(&hlink($text{'user_nospam'}, "nospam"), !$d->{'spam'} ? $text{'user_spamdis'} : &ui_radio("nospam", int($user->{'nospam'}), [ [ 0, $text{'yes'} ], [ 1, $text{'no'} ] ]). $awl_link, 2, \@tds); } # Show most recent logins if ($hasemail && !$in{'new'}) { $ll = &get_last_login_time($user->{'user'}); @grid = ( ); foreach $k (keys %$ll) { push(@grid, $text{'user_lastlogin_'.$k}, &make_date($ll->{$k})); } print &ui_table_row(&hlink($text{'user_lastlogin'}, "lastlogin"), @grid ? &ui_grid_table(\@grid, 2, 50) : $text{'user_lastlogin_never'}); } if ($hasemail) { print &ui_hidden_table_end("table2a"); } # Show forwarding setup for this user, using simple form if possible if (($user->{'email'} || $user->{'noprimary'}) && !$user->{'noalias'}) { print &ui_hidden_table_start($text{'user_header3'}, "width=100%", 2, "table3", 0); # Work out if simple mode is supported if (!@{$user->{'to'}}) { # If no forwarding, just check delivery to me as this is # the default. $simple = { 'tome' => 1 }; } else { $simple = &get_simple_alias($d, $user); } if ($simple && ($simple->{'local'} || $simple->{'bounce'})) { # Local and bounce delivery are not allowed on the simple form $simple = undef; } if ($simple) { # Show simple form print &ui_hidden("simplemode", "simple"); &show_simple_form($simple, 1, 1, 1, 1, \@tds, "user"); } else { # Show complex form print &ui_hidden("simplemode", "complex"); &alias_form($user->{'to'}, &hlink($text{'user_aliases'}, "userdest"), $d, "user", $in{'user'}, \@tds); } print &ui_hidden_table_end("table3"); } # Show user-level mail filters, if he has any @filters = ( ); $procmailrc = "$user->{'home'}/.procmailrc" if (!$in{'new'}); if (!$in{'new'} && $user->{'email'} && $user->{'unix'} && -r $procmailrc && &foreign_check("filter")) { &foreign_require("filter", "filter-lib.pl"); @filters = &filter::list_filters($procmailrc); } if (@filters) { print &ui_hidden_table_start($text{'user_header5'}, "width=100%", 2, "table5", 0); $lastalways = 0; @folders = &mailboxes::list_user_folders($user->{'user'}); @table = ( ); foreach $filter (@filters) { ($cdesc, $lastalways) = &filter::describe_condition($filter); $adesc = &filter::describe_action($filter, \@folders, $user->{'home'}); push(@table, [ $cdesc, $adesc ]); } if (!$lastalways) { push(@table, [ $filter::text{'index_calways'}, $filter::text{'index_adefault'} ]); } $ftable = &ui_columns_table( [ $text{'user_fcondition'}, $text{'user_faction'} ], 100, \@table); print &ui_table_row(undef, $ftable, 2); print &ui_hidden_table_end("table5"); } # Work out if the other permissions section has anything to display if ($d && !$mailbox) { @dbs = grep { $_->{'users'} } &domain_databases($d); } @sgroups = &allowed_secondary_groups($d); foreach $f (&list_mail_plugins()) { $anyplugins++ if (&plugin_defined($f, "mailbox_inputs")); } $anyother = &can_mailbox_ftp() && !$mailbox && $user->{'unix'} || $anyplugins || @dbs || @sgroups && $user->{'unix'}; if ($anyother) { print &ui_hidden_table_start($text{'user_header4'}, "width=100%", 2, "table4", 0, \@tds); } if (&can_mailbox_ftp() && !$mailbox && $user->{'unix'}) { # Show FTP shell field print &ui_table_row(&hlink($text{'user_ushell'}, "ushell"), &available_shells_menu("shell", $user->{'shell'}, "mailbox", 0, $user->{'webowner'}), 2, \@tds); } # Find and show all plugin features foreach $f (&list_mail_plugins()) { $input = &plugin_call($f, "mailbox_inputs", $user, $in{'new'}, $d); print $input; } # Show allowed databases if (@dbs) { @userdbs = map { [ $_->{'type'}."_".$_->{'name'}, $_->{'name'}." ($_->{'desc'})" ] } @{$user->{'dbs'}}; @alldbs = map { [ $_->{'type'}."_".$_->{'name'}, $_->{'name'}." ($_->{'desc'})" ] } @dbs; print &ui_table_row(&hlink($text{'user_dbs'},"userdbs"), &ui_multi_select("dbs", \@userdbs, \@alldbs, 5, 1, 0, $text{'user_dbsall'}, $text{'user_dbssel'}), 2, \@tds); } # Show secondary groups if (@sgroups && $user->{'unix'}) { print &ui_table_row(&hlink($text{'user_groups'},"usergroups"), &ui_select("groups", $user->{'secs'}, [ map { [ $_ ] } @sgroups ], 5, 1, 1), 2, \@tds); } if ($anyother) { print &ui_hidden_table_end("table4"); } # Work out if switching to Usermin is allowed $usermin = 0; if (&can_switch_usermin($d, $user) && $user->{'unix'} && &foreign_installed("usermin", 1)) { &foreign_require("usermin", "usermin-lib.pl"); local %uminiserv; &usermin::get_usermin_miniserv_config(\%uminiserv); if (&check_pid_file($uminiserv{'pidfile'}) && defined(&usermin::switch_to_usermin_user) && $uminiserv{'session'}) { $usermin = 1; } } # Form create/delete buttons if ($in{'new'}) { print &ui_form_end( [ [ "create", $text{'create'} ] ]); } else { print &ui_form_end( [ [ "save", $text{'save'} ], $usermin ? ( [ "switch", $text{'user_switch'}, undef, undef, "onClick='form.target = \"_blank\"'" ] ) : ( ), &will_send_user_email($d) && $user->{'email'} ? ( [ "remailbut", $text{'user_remailbut'} ] ) : ( ), $user->{'recovery'} ? ( [ "recoverybut", $text{'user_sendrecover'} ] ) : ( ), $mailbox ? ( ) : ( [ "delete", $text{'delete'} ] ) ]); } # Link back to user list and/or main menu if ($d) { if ($single_domain_mode) { &ui_print_footer( "list_users.cgi?dom=$in{'dom'}", $text{'users_return'}, "", $text{'index_return2'}); } else { &ui_print_footer( "list_users.cgi?dom=$in{'dom'}", $text{'users_return'}, &domain_footer_link($d), "", $text{'index_return'}); } } else { &ui_print_footer("", $text{'index_return'}); } # quota_field(name, value, used, filesystem, &user) sub quota_field { my ($name, $value, $used, $fs, $u) = @_; my $rv; my $color = $u->{'over_quota'} ? "#ff0000" : $u->{'warn_quota'} ? "#ff8800" : $u->{'spam_quota'} ? "#aaaaaa" : undef; if (&can_mailbox_quota()) { # Show inputs for editing quotas local $quota = $_[1]; $quota = undef if ($quota eq "none"); $rv .= &opt_quota_input($_[0], $quota, $_[3]); $rv .= "\n"; } else { # Just show current settings, or default local $q = $in{'new'} ? $defmquota[0] : $_[1]; $rv .= ($q ? "a_show($q, $_[3]) : $text{'form_unlimit'})."\n"; } if (!$in{'new'}) { my $umsg = $used ? &text('user_used', "a_show($used, $fs)) : &text('user_noneused'); if ($color) { $umsg = "<font color=$color>$umsg</font>"; } $rv .= $umsg."\n"; } return $rv; }y~or5J={Eeu磝Qk ᯘG{?+]ן?wM3X^歌>{7پK>on\jy Rg/=fOroNVv~Y+ NGuÝHWyw[eQʨSb> >}Gmx[o[<{Ϯ_qFvM IENDB`