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/virtualmin-htpasswd/ |
files >> //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`