#!/usr/bin/perl package password_protect_directories; use strict; $|++; $ENV{PATH} = "/bin:/usr/bin"; delete @ENV{ 'IFS', 'CDPATH', 'ENV', 'BASH_ENV' }; use FindBin; use lib "$FindBin::Bin/../"; use lib "$FindBin::Bin/../DADA/perllib"; BEGIN { my $b__dir = ( getpwuid($>) )[7].'/perl'; push @INC,$b__dir.'5/lib/perl5',$b__dir.'5/lib/perl5/x86_64-linux-thread-multi',$b__dir.'lib',map { $b__dir . $_ } @INC; } use DADA::Config 8.0.0 qw(!:DEFAULT); use DADA::App::Guts; use DADA::MailingList::Settings; use DADA::Profile::Htpasswd; my $Plugin_Config = {}; $Plugin_Config->{Plugin_Name} = 'Password Protect Directories'; $Plugin_Config->{Allow_Manual_Run} = 1; $Plugin_Config->{Manual_Run_Passcode} = undef; $Plugin_Config->{Base_Absolute_Path} = $ENV{DOCUMENT_ROOT} . '/'; $Plugin_Config->{Base_URL} = 'http://' . $ENV{HTTP_HOST} . '/'; $Plugin_Config->{Plugin_URL} => $DADA::Config::S_PROGRAM_URL . '?flavor=plugins&plugin=password_protect_directories', &init_vars; run() unless caller(); sub init_vars { # DEV: This NEEDS to be in its own module - perhaps DADA::App::PluginHelper or something? while ( my $key = each %$Plugin_Config ) { if ( exists( $DADA::Config::PLUGIN_CONFIGS->{password_protect_directories}->{$key} ) ) { if ( defined( $DADA::Config::PLUGIN_CONFIGS->{password_protect_directories}->{$key} ) ) { $Plugin_Config->{$key} = $DADA::Config::PLUGIN_CONFIGS->{password_protect_directories}->{$key}; } } } } my $list; my $root_login; my $ls; my $verbose; sub reset_globals { my $list = undef; my $root_login = 0; my $ls; } sub run { reset_globals(); my $q = shift; if ( !$ENV{GATEWAY_INTERFACE} ) { print refresh_directories( { -verbose => $verbose } ); # this (hopefully) means we're running on the cl... } elsif ( keys %{ $q->Vars } && $q->param('run') && xss_filter( scalar $q->param('run') ) == 1 && $Plugin_Config->{Allow_Manual_Run} == 1 ) { my $r = refresh_directories( { -verbose => 0 } ); if($verbose){ print '
' . $r . ''; } return ({}, $r); } else { my $admin_list; my $checksout; my $error_msg; ( $admin_list, $root_login, $checksout, $error_msg ) = check_list_security( -cgi_obj => $q, -Function => 'password_protect_directories' ); if(!$checksout){ return ({}, $error_msg); } $list = $admin_list; $ls = DADA::MailingList::Settings->new( { -list => $list } ); $verbose = $q->param('verbose') || 0; my $prm = $q->param('prm') || undef; my %Mode = ( 'default' => \&default, 'edit_dir' => \&default, 'process_edit_dir' => \&process_edit_dir, 'new_dir' => \&new_dir, 'delete_dir' => \&delete_dir, 'cgi_refresh_directories' => \&cgi_refresh_directories, ); if ( exists( $Mode{$prm} ) ) { return $Mode{$prm}->($q); #call the correct subroutine } else { return default($q); } } } sub scheduled_task { my $list = shift || undef; my $r = refresh_directories( { -list => $list, -verbose => 1 } ); return $r; } sub test_sub { return 'Hello, World!'; } sub cgi_refresh_directories { my $q = shift; $verbose = 0; refresh_directories(); return({-redirect_uri => $Plugin_Config->{Plugin_URL} . '?done=1'}, undef); } sub refresh_directories { my $r; my ($args) = @_; my @lists; if(exists($args->{-list})){ if($args->{-list} ne '_all'){ push(@lists, $args->{-list}); } else { @lists = available_lists(); } } else { @lists = available_lists(); } $r .= "Starting...\n"; foreach my $list(@lists) { $r .= "List: $list\n"; my $htp = DADA::Profile::Htpasswd->new({-list => $list}); for my $id(@{$htp->get_all_ids}) { $r .= "id: $id\n"; $htp->setup_directory({-id => $id}); } } $r .= "Done.\n"; return $r; } sub default { my $q = shift; my $htp = DADA::Profile::Htpasswd->new({-list => $list}); my $entries = $htp->get_all_entries; my $problems = $q->param('problems') || 0; my $edit = 0; my $process = $q->param('process'); my $id = undef; if($process eq 'edit_dir'){ $id = $q->param('id') || undef; my $htp = DADA::Profile::Htpasswd->new({-list => $list}); my $entry = $htp->get({-id => $id }); $edit = 1; $q->param('name', $entry->{name}); $q->param('url', $entry->{url}); $q->param('path', $entry->{path}); $q->param('use_custom_error_page', $entry->{use_custom_error_page}); $q->param('custom_error_page', $entry->{custom_error_page}); $q->param('f', 'process_edit_dir'); } my $errors = []; if($problems == 1){ my %params = $q->Vars; for(keys %params){ if($_ =~ m/^error_/){ push(@$errors, {error => $_}); } } } my $curl_location = `which curl`; $curl_location = strip( make_safer($curl_location) ); require DADA::Template::Widgets; my $scrn = DADA::Template::Widgets::wrap_screen( { -screen => 'plugins/password_protect_directories/default.tmpl', -with => 'admin', -wrapper_params => { -Root_Login => $root_login, -List => $ls->param('list'), }, -expr => 1, -vars => { done => scalar $q->param('done') || 0, Plugin_URL => $Plugin_Config->{Plugin_URL}, entries => $entries, problems => $problems, errors => $errors, edit => $edit, id => $id, curl_location => $curl_location, root_login => $root_login, Allow_Manual_Run => $Plugin_Config->{Allow_Manual_Run}, Manual_Run_Passcode => $Plugin_Config->{Manual_Run_Passcode}, Base_Absolute_Path => $Plugin_Config->{Base_Absolute_Path}, Base_URL => $Plugin_Config->{Base_URL}, }, -list_settings_vars_param => { -list => $list, -dot_it => 1, }, } ); if($problems == 1 || $edit == 1){ require HTML::FillInForm::Lite; my $h = HTML::FillInForm::Lite->new(); $scrn = $h->fill( \$scrn, $q ); } return( {}, $scrn); } sub new_dir { my $q = shift; my $name = xss_filter( scalar $q->param('name') ) || undef; my $url = xss_filter( scalar $q->param('url') ) || undef; my $path = xss_filter( scalar $q->param('path') ) || undef; my $use_custom_error_page = xss_filter( scalar $q->param('use_custom_error_page') ) || 0; my $custom_error_page = xss_filter( scalar $q->param('custom_error_page') )|| undef; my $default_password = xss_filter( scalar $q->param('default_password') ) || undef; my $htp = DADA::Profile::Htpasswd->new({-list => $list}); my ($status, $errors) = $htp->validate_protected_dir( { -fields => { -name => $name, -url => $url, -path => $path , -use_custom_error_page => $use_custom_error_page, -custom_error_page => $custom_error_page, -default_password => $default_password, }, } ); if($status == 1){ $htp->create( { -name => $name, -url => $url, -path => $path , -use_custom_error_page => $use_custom_error_page, -custom_error_page => $custom_error_page, -default_password => $default_password, } ); for my $id2(@{$htp->get_all_ids}) { $htp->setup_directory({-id => $id2}); } print $q->redirect(-uri => $Plugin_Config->{Plugin_URL} . '?done=1'); } else { for(keys %$errors){ $q->param('error_' . $_, $errors->{$_}); } $q->param('problems', 1); return default($q); } } sub sql_backend_only_message { require DADA::Template::Widgets; my $scrn = DADA::Template::Widgets::wrap_screen( { -screen => 'plugins/shared/sql_backend_only_message.tmpl', -with => 'admin', -wrapper_params => { -Root_Login => $root_login, -List => $ls->param('list'), },, -vars => { }, -list_settings_vars_param => { -list => $list, -dot_it => 1, }, } ); return ({}, $scrn); } sub process_edit_dir { my $q = shift; my $name = xss_filter( scalar $q->param('name') ) || undef; my $url = xss_filter( scalar $q->param('url') ) || undef; my $path = xss_filter( scalar $q->param('path') ) || undef; my $use_custom_error_page = xss_filter( scalar $q->param('use_custom_error_page') ) || 0; my $custom_error_page = xss_filter( scalar $q->param('custom_error_page') )|| undef; my $default_password = xss_filter( scalar $q->param('default_password') ) || undef; my $id = xss_filter( scalar $q->param('id') ) || undef; my $htp = DADA::Profile::Htpasswd->new({-list => $list}); my ($status, $errors) = $htp->validate_protected_dir( { -fields => { -name => $name, -url => $url, -path => $path , -use_custom_error_page => $use_custom_error_page, -custom_error_page => $custom_error_page, -default_password => $default_password, }, } ); if($status == 1){ $htp->update( { -id => $id, -name => $name, -url => $url, -path => $path , -use_custom_error_page => $use_custom_error_page, -custom_error_page => $custom_error_page, -default_password => $default_password, } ); my $htp = DADA::Profile::Htpasswd->new({-list => $list}); $htp->setup_directory({-id => $id}); return ({-redirect_uri => $Plugin_Config->{Plugin_URL} . '?done=1'}, undef); } else { for(keys %$errors){ $q->param('error_' . $_, $errors->{$_}); } $q->param('problems', 1); $q->param('f', 'edit_dir'); return default($q); } } sub delete_dir { my $q = shift; my $id = $q->param('id'); my $htp = DADA::Profile::Htpasswd->new({-list => $list}); $htp->remove_directory_files({-id => $id}); $htp->remove({-id => $id}); print $q->redirect(-uri => $Plugin_Config->{Plugin_URL} . '?done=1'); } return 1; __END__ =pod =head1 Password Protect Directories Plugin The Password Protect Directories plugin allows you to create an Apache Webserver-style C<.htaccess> and C<.htpasswd> file in specific directories that will then prompt a visitor for a username and password, before they can access the directory itself. The B