!c99Shell v. 1.0 pre-release build #16!

Software: Apache/2.2.3 (CentOS). PHP/5.1.6 

uname -a: Linux mx-ll-110-164-51-230.static.3bb.co.th 2.6.18-194.el5PAE #1 SMP Fri Apr 2 15:37:44
EDT 2010 i686
 

uid=48(apache) gid=48(apache) groups=48(apache) 

Safe-mode: OFF (not secure)

/usr/libexec/webmin/proftpd/   drwxr-xr-x
Free 53.79 GB of 127.8 GB (42.09%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     mod_core.pl (41.27 KB)      -rwxr-xr-x
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
# mod_core.pl
# Core proftpd directives

# mod_core_directives(version)
# Returns a directive structure, like the one user by Apache. Types are :
#    0 - Networking
#    1 - Logging
#    2 - Files
#    3 - Access control
#    4 - Misc
#    5 - User and Group
#    6 - Authentication
sub mod_core_directives
{
local $rv = [
    [ 'AccessDenyMsg', 0, 3, 'virtual anon global', 1.202 ],
    [ 'AccessGrantMsg', 0, 3, 'virtual anon global', 0.99 ],
    [ 'Allow Deny Order', 1, 3, 'limit', 0.99 ],
    [ 'AllowAll DenyAll', 0, 3, 'directory anon limit ftpaccess', 0.99 ],
    [ 'AllowFilter', 0, 3, 'virtual anon global', 1.20 ],
    [ 'AllowForeignAddress', 0, 0, 'virtual anon global', 1.17 ],
    [ 'AllowGroup', 1, 3, 'limit', 1.11 ],
    [ 'AllowOverwrite', 0, 3, 'virtual anon directory ftpaccess global', 0.99 ],
    [ 'AllowUser', 1, 3, 'limit', 1.17 ],
    [ 'AllowRetrieveRestart', 0, 0, 'virtual anon directory global ftpaccess', 0.99 ],
    [ 'AllowStoreRestart', 0, 0, 'virtual anon directory global ftpaccess', 0.99 ],
    [ 'AnonRequirePassword', 0, 6, 'anon', 0.99 ],
    [ 'AnonymousGroup', 0, 6, 'virtual global', 1.13 ],
    [ 'AuthAliasOnly', 0, 6, 'virtual anon global', 1.13 ],
    [ 'AuthUsingAlias', 0, 6, 'anon', 1.20 ],
    [ 'Bind', 0, 0, 'virtual', '1.16-1.27' ],
    [ 'DefaultAddress', 0, 0, 'virtual', '1.27' ],
    [ 'CDPath', 1, 2, 'virtual anon global', 1.20 ],
    [ 'Class Classes', 1, 3, 'virtual', 1.20 ],
    [ 'CommandBufferSize', 0, 0, 'virtual global', 1.20 ],
    [ 'DefaultServer', 0, 0, 'virtual', undef, 0.99, 8 ],
    [ 'DefaultTransferMode', 0, 0, 'virtual global', 1.20 ],
    [ 'DeferWelcome', 0, 0, 'virtual global', 0.99 ],
    [ 'DeleteAbortedStores', 0, 2, 'virtual directory anon global ftpaccess', 1.20 ],
    [ 'DenyFilter', 0, 3, 'virtual anon global', 1.20 ],
    [ 'DenyGroup', 1, 3, 'limit', 1.11 ],
    [ 'DenyUser', 1, 3, 'limit', 1.17 ],
    [ 'DisplayConnect', 0, 6, 'virtual global', 1.20 ],
    [ 'DisplayFirstChdir', 0, 2, 'virtual anon directory global', '0.99-1.31' ],
    [ 'DisplayChdir', 0, 2, 'virtual anon directory global', 1.31 ],
    [ 'DisplayGoAway', 0, 6, 'virtual anon global', 1.20 ],
    [ 'DisplayLogin', 0, 6, 'virtual anon global', 0.99 ],
    [ 'DisplayQuit', 0, 6, 'virtual anon global', 1.20 ],
    [ 'Group', 0, 5, 'virtual anon', undef, 0.99, 9 ],
    [ 'GroupOwner', 0, 5, 'anon directory ftpaccess', 0.99 ],
    [ 'GroupPassword', 1, 6, 'virtual anon global', 0.99 ],
    [ 'HiddenStor', 0, 2, 'virtual anon directory global', '1.20-1.31' ],
    [ 'HiddenStores', 0, 2, 'virtual anon directory global', 1.31 ],
    [ 'HideGroup', 1, 2, 'directory anon', 0.99 ],
    [ 'HideNoAccess', 0, 2, 'directory anon', 0.99 ],
    [ 'HideUser', 1, 2, 'directory anon', 0.99 ],
    [ 'IdentLookups', 0, 0, 'virtual global', 1.15 ],
    [ 'IgnoreHidden', 0, 2, 'limit', 0.99 ],
    [ 'MasqueradeAddress', 0, 0, 'virtual', 1.202 ],
    [ 'MaxClients', 0, 0, 'virtual anon global', 0.99 ],
    [ 'MaxClientsPerHost', 0, 0, 'virtual anon global', 1.17 ],
#    [ 'MaxClientsPerUser', 0, 0, 'virtual anon global', 1.20 ],
    [ 'MaxInstances', 0, 0, 'root', undef, 1.16, 8 ],
    [ 'MaxLoginAttempts', 0, 6, 'virtual global', 0.99 ],
    [ 'MultilineRFC2228', 0, 0, 'root', 1.20 ],
    [ 'PassivePorts', 0, 0, 'virtual global', 1.20 ],
    [ 'PathAllowFilter', 0, 2, 'virtual anon global', 1.17 ],
    [ 'PathDenyFilter', 0, 2, 'virtual anon global', 1.17 ],
    [ 'PidFile', 0, 4, 'root', 1.20 ],
    [ 'Port', 0, 0, 'virtual', 0.99 ],
    [ 'RequireValidShell', 0, 6, 'virtual anon global', 0.99 ],
    [ 'RLimitCPU', 0, 4, 'root', 1.202 ],
    [ 'RLimitMemory', 0, 4, 'root', 1.202 ],
    [ 'RLimitOpenFiles', 0, 4, 'root', 1.202 ],
    [ 'ScoreboardPath', 0, 4, 'root', 1.16 ],
    [ 'ServerAdmin', 0, 4, 'virtual', 0.99 ],
    [ 'ServerIdent', 0, 0, 'virtual global', 1.20 ],
    [ 'ServerName', 0, 4, 'virtual', undef, 0.99, 11 ],
    [ 'ServerType', 0, 0, 'root', undef, 0.99, 10 ],
    [ 'ShowSymlinks', 0, 2, 'virtual anon global', 0.99 ],
    [ 'SocketBindTight', 0, 0, 'root', 0.99 ],
    [ 'SyslogFacility', 0, 1, 'root', 1.16 ],
    [ 'SyslogLevel', 0, 1, 'virtual anon global', 1.20 ],
    [ 'tcpBackLog', 0, 0, 'root', 0.99 ],
    [ 'tcpNoDelay', 0, 0, 'virtual global', 1.20 ],
    [ 'tcpReceiveWindow', 0, 0, 'virtual', 0.99 ],
    [ 'tcpSendWindow', 0, 0, 'virtual', 0.99 ],
    [ 'TimesGMT', 0, 4, 'root', 1.20 ],
    [ 'TimeoutIdle', 0, 0, 'root', 0.99 ],
    [ 'TimeoutLogin', 0, 0, 'root', 0.99 ],
    [ 'TimeoutNoTransfer', 0, 0, 'root', 0.99 ],
    [ 'TimeoutStalled', 0, 0, 'root', 1.16 ],
    [ 'TransferLog', 0, 1, 'virtual anon global', undef, 1.14, 10 ],
    [ 'Umask', 0, 2, 'virtual directory ftpaccess', undef, 0.99, 3 ],
    [ 'UseFtpUsers', 0, 6, 'virtual anon global', 0.99 ],
    [ 'UseHostsAllowFile', 0, 3, 'virtual anon', 1.20 ],
    [ 'UseHostsDenyFile', 0, 3, 'virtual anon', 1.20 ],
    [ 'UseReverseDNS', 0, 0, 'root', 1.17 ],
    [ 'User', 0, 5, 'virtual anon', undef, 0.99, 10 ],
    [ 'UserDirRoot', 0, 2, 'anon', 1.20 ],
    [ 'UserAlias', 1, 6, 'virtual anon global', 0.99 ],
    [ 'UserOwner', 0, 5, 'anon directory', 1.20 ],
    [ 'UserPassword', 1, 6, 'virtual anon global', 0.99 ],
    [ 'WtmpLog', 0, 4, 'virtual anon global', 1.17 ],
    ];
return &make_directives($rv, $_[0], "mod_core");
}

sub edit_AccessDenyMsg
{
return (1, $text{'mod_core_accessdeny'},
    &opt_input($_[0]->{'words'}->[0], "AccessDenyMsg", $text{'default'}, 20));
}
sub save_AccessDenyMsg
{
return &parse_opt("AccessDenyMsg");
}

sub edit_AccessGrantMsg
{
return (1, $text{'mod_core_accessgrant'},
    &opt_input($_[0]->{'words'}->[0], "AccessGrantMsg", $text{'default'}, 20));
}
sub save_AccessGrantMsg
{
return &parse_opt("AccessGrantMsg");
}

sub edit_Allow_Deny_Order
{
local (@type, @what, @mode, $i);
foreach $d (@{$_[0]}, @{$_[1]}) {
    local @w = @{$d->{'words'}};
    shift(@w) if (lc($w[0]) eq 'from');
    for($i=0; $i<@w; $i++) {
        push(@type, lc($d->{'name'}) eq "allow" ? 1 : 2);
        push(@what, $w[$i] eq 'all' || $w[$i] eq 'none' ? undef
                                : $w[$i]);
        if ($w[$i] eq 'all') { push(@mode, 0); }
        elsif ($w[$i] eq 'none') { push(@mode, 1); }
        elsif ($w[$i] =~ /^\d+\.\d+\.\d+\.\d+$/) { push(@mode, 2); }
        elsif ($w[$i] =~ /^[0-9\.\/]+$/) { push(@mode, 3); }
        else { push(@mode, 4); }
        }
    }
push(@type, ""); push(@what, ""); push(@mode, 0);
$rv = "<i>$text{'mod_core_order'}</i>\n".
      &choice_input($_[2]->[0]->{'value'}, "order", "",
                  "$text{'mod_core_denyallow'},deny,allow", 
                  "$text{'mod_core_allowdeny'},allow,deny", 
                  "$text{'default'},")."<br>\n";
$rv .= "<table border>\n".
       "<tr $tb> <td><b>$text{'mod_core_action'}</b></td> ".
       "<td><b>$text{'mod_core_cond'}</b></td> </tr>\n";
@sels = map { $text{"mod_core_mode_$_"}.','.$_ } (0 .. 4);
for($i=0; $i<@type; $i++) {
    $rv .= "<tr $cb> <td>".&select_input($type[$i], "allow_type_$i", "0",
        "&nbsp;,0", "$text{'mod_core_allow'},1",
        "$text{'mod_core_deny'},2")."</td>\n";
    $rv .= "<td>".&select_input($mode[$i], "allow_mode_$i", "0", @sels);
    $rv .= sprintf "<input name=allow_what_$i size=20 value=\"%s\"></td>\n",
         $mode[$i] ? $what[$i] : "";
    $rv .= "</tr>\n";
    }
$rv .= "</table>\n";
return (2, $text{'mod_core_allow_deny'}, $rv);
}
sub save_Allow_Deny_Order
{
local ($i, $type, $mode, $what, @allow, @deny);
for($i=0; defined($type = $in{"allow_type_$i"}); $i++) {
    $mode = $in{"allow_mode_$i"}; $what = $in{"allow_what_$i"};
    next if (!$type);
    if ($mode == 0) { $what = "all"; }
    elsif ($mode == 1) { $what = "none"; }
    elsif ($mode == 2) {
        &check_ipaddress($what) || &check_ip6address($what) ||
            &error(&text('mod_core_eip', $what));
        }
    elsif ($mode == 3) {
        $what =~ /^[0-9\.]+\.$/ ||
            $what =~ /^([0-9\.]+)\/\d+$/ && &check_ipaddress("$1") ||
            $what =~ /^([a-f0-9:]+)\/\d+$/ && &check_ip6address("$1") ||
            &error(&text('mod_core_enet', $what));
        }
    elsif ($mode == 4) {
        $what =~ /^[A-Za-z0-9\.\-]+$/ ||
            &error(&text('mod_core_ehost', $what));
        }
    if ($type == 1) { push(@allow, $what); }
    else { push(@deny, $what); }
    }
return ( \@allow, \@deny, &parse_choice("order", ""));
}

sub edit_AllowAll_DenyAll
{
#local $a = @{$_[0]}, $d = @{$_[1]};
local $a = $_[0], $d = $_[1];
local $rv = sprintf "<input type=radio name=AllowAll value=0 %s> %s\n",
    $a || $d ? "" : "checked", $text{'mod_core_addefault'};
$rv .= sprintf "<input type=radio name=AllowAll value=1 %s> %s\n",
    $a ? "checked" : "", $text{'mod_core_allowall'};
$rv .= sprintf "<input type=radio name=AllowAll value=2 %s> %s\n",
    $d ? "checked" : "", $text{'mod_core_denyall'};
return (1, $text{'mod_core_adall'}, $rv);
}
sub save_AllowAll_DenyAll
{
return $in{'AllowAll'} == 0 ? ( [ ], [ ] ) :
       $in{'AllowAll'} == 1 ? ( [ "" ], [ ] ) : ( [ ], [ "" ] );
}

sub edit_AllowFilter
{
return (1, $text{'mod_core_filter'},
    &opt_input($_[0]->{'value'}, "AllowFilter", $text{'default'}, 15));
}
sub save_AllowFilter
{
return &parse_opt("AllowFilter");
}

sub edit_AllowForeignAddress
{
return (1, $text{'mod_core_foreign'},
    &choice_input($_[0]->{'value'}, "AllowForeignAddress", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_AllowForeignAddress
{
return &parse_choice("AllowForeignAddress", "");
}

sub edit_AllowGroup
{
local $v = @{$_[0]} ? join(" ", (map { $_->{'value'} } @{$_[0]})) : undef;
return (2, $text{'mod_core_agroup'},
    &opt_input($v, "AllowGroup", $text{'mod_core_all'}, 50));
}
sub save_AllowGroup
{
return ( $in{'AllowGroup_def'} ? [ ] : [ split(/\s+/, $in{'AllowGroup'}) ] );
}

sub edit_AllowOverwrite
{
return (1, $text{'mod_core_overwrite'},
    &choice_input($_[0]->{'value'}, "AllowOverwrite", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_AllowOverwrite
{
return &parse_choice("AllowOverwrite", "");
}

sub edit_AllowRetrieveRestart
{
return (1, $text{'mod_core_restart'},
    &choice_input($_[0]->{'value'}, "AllowRetrieveRestart", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_AllowRetrieveRestart
{
return &parse_choice("AllowRetrieveRestart", "");
}

sub edit_AllowStoreRestart
{
return (1, $text{'mod_core_restart2'},
    &choice_input($_[0]->{'value'}, "AllowStoreRestart", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_AllowStoreRestart
{
return &parse_choice("AllowStoreRestart", "");
}

sub edit_AllowUser
{
local $v = @{$_[0]} ? join(" ", (map { $_->{'value'} } @{$_[0]})) : undef;
return (2, $text{'mod_core_auser'},
    &opt_input($v, "AllowUser", $text{'mod_core_all'}, 50));
}
sub save_AllowUser
{
return ( $in{'AllowUser_def'} ? [ ] : [ split(/\s+/, $in{'AllowUser'}) ] );
}

sub edit_AnonRequirePassword
{
return (1, $text{'mod_core_require'},
    &choice_input($_[0]->{'value'}, "AnonRequirePassword", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_AnonRequirePassword
{
return &parse_choice("AnonRequirePassword", "");
}

sub edit_AnonymousGroup
{
return (2, $text{'mod_core_anongroup'},
    &opt_input($_[0]->{'value'}, "AnonymousGroup", $text{'default'}, 50));
    
}
sub save_AnonymousGroup
{
return &parse_opt("AnonymousGroup", '\S', $text{'mod_core_eanongroup'});
}

sub edit_AuthAliasOnly
{
return (1, $text{'mod_core_authalias'},
    &choice_input($_[0]->{'value'}, "AuthAliasOnly", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_AuthAliasOnly
{
return &parse_choice("AuthAliasOnly", "");
}

sub edit_AuthUsingAlias
{
return (1, $text{'mod_core_authusingalias'},
    &choice_input($_[0]->{'value'}, "AuthUsingAlias", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_AuthUsingAlias
{
return &parse_choice("AuthUsingAlias", "");
}

sub edit_Bind
{
return (1, $text{'mod_core_bind'},
    &opt_input($_[0]->{'value'}, "Bind", $text{'mod_core_bind_all'}, 15));
}
sub save_Bind
{
return &parse_opt("Bind", '^(\d+)\.(\d+)\.(\d+)\.(\d+)|([0-9:]+)$',
          $text{'mod_core_ebind'});
}

sub edit_DefaultAddress
{
return (1, $text{'mod_core_bind'},
    &opt_input($_[0]->{'value'}, "DefaultAddress", $text{'mod_core_bind_all'}, 15));
}
sub save_DefaultAddress
{
$in{'DefaultAddress_def'} || &to_ipaddress($in{'DefaultAddress'}) ||
    &to_ip6address($in{'DefaultAddress'}) ||
    &error(text{'mod_core_ebind'});
return &parse_opt("DefaultAddress", '^\S+$',
          $text{'mod_core_ebind'});
}

sub edit_CDPath
{
local $rv = "<textarea rows=3 cols=50 name=CDPath>";
foreach $p (@{$_[0]}) {
    $rv .= "$p->{'value'}\n";
    }
$rv .= "</textarea>\n";
return (2, $text{'mod_core_cdpath'}, $rv);
}
sub save_CDPath
{
$in{'CDPath'} =~ s/\r//g;
return ( [ split(/\s+/, $in{'CDPath'}) ] );
}

sub edit_Class_Classes
{
local $rv = $text{'mod_core_classes'}.
        &choice_input($_[1]->[0]->{'value'}, "Classes", "",
                  "$text{'yes'},on", "$text{'no'},off",
                    "$text{'default'},")."<br>\n";
$rv .= "<table border>\n".
       "<tr $tb> <td><b>$text{'mod_core_cname'}</b></td> ".
       "<td><b>$text{'mod_core_ctype'}</b></td> </tr>\n";
local $i = 0;
foreach $c (@{$_[0]}, { }) {
    local @w = @{$c->{'words'}};
    $rv .= "<tr $cb>\n";
    $rv .= "<td><input name=Class_n_$i size=10 value='$w[0]'></td>\n";
    $rv .= "<td><select name=Class_t_$i>\n";
    $rv .= sprintf "<option value=limit %s>%s\n",
        $w[1] eq 'limit' ? 'selected' : '', $text{'mod_core_climit'};
    $rv .= sprintf "<option value=regex %s>%s\n",
        $w[1] eq 'regex' ? 'selected' : '', $text{'mod_core_cregex'};
    $rv .= sprintf "<option value=ip %s>%s\n",
        $w[1] eq 'ip' ? 'selected' : '', $text{'mod_core_cip'};
    $rv .= "</select>\n";
    $rv .= "<input name=Class_v_$i size=20 value='$w[2]'></td>\n";
    $rv .= "</tr>\n";
    $i++;
    }
$rv .= "</table>\n";
return (2, $text{'mod_core_cls'}, $rv);
}
sub save_Class_Classes
{
local ($i, @rv);
for($i=0; defined($in{"Class_n_$i"}); $i++) {
    next if (!$in{"Class_n_$i"});
    $in{"Class_t_$i"} ne 'limit' ||
        $in{"Class_v_$i"} =~ /^\d+$/ ||
            &error($text{'mod_core_eclimit'});
    $in{"Class_t_$i"} ne 'regex' ||
        $in{"Class_v_$i"} =~ /\S/ ||
            &error($text{'mod_core_ecregex'});
    $in{"Class_t_$i"} ne 'ip' ||
        $in{"Class_v_$i"} =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)$/ ||
            &error($text{'mod_core_ecip'});
    push(@rv, join(" ", $in{"Class_n_$i"}, $in{"Class_t_$i"},
                $in{"Class_v_$i"}));
    }
return ( \@rv, $in{'Classes'} eq 'on' ? [ 'on' ] :
           $in{'Classes'} eq 'off' ? [ 'off' ] : [ ] );
}

sub edit_CommandBufferSize
{
return (1, $text{'mod_core_buffer'},
    &opt_input($_[0]->{'value'}, "CommandBufferSize", $text{'default'}, 5));
}
sub save_CommandBufferSize
{
return &parse_opt("CommandBufferSize", '^\d+$', $text{'mod_core_ebuffer'});
}

sub edit_DefaultServer
{
return (1, $text{'mod_core_defaultserver'},
    &choice_input($_[0]->{'value'}, "DefaultServer", "off",
              "$text{'yes'},on",
              "$text{'no'},off"));
}
sub save_DefaultServer
{
return &parse_choice("DefaultServer", "off");
}

sub edit_DefaultTransferMode
{
return (1, $text{'mod_core_transfer'},
    &select_input($_[0]->{'value'}, "DefaultTransferMode", "",
              "$text{'mod_core_ascii'},ascii",
              "$text{'mod_core_binary'},binary",
              "$text{'default'},"));
}
sub save_DefaultTransferMode
{
return &parse_choice("DefaultTransferMode", "");
}

sub edit_DeferWelcome
{
return (1, $text{'mod_core_defer'},
    &choice_input($_[0]->{'value'}, "DeferWelcome", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_DeferWelcome
{
return &parse_choice("DeferWelcome", "");
}

sub edit_DeleteAbortedStores
{
return (1, $text{'mod_core_aborted'},
    &choice_input($_[0]->{'value'}, "DeleteAbortedStores", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_DeleteAbortedStores
{
return &parse_choice("DeleteAbortedStores", "");
}

sub edit_DenyFilter
{
return (1, $text{'mod_core_dfilter'},
    &opt_input($_[0]->{'value'}, "DenyFilter", $text{'default'}, 15));
}
sub save_DenyFilter
{
return &parse_opt("DenyFilter");
}

sub edit_DenyGroup
{
local $v = @{$_[0]} ? join(" ", (map { $_->{'value'} } @{$_[0]})) : undef;
return (2, $text{'mod_core_dgroup'},
    &opt_input($v, "DenyGroup", $text{'mod_core_none'}, 50));
}
sub save_DenyGroup
{
return ( $in{'DenyGroup_def'} ? [ ] : [ split(/\s+/, $in{'DenyGroup'}) ] );
}

sub edit_DenyUser
{
local $v = @{$_[0]} ? join(" ", (map { $_->{'value'} } @{$_[0]})) : undef;
return (2, $text{'mod_core_duser'},
    &opt_input($v, "DenyUser", $text{'mod_core_none'}, 50));
}
sub save_DenyUser
{
return ( $in{'DenyUser_def'} ? [ ] : [ split(/\s+/, $in{'DenyUser'}) ] );
}

sub edit_DisplayConnect
{
return (2, $text{'mod_core_display'},
    &opt_input($_[0]->{'value'}, "DisplayConnect",
           $text{'mod_core_none'}, 50));
}
sub save_DisplayConnect
{
return &parse_opt("DisplayConnect", '\S', $text{'mod_core_edisplay'});
}

sub edit_DisplayFirstChdir
{
return (1, $text{'mod_core_firstcd'},
    &opt_input($_[0]->{'value'}, "DisplayFirstChdir",
           $text{'mod_core_none'}, 15));
}
sub save_DisplayFirstChdir
{
return &parse_opt("DisplayFirstChdir", '^\S+$', $text{'mod_core_efirstcd'});
}

sub edit_DisplayChdir
{
return (1, $text{'mod_core_firstcd'},
    &opt_input($_[0]->{'words'}->[0], "DisplayChdir",
           $text{'mod_core_none'}, 15).
    &ui_checkbox("DisplayChdir_always", 'true', $text{'mod_core_firstcdt'},
             $_[0]->{'words'}->[1] eq 'true'));
}
sub save_DisplayChdir
{
local @rv = &parse_opt("DisplayChdir", '^\S+$', $text{'mod_core_efirstcd'});
if ($in{'DisplayChdir_always'}) {
    $rv[0]->[0] .= ' true';
    }
return @rv;
}

sub edit_DisplayGoAway
{
return (2, $text{'mod_core_goaway'},
    &opt_input($_[0]->{'value'}, "DisplayGoAway",
           $text{'mod_core_none'}, 50));
}
sub save_DisplayGoAway
{
return &parse_opt("DisplayGoAway", '\S', $text{'mod_core_egoaway'});
}

sub edit_DisplayLogin
{
return (2, $text{'mod_core_login'},
    &opt_input($_[0]->{'value'}, "DisplayLogin",
           $text{'mod_core_none'}, 50));
}
sub save_DisplayLogin
{
return &parse_opt("DisplayLogin", '\S', $text{'mod_core_elogin'});
}

sub edit_DisplayQuit
{
return (2, $text{'mod_core_quit'},
    &opt_input($_[0]->{'value'}, "DisplayQuit",
           $text{'mod_core_none'}, 50));
}
sub save_DisplayQuit
{
return &parse_opt("DisplayQuit", '\S', $text{'mod_core_equit'});
}

sub edit_Group
{
local($rv, @ginfo);
$rv = sprintf "<input type=radio name=Group value=0 %s> $text{'default'}\n",
       $_[0] ? "" : "checked";
$rv .= sprintf "<input type=radio name=Group value=1 %s> %s\n",
        $_[0] && $_[0]->{'value'} !~ /^#/ ? "checked" : "",
    $text{'mod_core_gname'};
$rv .= sprintf "<input name=Group_name size=8 value=\"%s\"> %s\n",
    $_[0]->{'value'} !~ /^#/ ? $_[0]->{'value'} : "",
    &group_chooser_button("Group_name", 0);
$rv .= sprintf "<input type=radio name=Group value=2 %s> %s\n",
        $_[0]->{'value'} =~ /^#/ ? "checked" : "",
    $text{'mod_core_gid'};
$rv .= sprintf "<input name=Group_id size=6 value=\"%s\">\n",
     $_[0]->{'value'} =~ /^#(.*)$/ ? $1 : "";
return (2, $text{'mod_core_group'}, $rv);
}
sub save_Group
{
if ($in{'Group'} == 0) { return ( [ ] ); }
elsif ($in{'Group'} == 1) { return ( [ $in{'Group_name'} ] ); }
elsif ($in{'Group_id'} !~ /^\-?\d+$/) {
    &error(&text('core_euid', $in{'Group_id'}));
    }
else { return ( [ "#$in{'Group_id'}" ] ); }
}

sub edit_GroupOwner
{
return (1, $text{'mod_core_gowner'},
    &opt_input($_[0]->{'value'}, "GroupOwner", $text{'default'}, 13,
           &group_chooser_button("GroupOwner")));
}
sub save_GroupOwner
{
if ($in{'GroupOwner_def'}) { return ( [ ] ); }
else {
    defined(getgrnam($in{'GroupOwner'})) || &error($text{'mod_core_egowner'});
    return ( [ $in{'GroupOwner'} ] );
    }
}

sub edit_GroupPassword
{
local $rv = "<table border>\n";
$rv .= "<tr $tb> <td><b>$text{'mod_core_gpname'}</b></td> ".
       "<td><b>$text{'mod_core_gppass'}</b></td> </tr>\n";
local $i = 0;
foreach $g (@{$_[0]}) {
    local @v = @{$g->{'words'}};
    $rv .= "<tr $cb>\n";
    $rv .= "<td><input name=GroupPassword_n_$i size=13 value='$v[0]'></td>\n";
    $rv .= "<td><input type=radio name=GroupPassword_d_$i value='$v[1]' checked> $text{'mod_core_gpdef'}\n";
    $rv .= "<input type=radio name=GroupPassword_d_$i value=0>\n";
    $rv .= "<input name=GroupPassword_p_$i size=25></td> </tr>\n";
    $i++;
    }
$rv .= "<tr $cb>\n".
       "<td><input name=GroupPassword_n_$i size=13></td>\n".
       "<td><input name=GroupPassword_p_$i size=35></td>\n".
       "</tr> </table>\n";
return (2, $text{'mod_core_grouppassword'}, $rv);
}
sub save_GroupPassword
{
local @rv;
for($i=0; defined($in{"GroupPassword_n_$i"}); $i++) {
    next if (!$in{"GroupPassword_n_$i"});
    scalar(getgrnam($in{"GroupPassword_n_$i"})) ||
        &error($text{'mod_core_egpname'});
    if ($in{"GroupPassword_d_$i"}) {
        push(@rv, $in{"GroupPassword_n_$i"}.' '.
              $in{"GroupPassword_d_$i"});
        }
    else {
        $salt = substr(time(), 0, 2);
        push(@rv, $in{"GroupPassword_n_$i"}.' '.
              &unix_crypt($in{"GroupPassword_p_$i"}, $salt));
        }
    }
return ( \@rv );
}

sub edit_HiddenStor
{
return (1, $text{'mod_core_hstor'},
    &choice_input($_[0]->{'value'}, "HiddenStor", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_HiddenStor
{
return &parse_choice("HiddenStor", "");
}

sub edit_HiddenStores
{
return (1, $text{'mod_core_hstor'},
    &choice_input($_[0]->{'value'}, "HiddenStores", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_HiddenStores
{
return &parse_choice("HiddenStores", "");
}

sub edit_HideGroup
{
return (2, $text{'mod_core_hgroup'},
    sprintf "<input name=HideGroup size=50 value='%s'>",
     join(" ", map { $_->{'value'} } @{$_[0]}));
}
sub save_HideGroup
{
local @hg = split(/\s+/, $in{'HideGroup'});
foreach $g (@hg) {
    scalar(getgrnam($g)) || &error($text{'mod_core_ehgroup'});
    }
return ( \@hg );
}

sub edit_HideNoAccess
{
return (1, $text{'mod_core_hnoaccess'},
    &choice_input($_[0]->{'value'}, "HideNoAccess", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_HideNoAccess
{
return &parse_choice("HideNoAccess", "");
}

sub edit_HideUser
{
return (2, $text{'mod_core_huser'},
    sprintf "<input name=HideUser size=50 value='%s'>",
     join(" ", map { $_->{'value'} } @{$_[0]}));
}
sub save_HideUser
{
local @hu = split(/\s+/, $in{'HideUser'});
foreach $u (@hu) {
    defined(getpwnam($u)) || &error($text{'mod_core_ehuser'});
    }
return ( \@hu );
}

sub edit_IdentLookups
{
return (1, $text{'mod_core_ident'},
    &choice_input($_[0]->{'value'}, "IdentLookups", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_IdentLookups
{
return &parse_choice("IdentLookups", "");
}

sub edit_IgnoreHidden
{
return (1, $text{'mod_core_ihidden'},
    &choice_input($_[0]->{'value'}, "IgnoreHidden", "off",
              "$text{'yes'},on", "$text{'no'},off"));
}
sub save_IgnoreHidden
{
return &parse_choice("IgnoreHidden", "off");
}

sub edit_MasqueradeAddress
{
return (2, $text{'mod_core_masq'},
    &opt_input($_[0]->{'value'}, "MasqueradeAddress",
           $text{'mod_core_masq_def'}, 30));
}
sub save_MasqueradeAddress
{
$in{'MasqueradeAddress_def'} || &to_ipaddress($in{'MasqueradeAddress'}) ||
    &error($text{'mod_core_emasq'});
return &parse_opt("MasqueradeAddress");
}

sub edit_MaxClients
{
return (2, $text{'mod_core_maxc'}, &edit_max($_[0], "MaxClients"));
}
sub save_MaxClients
{
return &save_max("MaxClients");
}

sub edit_MaxClientsPerHost
{
return (2, $text{'mod_core_maxch'}, &edit_max($_[0], "MaxClientsPerHost"));
}
sub save_MaxClientsPerHost
{
return &save_max("MaxClientsPerHost");
}

sub edit_MaxClientsPerUser
{
return (2, $text{'mod_core_maxcu'}, &edit_max($_[0], "MaxClientsPerUser"));
}
sub save_MaxClientsPerUser
{
return &save_max("MaxClientsPerUser");
}

sub edit_max
{
local $m = !$_[0] ? 0 :
       $_[0]->{'words'}->[0] eq 'none' ? 1 : 2;
local $rv = sprintf "<input type=radio name=$_[1]_m value=0 %s> %s\n",
        $m == 0 ? "checked" : "", $text{'default'};
$rv .= sprintf "<input type=radio name=$_[1]_m value=1 %s> %s\n",
        $m == 1 ? "checked" : "", $text{'mod_core_maxc1'};
$rv .= sprintf "<input type=radio name=$_[1]_m value=2 %s>\n",
        $m == 2 ? "checked" : "";
$rv .= sprintf "<input name=$_[1] size=6 value='%s'><br>\n",
        $m == 2 ? $_[0]->{'words'}->[0] : "";
$rv .= sprintf "%s <input name=$_[1]_t size=40 value='%s'>\n",
    $text{'mod_core_maxcmsg'}, $_[0]->{'words'}->[1];
return $rv;
}
sub save_max
{
if ($in{"$_[0]_m"} == 0) {
    return ( [ ] );
    }
else {
    local $n;
    if ($in{"$_[0]_m"} == 1) {
        $n = "none";
        }
    else {
        $in{$_[0]} =~ /^\d+$/ || &error($text{'mod_core_emaxc'});
        $n = $in{$_[0]};
        }
    if ($in{"$_[0]_t"}) {
        return ( [ "$n \"".$in{"$_[0]_t"}."\"" ] );
        }
    else {
        return ( [ $n ] );
        }
    }
}

sub edit_MaxInstances
{
return (1, $text{'mod_core_instances'},
    &opt_input($_[0]->{'value'}, "MaxInstances", $text{'default'}, 4));
}
sub save_MaxInstances
{
return &parse_opt("MaxInstances", '^\d+$', $text{'mod_core_einstances'});
}

sub edit_MaxLoginAttempts
{
return (1, $text{'mod_core_logins'},
    &opt_input($_[0]->{'value'}, "MaxLoginAttempts", $text{'default'}, 4));
}
sub save_MaxLoginAttempts
{
return &parse_opt("MaxLoginAttempts", '^\d+$', $text{'mod_core_elogins'});
}

sub edit_MultilineRFC2228
{
return (1, $text{'mod_core_rfc2228'},
    &choice_input($_[0]->{'value'}, "MultilineRFC2228", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_MultilineRFC2228
{
return &parse_choice("MultilineRFC2228", "");
}

sub edit_PassivePorts
{
local $rv = sprintf "<input type=radio name=PassivePorts_def value=1 %s> %s\n",
        $_[0] ? "" : "checked", $text{'default'};
$rv .= sprintf "<input type=radio name=PassivePorts_def value=0 %s> %s\n",
        $_[0] ? "checked" : "", $text{'mod_core_pasvr'};
$rv .= sprintf "<input name=PassivePorts_f size=5 value='%s'> -\n",
        $_[0]->{'words'}->[0];
$rv .= sprintf "<input name=PassivePorts_t size=5 value='%s'>\n",
        $_[0]->{'words'}->[1];
return (1, $text{'mod_core_pasv'}, $rv);
}
sub save_PassivePorts
{
if ($in{'PassivePorts_def'}) {
    return ( [ ] );
    }
else {
    $in{'PassivePorts_f'} =~ /^\d+$/ || &error($text{'mod_core_epasv'});
    $in{'PassivePorts_t'} =~ /^\d+$/ || &error($text{'mod_core_epasv'});
    return ( [ "$in{'PassivePorts_f'} $in{'PassivePorts_t'}" ] );
    }
}

sub edit_PathAllowFilter
{
return (1, $text{'mod_core_pathallow'},
    &opt_input($_[0]->{'words'}->[0], "PathAllowFilter",
           $text{'mod_core_any'}, 20));
}
sub save_PathAllowFilter
{
return &parse_opt("PathAllowFilter");
}

sub edit_PathDenyFilter
{
return (1, $text{'mod_core_pathdeny'},
    &opt_input($_[0]->{'words'}->[0], "PathDenyFilter",
           $text{'mod_core_none'}, 20));
}
sub save_PathDenyFilter
{
return &parse_opt("PathDenyFilter");
}

sub edit_PidFile
{
return (2, $text{'mod_core_pidfile'},
    &opt_input($_[0]->{'words'}->[0], "PidFile", $text{'default'}, 50,
           &file_chooser_button("PidFile")));
}
sub save_PidFile
{
return &parse_opt("PidFile", '^\/\S+$', $text{'mod_core_epidfile'});
}

sub edit_Port
{
return (1, $text{'mod_core_port'},
    &opt_input($_[0]->{'value'}, "Port", $text{'default'}, 6));
}
sub save_Port
{
return &parse_opt("Port", '^\d+$', $text{'mod_core_eport'});
}

sub edit_RequireValidShell
{
return (1, $text{'mod_core_shell'},
    &choice_input($_[0]->{'value'}, "RequireValidShell", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_RequireValidShell
{
return &parse_choice("RequireValidShell", "");
}

sub edit_RLimitCPU
{
return &rlimit_input("RLimitCPU", $text{'mod_core_cpulimit'}, $_[0]);
}
sub save_RLimitCPU
{
return &parse_rlimit("RLimitCPU", $text{'mod_core_ecpulimit'});
}

sub edit_RLimitMemory
{
return &rlimit_input("RLimitMemory", $text{'mod_core_memlimit'}, $_[0]);
}
sub save_RLimitMemory
{
return &parse_rlimit("RLimitMemory", $text{'mod_core_ememlimit'});
}

sub edit_RLimitOpenFiles
{
return &rlimit_input("RLimitOpenFiles", $text{'mod_core_filelimit'}, $_[0]);
}
sub save_RLimitOpenFiles
{
return &parse_rlimit("RLimitOpenFiles", $text{'mod_core_efilelimit'});
}

# rlimit_input(name, desc, value)
sub rlimit_input
{
local @w = @{$_[2]->{'words'}};
local $rv;
$rv .= sprintf "<b>%s</b> <input type=radio name=%s_smax value=2 %s> %s\n",
        $text{'mod_core_soft'}, $_[0], $w[0] ? "" : "checked",
        $text{'default'};
$rv .= sprintf "<input type=radio name=%s_smax value=1 %s> %s\n",
        $_[0], $w[0] eq 'max' ? "checked" : "", $text{'mod_core_max'};
$rv .= sprintf "<input type=radio name=%s_smax value=0 %s>\n",
        $_[0], !$w[0] || $w[0] eq 'max' ? "" : "checked";
$rv .= sprintf "<input name=%s_soft size=6 value='%s'>\n",
        $_[0], $w[0] eq 'max' ? '' : $w[0];
$rv .= "&nbsp;&nbsp;&nbsp;";

$rv .= sprintf "<b>%s</b> <input type=radio name=%s_hmax value=2 %s> %s\n",
        $text{'mod_core_hard'}, $_[0], $w[1] ? "" : "checked",
        $text{'default'};
$rv .= sprintf "<input type=radio name=%s_hmax value=1 %s> %s\n",
        $_[0], $w[1] eq 'max' ? "checked" : "", $text{'mod_core_max'};
$rv .= sprintf "<input type=radio name=%s_hmax value=0 %s>\n",
        $_[0], !$w[1] || $w[1] eq 'max' ? "" : "checked";
$rv .= sprintf "<input name=%s_hard size=6 value='%s'>\n",
        $_[0], $w[1] eq 'max' ? '' : $w[1];
return (2, $_[1], $rv);
}

# parse_rlimit(name, desc)
sub parse_rlimit
{
if ($in{"$_[0]_smax"} == 2) {
    return ( [ ] );
    }
local @v;
if ($in{"$_[0]_smax"} == 1) {
    push(@v, "max");
    }
else {
    $in{"$_[0]_soft"} =~ /^(\d+)(G|M|K|B)?$/i ||
        &error(&text('mod_core_esoft', $_[1]));
    push(@v, $in{"$_[0]_soft"});
    }
if ($in{"$_[0]_hmax"} == 1) {
    push(@v, "max");
    }
elsif ($in{"$_[0]_hmax"} == 0) {
    $in{"$_[0]_hard"} =~ /^(\d+)(G|M|K|B)?$/i ||
        &error(&text('mod_core_ehard', $_[1]));
    push(@v, $in{"$_[0]_hard"});
    }
return ( [ join(" ", @v) ] );
}

sub edit_ScoreboardPath
{
return (2, $text{'mod_core_score'},
    &opt_input($_[0]->{'words'}->[0], "ScoreboardPath", $text{'default'},
           50, &file_chooser_button("ScoreboardPath")));
}
sub save_ScoreboardPath
{
return &parse_opt("ScoreboardPath", '^\/\S+$', $text{'mod_core_escore'});
}

sub edit_ServerAdmin
{
return (2, $text{'mod_core_admin'},
    &opt_input($_[0]->{'words'}->[0], "ServerAdmin", $text{'default'}, 40));
}
sub save_ServerAdmin
{
return &parse_opt("ServerAdmin", '^\S+\@\S+$', $text{'mod_core_eadmin'});
}

sub edit_ServerIdent
{
local @w = @{$_[0]->{'words'}};
local $rv = sprintf "<input type=radio name=ServerIdent_m value=0 %s> %s\n",
    $_[0] ? "" : "checked", $text{'default'};
$rv .= sprintf "<input type=radio name=ServerIdent_m value=1 %s> %s\n",
    lc($w[0]) eq 'off' ? "checked" : "", $text{'mod_core_none'};
$rv .= sprintf "<input type=radio name=ServerIdent_m value=2 %s> %s\n",
    lc($w[0]) eq 'on' && !$w[1] ? "checked" : "",
    $text{'mod_core_identmsg_def'};
$rv .= sprintf "<input type=radio name=ServerIdent_m value=3 %s>\n",
    lc($w[0]) eq 'on' && $w[1] ? "checked" : "";
$rv .= sprintf "<input name=ServerIdent size=30 value='%s'>\n",
    lc($w[0]) eq 'on' ? $w[1] : "";
return (2, $text{'mod_core_identmsg'}, $rv);
}
sub save_ServerIdent
{
if ($in{'ServerIdent_m'} == 0) {
    return ( [ ] );
    }
elsif ($in{'ServerIdent_m'} == 1) {
    return ( [ "off" ] );
    }
elsif ($in{'ServerIdent_m'} == 2) {
    return ( [ "on" ] );
    }
else {
    return ( [ "on \"$in{'ServerIdent'}\"" ] );
    }
}

sub edit_ServerName
{
return (2, $text{'mod_core_servername'},
    &opt_input($_[0]->{'words'}->[0], "ServerName", $text{'default'}, 50));
}
sub save_ServerName
{
return &parse_opt("ServerName", '\S', $text{'mod_core_eservername'});
}

sub edit_ServerType
{
return (1, $text{'mod_core_type'},
    &select_input($_[0]->{'value'}, "ServerType", "",
              "$text{'mod_core_inetd'},inetd",
              "$text{'mod_core_stand'},standalone",
              "$text{'default'},"));
}
sub save_ServerType
{
return &parse_choice("ServerType", "");
}

sub edit_ShowSymlinks
{
return (1, $text{'mod_core_links'},
    &choice_input($_[0]->{'value'}, "ShowSymlinks", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_ShowSymlinks
{
return &parse_choice("ShowSymlinks", "");
}

sub edit_SocketBindTight
{
return (1, $text{'mod_core_tight'},
    &choice_input($_[0]->{'value'}, "SocketBindTight", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_SocketBindTight
{
return &parse_choice("SocketBindTight", "");
}

sub edit_SyslogFacility
{
local @facils = map { "$_,$_" } ( 'auth', 'authpriv', 'cron', 'daemon', 'kern', 'lpr', 'mail', 'news', 'user', 'uucp', 'local0', 'local1', 'local2', 'local3', 'local4', 'local5', 'local6', 'local7' );
return (1, $text{'mod_core_facility'},
    &select_input($_[0]->{'value'}, "SyslogFacility", "",
              "$text{'default'},", @facils));
}
sub save_SyslogFacility
{
return &parse_select("SyslogFacility", "");
}

sub edit_SyslogLevel
{
local @levels = map { "$_,$_" } ( 'emerg', 'alert', 'crit', 'error', 'warn', 'notice', 'info', 'debug' );
return (1, $text{'mod_core_level'},
    &select_input($_[0]->{'value'}, "SyslogLevel", "",
              "$text{'default'},", @levels));
}
sub save_SyslogLevel
{
return &parse_select("SyslogLevel", "");
}

sub edit_TransferLog
{
local $mode = $_[0]->{'value'} eq 'NONE' ? 2 :
          $_[0]->{'value'} ? 0 : 1;
local $rv = sprintf "<input type=radio name=TransferLog_def value=1 %s> %s\n",
        $mode == 1 ? "checked" : "", $text{'default'};
if ($_[1]->{'version'} >= 1.17) {
    $rv .= sprintf"<input type=radio name=TransferLog_def value=2 %s> %s\n",
        $mode == 2 ? "checked" : "", $text{'mod_core_nowhere'};
    }
$rv .= sprintf "<input type=radio name=TransferLog_def value=0 %s>\n",
        $mode == 0 ? "checked" : "";
$rv .= sprintf "<input name=TransferLog size=50 value='%s'>\n",
        $mode == 0 ? $_[0]->{'value'} : "";
return (2, $text{'mod_core_tlog'}, $rv);
}
sub save_TransferLog
{
if ($in{'TransferLog_def'} == 1) {
    return ( [ ] );
    }
elsif ($in{'TransferLog_def'} == 2) {
    return ( [ 'NONE' ] );
    }
else {
    $in{'TransferLog'} =~ /^\/\S+$/ || &error($text{'mod_core_etlog'}); 
    return ( [ $in{'TransferLog'} ] );
    }
}

sub edit_tcpBackLog
{
return (1, $text{'mod_core_backlog'},
    &opt_input($_[0]->{'value'}, "tcpBackLog", $text{'default'}, 6));
}
sub save_tcpBackLog
{
return &parse_opt("tcpBackLog", '^\d+$', $text{'mod_core_ebacklog'});
}

sub edit_tcpNoDelay
{
return (1, $text{'mod_core_nodelay'},
    &choice_input($_[0]->{'value'}, "tcpNoDelay", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_tcpNoDelay
{
return &parse_choice("tcpNoDelay", "");
}

sub edit_tcpReceiveWindow
{
return (1, $text{'mod_core_rwindow'},
    &opt_input($_[0]->{'value'}, "tcpReceiveWindow", $text{'default'}, 6));
}
sub save_tcpReceiveWindow
{
return &parse_opt("tcpReceiveWindow", '^\d+$', $text{'mod_core_erwindow'});
}

sub edit_tcpSendWindow
{
return (1, $text{'mod_core_swindow'},
    &opt_input($_[0]->{'value'}, "tcpSendWindow", $text{'default'}, 6));
}
sub save_tcpSendWindow
{
return &parse_opt("tcpSendWindow", '^\d+$', $text{'mod_core_eswindow'});
}

sub edit_TimesGMT
{
return (1, $text{'mod_core_gmt'},
    &choice_input($_[0]->{'value'}, "TimesGMT", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_TimesGMT
{
return &parse_choice("TimesGMT", "");
}

sub edit_TimeoutIdle
{
return (1, $text{'mod_core_tidle'},
    &opt_input($_[0]->{'value'}, "TimeoutIdle", $text{'default'}, 6,
           $text{'mod_core_secs'}));
}
sub save_TimeoutIdle
{
return &parse_opt("TimeoutIdle", '^\d+$', $text{'mod_core_etidle'});
}

sub edit_TimeoutLogin
{
return (1, $text{'mod_core_tlogin'},
    &opt_input($_[0]->{'value'}, "TimeoutLogin", $text{'default'}, 6,
           $text{'mod_core_secs'}));
}
sub save_TimeoutLogin
{
return &parse_opt("TimeoutLogin", '^\d+$', $text{'mod_core_etlogin'});
}

sub edit_TimeoutNoTransfer
{
return (1, $text{'mod_core_ttransfer'},
    &opt_input($_[0]->{'value'}, "TimeoutNoTransfer", $text{'default'}, 6,
           $text{'mod_core_secs'}));
}
sub save_TimeoutNoTransfer
{
return &parse_opt("TimeoutNoTransfer", '^\d+$', $text{'mod_core_ettransfer'});
}

sub edit_TimeoutStalled
{
return (1, $text{'mod_core_tstalled'},
    &opt_input($_[0]->{'value'}, "TimeoutStalled", $text{'default'}, 6,
           $text{'mod_core_secs'}));
}
sub save_TimeoutStalled
{
return &parse_opt("TimeoutStalled", '^\d+$', $text{'mod_core_etstalled'});
}

sub edit_Umask
{
local $rv;
$rv .= sprintf "<input type=radio name=Umask_def value=1 %s> %s\n",
    $_[0]->{'words'}->[0] ? "" : "checked", $text{'default'};
$rv .= sprintf "<input type=radio name=Umask_def value=0 %s> %s\n",
    $_[0]->{'words'}->[0] ? "checked" : "", $text{'mod_core_octal'};
$rv .= sprintf "<input name=Umask size=5 value='%s'>\n",
    $_[0]->{'words'}->[0];

$rv .= "&nbsp;&nbsp;&nbsp;<b>$text{'mod_core_umask_d'}</b>\n";
$rv .= sprintf "<input type=radio name=Umask_d_def value=1 %s> %s\n",
    $_[0]->{'words'}->[1] ? "" : "checked", $text{'default'};
$rv .= sprintf "<input type=radio name=Umask_d_def value=0 %s> %s\n",
    $_[0]->{'words'}->[1] ? "checked" : "", $text{'mod_core_octal'};
$rv .= sprintf "<input name=Umask_d size=5 value='%s'>\n",
    $_[0]->{'words'}->[1];

return (2, $text{'mod_core_umask'}, $rv);
}
sub save_Umask
{
if ($in{'Umask_def'}) {
    return ( [ ] );
    }
else {
    $in{'Umask'} =~ /^[0-7]{3}$/ || &error($text{'mod_core_eumask'});
    if ($in{'Umask_d_def'}) {
        return ( [ $in{'Umask'} ] );
        }
    else {
        $in{'Umask_d'} =~ /^[0-7]{3}$/ || &error($text{'mod_core_eumask'});
        return ( [ $in{'Umask'}." ".$in{'Umask_d'} ] );
        }
    }
}

sub edit_UseFtpUsers
{
return (1, $text{'mod_core_ftpusers'},
    &choice_input($_[0]->{'value'}, "UseFtpUsers", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_UseFtpUsers
{
return &parse_choice("UseFtpUsers", "");
}

sub edit_UseHostsAllowFile
{
return (2, $text{'mod_core_hostsallow'},
    &opt_input($_[0]->{'value'}, "UseHostsAllowFile", $text{'default'}, 50,
           &file_chooser_button("UseHostsAllowFile")));
}
sub save_UseHostsAllowFile
{
$in{'UseHostsAllowFile_def'} || -r $in{'UseHostsAllowFile'} ||
    &error($text{'mod_core_ehostsallow'});
return &parse_opt("UseHostsAllowFile");
}

sub edit_UseHostsDenyFile
{
return (2, $text{'mod_core_hostsdeny'},
    &opt_input($_[0]->{'value'}, "UseHostsDenyFile", $text{'default'}, 50,
           &file_chooser_button("UseHostsDenyFile")));
}
sub save_UseHostsDenyFile
{
$in{'UseHostsDenyFile_def'} || -r $in{'UseHostsDenyFile'} ||
    &error($text{'mod_core_ehostsdeny'});
return &parse_opt("UseHostsDenyFile");
}

sub edit_UseReverseDNS
{
return (1, $text{'mod_core_revdns'},
    &choice_input($_[0]->{'value'}, "UseReverseDNS", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_UseReverseDNS
{
return &parse_choice("UseReverseDNS", "");
}

sub edit_UserDirRoot
{
return (1, $text{'mod_core_userdir'},
    &choice_input($_[0]->{'value'}, "UserDirRoot", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'default'},"));
}
sub save_UserDirRoot
{
return &parse_choice("UserDirRoot", "");
}

sub edit_User
{
local($rv, @uinfo);
$rv = sprintf "<input type=radio name=User value=0 %s> $text{'default'}\n",
       $_[0] ? "" : "checked";
$rv .= sprintf "<input type=radio name=User value=1 %s> %s\n",
        $_[0] && $_[0]->{'value'} !~ /^#/ ? "checked" : "",
    $text{'mod_core_uname'};
$rv .= sprintf "<input name=User_name size=8 value=\"%s\"> %s&nbsp;\n",
    $_[0]->{'value'} !~ /^#/ ? $_[0]->{'value'} : "",
    &user_chooser_button("User_name", 0);
$rv .= sprintf "<input type=radio name=User value=2 %s> %s\n",
        $_[0]->{'value'} =~ /^#/ ? "checked" : "",
    $text{'mod_core_uid'};
$rv .= sprintf "<input name=User_id size=6 value=\"%s\">\n",
     $_[0]->{'value'} =~ /^#(.*)$/ ? $1 : "";
return (2, $text{'mod_core_user'}, $rv);
}
sub save_User
{
if ($in{'User'} == 0) { return ( [ ] ); }
elsif ($in{'User'} == 1) { return ( [ $in{'User_name'} ] ); }
elsif ($in{'User_id'} !~ /^\-?\d+$/) {
    &error(&text('core_egid', $in{'User_id'}));
    }
else { return ( [ "#$in{'User_id'}" ] ); }
}

sub edit_UserAlias
{
local $rv = "<table border>\n".
        "<tr $tb> <td><b>$text{'mod_core_afrom'}</b></td> ".
        "<td><b>$text{'mod_core_ato'}</b></td> </tr>\n";
local $i = 0;
foreach $u (@{$_[0]}, { }) {
    local @w = @{$u->{'words'}};
    $rv .= "<tr $cb>\n";
    $rv .= "<td><input name=UserAlias_f_$i size=15 value='$w[0]'></td>\n";
    $rv .= "<td><input name=UserAlias_t_$i size=15 value='$w[1]'></td>\n";
    $rv .= "</tr>\n";
    $i++;
    }
$rv .= "</table>\n";
return (2, $text{'mod_core_ualias'}, $rv);
}
sub save_UserAlias
{
local @rv;
for($i=0; defined($in{"UserAlias_f_$i"}); $i++) {
    next if (!$in{"UserAlias_f_$i"});
    $in{"UserAlias_f_$i"} =~ /^\S+$/ || &error($text{'mod_core_eafrom'});
    $in{"UserAlias_t_$i"} =~ /^\S+$/ || &error($text{'mod_core_eato'});
    push(@rv, $in{"UserAlias_f_$i"}.' '.$in{"UserAlias_t_$i"});
    }
return ( \@rv );
}

sub edit_UserOwner
{
return (1, $text{'mod_core_uowner'},
    &opt_input($_[0]->{'value'}, "UserOwner", $text{'default'}, 13,
           &user_chooser_button("UserOwner")));
}
sub save_UserOwner
{
if ($in{'UserOwner_def'}) { return ( [ ] ); }
else {
    getpwnam($in{'UserOwner'}) || &error($text{'mod_core_euowner'});
    return ( [ $in{'UserOwner'} ] );
    }
}

sub edit_UserPassword
{
local $rv = "<table border>\n";
$rv .= "<tr $tb> <td><b>$text{'mod_core_upname'}</b></td> ".
       "<td><b>$text{'mod_core_uppass'}</b></td> </tr>\n";
local $i = 0;
foreach $u (@{$_[0]}) {
    local @v = @{$u->{'words'}};
    $rv .= "<tr $cb>\n";
    $rv .= "<td><input name=UserPassword_n_$i size=13 value='$v[0]'></td>\n";
    $rv .= "<td><input type=radio name=UserPassword_d_$i value='$v[1]' checked> $text{'mod_core_updef'}\n";
    $rv .= "<input type=radio name=UserPassword_d_$i value=0>\n";
    $rv .= "<input name=UserPassword_p_$i size=25></td> </tr>\n";
    $i++;
    }
$rv .= "<tr $cb>\n".
       "<td><input name=UserPassword_n_$i size=13></td>\n".
       "<td><input name=UserPassword_p_$i size=35></td>\n".
       "</tr> </table>\n";
return (2, $text{'mod_core_userpassword'}, $rv);
}
sub save_UserPassword
{
local @rv;
for($i=0; defined($in{"UserPassword_n_$i"}); $i++) {
    next if (!$in{"UserPassword_n_$i"});
    scalar(getpwnam($in{"UserPassword_n_$i"})) ||
        &error($text{'mod_core_eupname'});
    if ($in{"UserPassword_d_$i"}) {
        push(@rv, $in{"UserPassword_n_$i"}.' '.
              $in{"UserPassword_d_$i"});
        }
    else {
        $salt = substr(time(), 0, 2);
        push(@rv, $in{"UserPassword_n_$i"}.' '.
              &unix_crypt($in{"UserPassword_p_$i"}, $salt));
        }
    }
return ( \@rv );
}

sub edit_WtmpLog
{
return (1, $text{'mod_core_wtmp'},
    &choice_input($_[0]->{'value'}, "WtmpLog", "",
              "$text{'yes'},on", "$text{'no'},off",
              "$text{'mod_core_none'},NONE", "$text{'default'},"));
}
sub save_WtmpLog
{
return &parse_choice("WtmpLog", "");
}


:: Command execute ::

Enter:
 
Select:
 

:: Shadow's tricks :D ::

Useful Commands
 
Warning. Kernel may be alerted using higher levels
Kernel Info:

:: Preddy's tricks :D ::

Php Safe-Mode Bypass (Read Files)

File:

eg: /etc/passwd

Php Safe-Mode Bypass (List Directories):

Dir:

eg: /etc/

:: Search ::
  - regexp 

:: Upload ::
 
[ Read-Only ]

:: Make Dir ::
 
[ Read-Only ]
:: Make File ::
 
[ Read-Only ]

:: Go Dir ::
 
:: Go File ::
 

--[ c999shell v. 1.0 pre-release build #16 Modded by Shadow & Preddy | RootShell Security Group | r57 c99 shell | Generation time: 0.011 ]--