version 1.126, 2010/03/10 21:26:04
|
version 1.127, 2011/10/21 17:51:23
|
Line 47 sub handler {
|
Line 47 sub handler {
|
|
|
my $r=shift; |
my $r=shift; |
|
|
my $fn; |
|
|
|
|
|
|
|
$fn = getEffectiveUrl($r); |
|
|
|
# Validate access to the construction space and get username@domain. |
# Validate access to the construction space and get username@domain. |
|
|
my $uname; |
my $uname; |
my $udom; |
my $udom; |
|
|
($uname,$udom)= |
($uname,$udom)=&Apache::loncacc::constructaccess($r->uri); |
&Apache::loncacc::constructaccess( |
|
$fn,$r->dir_config('lonDefDomain')); |
|
unless (($uname) && ($udom)) { |
unless (($uname) && ($udom)) { |
$r->log_reason($uname.':'.$udom. |
|
' trying to list directory '.$env{'form.filename'}. |
|
' ('.$fn.') - not authorized', |
|
$r->filename); |
|
return HTTP_NOT_ACCEPTABLE; |
return HTTP_NOT_ACCEPTABLE; |
} |
} |
|
|
# Remove trailing / from directory name. |
|
|
|
$fn=~s/\/$//; |
|
|
|
unless ($fn) { |
|
$r->log_reason($env{'user.name'}.':'.$env{'user.domain'}. |
|
' trying to list empty directory', $r->filename); |
|
return HTTP_NOT_FOUND; |
|
} |
|
|
|
# ----------------------------------------------------------- Start page output |
# ----------------------------------------------------------- Start page output |
|
|
|
my $fn=$r->filename; |
|
|
my $thisdisfn=$fn; |
my $thisdisfn=$fn; |
$thisdisfn=~s/^\/home\/$uname\/public_html//; # subdirectory part of |
|
# construction space. |
|
my $docroot=$r->dir_config('lonDocRoot'); # Apache londocument root. |
my $docroot=$r->dir_config('lonDocRoot'); # Apache londocument root. |
|
$thisdisfn=~s/^\Q$docroot\E\/priv//; |
|
|
|
&Apache::lonnet::logthis("Thisdisfn: $thisdisfn"); |
|
|
|
my $resdir=$docroot.'/res'.$thisdisfn; # Resource directory |
|
my $targetdir='/res'.$thisdisfn; # Publication target directory. |
|
my $linkdir='/priv'.$thisdisfn; # Full URL name of constr space. |
|
|
my $resdir=$docroot.'/res/'.$udom.'/'.$uname.$thisdisfn; # Resource directory |
&Apache::lonnet::logthis("Values: $resdir $targetdir $linkdir"); |
my $targetdir=$udom.'/'.$uname.$thisdisfn; # Publiction target directory. |
|
my $linkdir='/priv/'.$uname.$thisdisfn; # Full URL name of constr space. |
|
|
|
my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom); |
my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom); |
|
|
Line 141 sub handler {
|
Line 124 sub handler {
|
); |
); |
return OK; |
return OK; |
} |
} |
# |
|
# Gets the effective URL of the request and returns it: |
|
# $effn = getEffectiveUrl($r); |
|
# $r - The Apache Request object. |
|
sub getEffectiveUrl { |
|
my $r = shift; |
|
my $fn; |
|
|
|
if ($env{'form.filename'}) { # If a form filename is defined. |
|
$fn=$env{'form.filename'}; |
|
# |
|
# Replace the ~username of the URL with /home/username/public_html |
|
# so that we don't have to worry about ~ expansion internally. |
|
# |
|
$fn=~s/^https?\:\/\/[^\/]+\///; |
|
$fn=~s/^\///; |
|
$fn=~s{~($LONCAPA::username_re)}{/home/$1/public_html}; |
|
|
|
# Remove trailing / strings (?) |
|
|
|
$fn=~s/\/[^\/]+$//; |
|
} else { |
|
# If no form is defined, use request filename. |
|
$fn = $r->filename(); |
|
my $lonDocRoot=$r->dir_config('lonDocRoot'); |
|
if ( $fn =~ /$lonDocRoot/ ) { |
|
#internal authentication, needs fixup. |
|
$fn = $r->uri(); # non users do not get the full path request |
|
# through SCRIPT_FILENAME |
|
$fn=~s{^/~($LONCAPA::username_re)}{/home/$1/public_html}; |
|
} |
|
} |
|
$fn=~s/\/+/\//g; |
|
return $fn; |
|
} |
|
# |
# |
# Output the header of the page. This includes: |
# Output the header of the page. This includes: |
# - The HTML header |
# - The HTML header |