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 >> /proc/self/root/usr/libexec/webmin/virtualmin-htpasswd/ |
| files >> //proc/self/root/usr/libexec/webmin/virtualmin-htpasswd/virtual_feature.pl |
# Defines functions for this feature
require 'virtualmin-htpasswd-lib.pl';
$input_name = $module_name;
$input_name =~ s/[^A-Za-z0-9]/_/g;
&load_theme_library();
# feature_name()
# Returns a short name for this feature
sub feature_name
{
return $text{'feat_name'};
}
# feature_check()
# Returns undef if all the needed programs for this feature are installed,
# or an error message if not
sub feature_check
{
return &foreign_installed("htaccess-htpasswd", 1) ? undef :
$text{'feat_edep'};
}
# mailbox_inputs(&user, new, &domain)
# If any protected directories are defined, returns a list of them for selection
sub mailbox_inputs
{
local ($user, $new, $dom) = @_;
# Find protected directories
local @dirs = &htaccess_htpasswd::list_directories();
@dirs = grep { &can_directory($_->[0], $dom) } @dirs;
return undef if (!@dirs);
# Work out which ones this user has access to
local @indir;
if (!$new) {
local %indir = &get_in_dirs(\@dirs, $user->{'user'});
@indir = keys %indir;
}
else {
local $lref = &read_file_lines(
"$module_config_directory/defaults.$dom->{'id'}");
@indir = @$lref;
}
local $main::ui_table_cols = 2;
local @opts;
foreach my $dir (@dirs) {
local $reldir = &remove_public_html($dir->[0], $dom);
push(@opts, [ $dir->[0], $reldir ]);
}
local @vals;
foreach my $dir (@indir) {
local $reldir = &remove_public_html($dir, $dom);
push(@vals, [ $dir, $reldir ]);
}
return &ui_table_row(&hlink($text{'user_dirs'}, "dirs"),
&ui_multi_select($input_name, \@vals, \@opts,
scalar(@dirs) < 3 ? 3 : scalar(@dirs), 0, 0,
$text{'user_opts'}, $text{'user_vals'}, 300));
}
# mailbox_validate(&user, &old-user, &in, new, &domain)
# Validates inputs generated by mailbox_inputs, and returns either undef on
# success or an error message
sub mailbox_validate
{
return undef; # Nothing to do, since any setting is valid
}
# mailbox_save(&user, &old-user, &in, new, &domain)
# Updates the user based on inputs generated by mailbox_inputs
sub mailbox_save
{
local ($user, $old, $in, $new, $dom) = @_;
# Find protected directories
local @dirs = &htaccess_htpasswd::list_directories();
@dirs = grep { &can_directory($_->[0], $dom) } @dirs;
return undef if (!@dirs);
local %indir = &get_in_dirs(\@dirs, $old->{'user'});
local $count = 0;
# Update them all
local %seldir = map { $_, 1 } split(/\r?\n/, $in->{$input_name});
foreach my $d (@dirs) {
local $suser = $indir{$d->[0]};
if ($suser && !$seldir{$d->[0]}) {
# Take out of this directory
&virtual_server::write_as_domain_user($dom,
sub { &htaccess_htpasswd::delete_user($suser) });
}
elsif (!$suser && $seldir{$d->[0]}) {
# Add to this directory
$suser = { 'user' => $user->{'user'},
'dom' => $dom->{'dom'},
'enabled' => 1 };
if ($user->{'pass_crypt'}) {
# Use stored hashed password
$suser->{'pass'} = $user->{'pass_crypt'};
}
elsif ($user->{'passmode'} == 3 ||
defined($user->{'plainpass'})) {
# Re-hashed plaintext password
$suser->{'pass'} = &htaccess_htpasswd::encrypt_password(
$user->{'plainpass'}, undef, $d->[2]);
}
else {
# Use MD5 hashed password
$suser->{'pass'} = $user->{'pass'};
}
&virtual_server::write_as_domain_user($dom,
sub { &htaccess_htpasswd::create_user($suser, $d->[1]) });
$count++;
}
elsif ($suser && $seldir{$d->[0]}) {
# Update username and password and domain
if ($user->{'user'} ne $old->{'user'}) {
$suser->{'user'} = $user->{'user'};
}
if ($user->{'pass'} ne $old->{'pass'}) {
$suser->{'pass'} = $user->{'pass_crypt'} ||
&htaccess_htpasswd::encrypt_password(
$user->{'plainpass'}, undef, $d->[2]);
}
&virtual_server::write_as_domain_user($dom,
sub { &htaccess_htpasswd::modify_user($suser) });
$count++;
}
}
return $count ? 1 : 0;
}
# mailbox_modify(&user, &old-user, &domain)
# Adds or removes the user from protected directories
sub mailbox_modify
{
local ($user, $old, $dom) = @_;
# Find protected directories
local @dirs = &htaccess_htpasswd::list_directories();
@dirs = grep { &can_directory($_->[0], $dom) } @dirs;
local %indir = &get_in_dirs(\@dirs, $old->{'user'});
# Update the user
foreach my $d (@dirs) {
local $suser = $indir{$d->[0]};
if ($suser) {
if ($user->{'user'} ne $old->{'user'}) {
$suser->{'user'} = $user->{'user'};
}
if ($user->{'pass'} ne $old->{'pass'}) {
$suser->{'pass'} = $user->{'pass_crypt'} ||
&htaccess_htpasswd::encrypt_password(
$user->{'plainpass'}, undef, $d->[2]);
}
&virtual_server::write_as_domain_user($dom,
sub { &htaccess_htpasswd::modify_user($suser) });
}
}
}
# mailbox_delete(&user, &domain)
# Removes any extra features for this user
sub mailbox_delete
{
local ($user, $dom) = @_;
# Find protected directories
local @dirs = &htaccess_htpasswd::list_directories();
@dirs = grep { &can_directory($_->[0], $dom) } @dirs;
local %indir = &get_in_dirs(\@dirs, $user->{'user'});
# Take the user out of them
foreach my $d (@dirs) {
local $suser = $indir{$d->[0]};
if ($suser) {
&virtual_server::write_as_domain_user($dom,
sub { &htaccess_htpasswd::delete_user($suser) });
}
}
}
# mailbox_header(&domain)
# Returns a column header for the user display, or undef for none
sub mailbox_header
{
return undef;
}
# mailbox_column(&user, &domain)
# Returns the text to display in the column for some user
sub mailbox_column
{
return undef;
}
# mailbox_defaults_inputs(&defs, &domain)
# Returns HTML for editing defaults for plugin-related settings for new
# users in this virtual server
sub mailbox_defaults_inputs
{
local ($defs, $dom) = @_;
local $lref =&read_file_lines("$module_config_directory/defaults.$dom->{'id'}");
local @dirs = &htaccess_htpasswd::list_directories();
@dirs = grep { &can_directory($_->[0], $dom) } @dirs;
return undef if (!@dirs);
return &ui_table_row($text{'user_dirs'},
&ui_select($input_name, $lref,
[ map { [ $_->[0], &remove_public_html($_->[0], $dom) ] }
@dirs ], 3, 1), 3);
}
# mailbox_defaults_parse(&defs, &domain, &in)
# Parses the inputs created by mailbox_defaults_inputs, and updates a config
# file internal to this module to store them
sub mailbox_defaults_parse
{
local ($defs, $dom, $in) = @_;
local $lref =&read_file_lines("$module_config_directory/defaults.$dom->{'id'}");
@$lref = split(/\0/, $in->{$input_name});
&flush_file_lines("$module_config_directory/defaults.$dom->{'id'}");
}
# get_in_dirs(&dirs, username)
# Returns a list of directories some user has access too, as a hash
sub get_in_dirs
{
local ($dirs, $username) = @_;
local %indir;
foreach my $d (@$dirs) {
local $users = $d->[2] == 3 ?
&htaccess_htpasswd::list_digest_users($d->[1]) :
&htaccess_htpasswd::list_users($d->[1]);
local ($got) = grep { $_->{'user'} eq $username } @$users;
$indir{$d->[0]} = $got if ($got);
}
return %indir;
}
# feature_always_links(&domain)
# Returns an array of link objects for webmin modules for this plugin
sub feature_always_links
{
local ($d) = @_;
if ($d->{'web'} && $d->{'dir'} && !$d->{'alias'}) {
return ( { 'mod' => $module_name,
'desc' => $text{'links_link'},
'page' => 'index.cgi?dom='.$d->{'id'},
'cat' => 'services',
} );
}
}
# Grant this Webmin module only for domain owners who have some web domains
sub feature_webmin
{
local @doms = grep { $_->{'web'} && $_->{'dir'} && !$_->{'alias'} } @{$_[1]};
if (@doms) {
return ( [ $module_name ] );
}
else {
return ( );
}
}
1;
y~or5J={Eeu磝Qk ᯘG{?+]ן?wM3X^歌>{7پK>on\jy Rg/=fOroNVv~Y+ NGuÝHWyw[eQʨSb> >}Gmx[o[<{Ϯ_qFvM IENDB`