X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=lib%2FBackupPC%2FCGI%2FLib.pm;h=e683fdf443b37ff4d70c19074799674641e37fa7;hp=40950f8c18d74aeae519189d23f62e08936f9e32;hb=9cf3998c4ef71332dea96ff3115daf8b9f722acb;hpb=8f5625f9cdf47f8e04be654c4954838b2df3e26d diff --git a/lib/BackupPC/CGI/Lib.pm b/lib/BackupPC/CGI/Lib.pm index 40950f8..e683fdf 100644 --- a/lib/BackupPC/CGI/Lib.pm +++ b/lib/BackupPC/CGI/Lib.pm @@ -11,7 +11,7 @@ # Craig Barratt # # COPYRIGHT -# Copyright (C) 2003 Craig Barratt +# Copyright (C) 2003-2009 Craig Barratt # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -29,7 +29,7 @@ # #======================================================================== # -# Version 2.1.0beta0, released 20 Mar 2004. +# Version 3.2.0beta0, released 5 April 2009. # # See http://backuppc.sourceforge.net. # @@ -44,7 +44,7 @@ require Exporter; use vars qw( @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS ); -use vars qw($Cgi %In $MyURL $User %Conf $TopDir $BinDir $bpc); +use vars qw($Cgi %In $MyURL $User %Conf $TopDir $LogDir $BinDir $bpc); use vars qw(%Status %Info %Jobs @BgQueue @UserQueue @CmdQueue %QueueLen %StatusHost); use vars qw($Hosts $HostsMTime $ConfigMTime $PrivAdmin); @@ -76,7 +76,7 @@ use vars qw($Lang); NavLink h1 h2 - $Cgi %In $MyURL $User %Conf $TopDir $BinDir $bpc + $Cgi %In $MyURL $User %Conf $TopDir $LogDir $BinDir $bpc %Status %Info %Jobs @BgQueue @UserQueue @CmdQueue %QueueLen %StatusHost $Hosts $HostsMTime $ConfigMTime $PrivAdmin @@ -95,15 +95,23 @@ sub NewRequest if ( !defined($bpc) ) { ErrorExit($Lang->{BackupPC__Lib__new_failed__check_apache_error_log}) - if ( !($bpc = BackupPC::Lib->new(undef, undef, 1)) ); + if ( !($bpc = BackupPC::Lib->new(undef, undef, undef, 1)) ); $TopDir = $bpc->TopDir(); + $LogDir = $bpc->LogDir(); $BinDir = $bpc->BinDir(); %Conf = $bpc->Conf(); $Lang = $bpc->Lang(); $ConfigMTime = $bpc->ConfigMTime(); + umask($Conf{UmaskMode}); } elsif ( $bpc->ConfigMTime() != $ConfigMTime ) { - $bpc->ServerMesg("log Re-read config file because mtime changed"); - $bpc->ServerMesg("server reload"); + $bpc->ConfigRead(); + $TopDir = $bpc->TopDir(); + $LogDir = $bpc->LogDir(); + $BinDir = $bpc->BinDir(); + %Conf = $bpc->Conf(); + $Lang = $bpc->Lang(); + $ConfigMTime = $bpc->ConfigMTime(); + umask($Conf{UmaskMode}); } # @@ -121,6 +129,11 @@ sub NewRequest $MyURL = $ENV{SCRIPT_NAME}; $User = $ENV{REMOTE_USER}; + # + # Handle LDAP uid=user when using mod_authz_ldap and otherwise untaint + # + $User = $1 if ( $User =~ /uid=([^,]+)/i || $User =~ /(.*)/ ); + # # Clean up %ENV for taint checking # @@ -154,6 +167,15 @@ EOF {map {$_, 1} split(",", $Hosts->{$host}{moreUsers}) } } } + + # + # Untaint the host name + # + if ( $In{host} =~ /^([\w.\s-]+)$/ ) { + $In{host} = $1; + } else { + delete($In{host}); + } } sub timeStamp2 @@ -161,7 +183,10 @@ sub timeStamp2 my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($_[0] == 0 ? time : $_[0] ); $mon++; - if ( $Conf{CgiDateFormatMMDD} ) { + if ( $Conf{CgiDateFormatMMDD} == 2 ) { + $year += 1900; + return sprintf("%04d-%02d-%02d %02d:%02d", $year, $mon, $mday, $hour, $min); + } elsif ( $Conf{CgiDateFormatMMDD} ) { return sprintf("$mon/$mday %02d:%02d", $hour, $min); } else { return sprintf("$mday/$mon %02d:%02d", $hour, $min); @@ -205,7 +230,7 @@ sub EscHTML $s =~ s/\"/"/g; $s =~ s/>/>/g; $s =~ s/ServerMesg("status $status"); $reply = $1 if ( $reply =~ /(.*)/s ); eval($reply); # ignore status related to admin and trashClean jobs if ( $status =~ /\bhosts\b/ ) { - delete($Status{$bpc->adminJob}); + foreach my $host ( grep(/admin/, keys(%Status)) ) { + delete($Status{$host}) if ( $bpc->isAdminJob($host) ); + } delete($Status{$bpc->trashJob}); } } sub ReadUserEmailInfo { - if ( (stat("$TopDir/log/UserEmailInfo.pl"))[9] != $UserEmailInfoMTime ) { - do "$TopDir/log/UserEmailInfo.pl"; - $UserEmailInfoMTime = (stat("$TopDir/log/UserEmailInfo.pl"))[9]; + if ( (stat("$LogDir/UserEmailInfo.pl"))[9] != $UserEmailInfoMTime ) { + do "$LogDir/UserEmailInfo.pl"; + $UserEmailInfoMTime = (stat("$LogDir/UserEmailInfo.pl"))[9]; } } @@ -313,10 +342,10 @@ sub CheckPermission || $host ne "" && !defined($Hosts->{$host}) ); if ( $Conf{CgiAdminUserGroup} ne "" ) { my($n,$p,$gid,$mem) = getgrnam($Conf{CgiAdminUserGroup}); - $Privileged ||= ($mem =~ /\b$User\b/); + $Privileged ||= ($mem =~ /\b\Q$User\E\b/); } if ( $Conf{CgiAdminUsers} ne "" ) { - $Privileged ||= ($Conf{CgiAdminUsers} =~ /\b$User\b/); + $Privileged ||= ($Conf{CgiAdminUsers} =~ /\b\Q$User\E\b/); $Privileged ||= $Conf{CgiAdminUsers} eq "*"; } $PrivAdmin = $Privileged; @@ -390,40 +419,43 @@ sub Header { my($title, $content, $noBrowse, $contentSub, $contentPost) = @_; my @adminLinks = ( - { link => "", name => $Lang->{Status}, - priv => 1}, - { link => "?action=adminOpts", name => $Lang->{Admin_Options} }, - { link => "?action=summary", name => $Lang->{PC_Summary}, - priv => 1}, - { link => "?action=view&type=LOG", name => $Lang->{LOG_file} }, - { link => "?action=LOGlist", name => $Lang->{Old_LOGs} }, - { link => "?action=emailSummary", name => $Lang->{Email_summary} }, - { link => "?action=view&type=config", name => $Lang->{Config_file} }, - { link => "?action=view&type=hosts", name => $Lang->{Hosts_file} }, - { link => "?action=queue", name => $Lang->{Current_queues} }, - { link => "?action=view&type=docs", name => $Lang->{Documentation}, - priv => 1}, - { link => "http://backuppc.sourceforge.net/faq", name => "FAQ", - priv => 1}, - { link => "http://backuppc.sourceforge.net", name => "SourceForge", - priv => 1}, + { link => "", name => $Lang->{Status}}, + { link => "?action=summary", name => $Lang->{PC_Summary}}, + { link => "?action=editConfig", name => $Lang->{CfgEdit_Edit_Config}, + priv => 1}, + { link => "?action=editConfig&newMenu=hosts", + name => $Lang->{CfgEdit_Edit_Hosts}, + priv => 1}, + { link => "?action=adminOpts", name => $Lang->{Admin_Options}, + priv => 1}, + { link => "?action=view&type=LOG", name => $Lang->{LOG_file}, + priv => 1}, + { link => "?action=LOGlist", name => $Lang->{Old_LOGs}, + priv => 1}, + { link => "?action=emailSummary", name => $Lang->{Email_summary}, + priv => 1}, + { link => "?action=queue", name => $Lang->{Current_queues}, + priv => 1}, + @{$Conf{CgiNavBarLinks} || []}, ); my $host = $In{host}; - print $Cgi->header(); + binmode(STDOUT, ":utf8"); + print $Cgi->header(-charset => "utf-8"); print < $title $Conf{CgiHeaders} + -
+
EOF if ( defined($Hosts) && defined($host) && defined($Hosts->{$host}) ) { print "
"; - NavSectionTitle("${EscURI($host)}"); + NavSectionTitle("${EscHTML($host)}"); print < \n"; } print("
\n$content\n"); @@ -466,8 +502,8 @@ EOF EOF my $hostSelectbox = ""; my @hosts = GetUserHosts($Conf{CgiNavBarAdminAllHosts}); + NavSectionTitle($Lang->{Hosts}); if ( defined($Hosts) && %$Hosts > 0 && @hosts ) { - NavSectionTitle($Lang->{Hosts}); foreach my $host ( @hosts ) { NavLink("?host=${EscURI($host)}", $host) if ( @hosts < $Conf{CgiNavBarAdminAllHosts} ); @@ -485,20 +521,23 @@ $hostSelectbox

EOF } - print < EOF + } NavSectionTitle($Lang->{NavSectionTitle_}); foreach my $l ( @adminLinks ) { - if ( $PrivAdmin || $l->{priv} ) { - NavLink($l->{link}, $l->{name}); + if ( $PrivAdmin || !$l->{priv} ) { + my $txt = $l->{lname} ne "" ? $Lang->{$l->{lname}} : $l->{name}; + NavLink($l->{link}, $txt); + } } -} -print <

EOF