version 1.111, 2011/10/24 22:39:21
|
version 1.118, 2013/04/11 14:59:58
|
Line 68 use File::Basename;
|
Line 68 use File::Basename;
|
use File::Copy; |
use File::Copy; |
use HTML::Entities(); |
use HTML::Entities(); |
use Apache::Constants qw(:common :http :methods); |
use Apache::Constants qw(:common :http :methods); |
use Apache::loncacc; |
|
use Apache::lonnet; |
use Apache::lonnet; |
use Apache::loncommon(); |
use Apache::loncommon(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
Line 102 my $r; # Needs to be global for some
|
Line 101 my $r; # Needs to be global for some
|
=cut |
=cut |
|
|
sub Debug { |
sub Debug { |
# Put out the indicated message butonly if DEBUG is true. |
# Put out the indicated message but only if DEBUG is true. |
if ($DEBUG) { |
if ($DEBUG) { |
my ($r,$message) = @_; |
my ($r,$message) = @_; |
$r->log_reason($message); |
$r->log_reason($message); |
Line 110 sub Debug {
|
Line 109 sub Debug {
|
} |
} |
|
|
sub done { |
sub done { |
my ($url)=@_; |
my ($url) = @_; |
my $done=&mt("Done"); |
return |
return(<<ENDDONE); |
'<p>' |
<a href="$url">$done</a> |
.&Apache::lonhtmlcommon::confirm_success(&mt("Done")) |
<script type="text/javascript"> |
.'<br /><a href="'.$url.'">'.&mt("Continue").'</a>' |
location.href="$url"; |
.'<script type="text/javascript">' |
</script> |
.'location.href="'.$url.'";' |
ENDDONE |
.'</script>' |
|
.'</p>'; |
} |
} |
|
|
=pod |
=pod |
Line 158 Global References
|
Line 158 Global References
|
sub URLToPath { |
sub URLToPath { |
my $Url = shift; |
my $Url = shift; |
&Debug($r, "UrlToPath got: $Url"); |
&Debug($r, "UrlToPath got: $Url"); |
$Url=~ s/\/+/\//g; |
$Url=~ s{^https?\://[^/]+}{}; |
$Url=~ s/^https?\:\/\/[^\/]+//; |
$Url=~ s{//+}{/}g; |
$Url=~ s/^\///; |
$Url=~ s{^/}{}; |
$Url='/home/httpd/html/'.$Url; |
$Url=$Apache::lonnet::perlvar{'lonDocRoot'}."/$Url"; |
&Debug($r, "Returning $Url \n"); |
&Debug($r, "Returning $Url \n"); |
return $Url; |
return $Url; |
} |
} |
|
|
sub url { |
sub url { |
my $fn=shift; |
my $fn=shift; |
$fn=~s/^\/home\/httpd\/html//; |
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
$fn=~s/\/\.\//\//g; |
$fn=~ s/^\Q$londocroot\E//; |
|
$fn=~s{/\./}{/}g; |
$fn=&HTML::Entities::encode($fn,'<>"&'); |
$fn=&HTML::Entities::encode($fn,'<>"&'); |
return $fn; |
return $fn; |
} |
} |
|
|
sub display { |
sub display { |
my $fn=shift; |
my $fn=shift; |
$fn=~s/^\/home\/httpd\/html//; |
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
$fn=~s/\/\.\//\//g; |
$fn=~s/^\Q$londocroot\E//; |
|
$fn=~s{/\./}{/}g; |
return '<span class="LC_filename">'.$fn.'</span>'; |
return '<span class="LC_filename">'.$fn.'</span>'; |
} |
} |
|
|
Line 188 sub display {
|
Line 190 sub display {
|
|
|
sub obsolete_unpub { |
sub obsolete_unpub { |
my ($user,$domain,$construct)=@_; |
my ($user,$domain,$construct)=@_; |
|
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
my $published=$construct; |
my $published=$construct; |
$published=~s/^\/home\/httpd\/html\/priv\//\/home\/httpd\/html\/res\//; |
$published=~s{^\Q$londocroot/priv/\E}{$londocroot/res/}; |
if (-e $published) { |
if (-e $published) { |
if (&Apache::lonnet::metadata($published,'obsolete')) { |
if (&Apache::lonnet::metadata($published,'obsolete')) { |
return 1; |
return 1; |
Line 203 sub obsolete_unpub {
|
Line 206 sub obsolete_unpub {
|
# see if directory is empty |
# see if directory is empty |
# ignores any .meta, .save, .bak, and .log files created for a previously |
# ignores any .meta, .save, .bak, and .log files created for a previously |
# published file, which has since been marked obsolete and deleted. |
# published file, which has since been marked obsolete and deleted. |
|
# ignores a .DS_Store file put there when viewing directory via webDAV on MacOS. |
sub empty_directory { |
sub empty_directory { |
my ($dirname,$phase) = @_; |
my ($dirname,$phase) = @_; |
if (opendir DIR, $dirname) { |
if (opendir DIR, $dirname) { |
my @files = grep(!/^\.\.?$/, readdir(DIR)); # ignore . and .. |
my @files = grep(!/^\.\.?$/, readdir(DIR)); # ignore . and .. |
if (@files) { |
if (@files) { |
my @orphans = grep(/\.(meta|save|log|bak)$/,@files); |
my @orphans = grep(/\.(meta|save|log|bak|DS_Store)$/,@files); |
if (scalar(@files) - scalar(@orphans) > 0) { |
if (scalar(@files) - scalar(@orphans) > 0) { |
return 0; |
return 0; |
} else { |
} else { |
Line 231 sub empty_directory {
|
Line 235 sub empty_directory {
|
|
|
=item exists($user, $domain, $file) |
=item exists($user, $domain, $file) |
|
|
Determine if a resource file name has been published or exists |
Determine if a resource filename has been published or exists |
in the construction space. |
in the construction space. |
|
|
Parameters: |
Parameters: |
Line 270 sub exists {
|
Line 274 sub exists {
|
my ($user, $domain, $construct, $creating) = @_; |
my ($user, $domain, $construct, $creating) = @_; |
$creating ||= 'file'; |
$creating ||= 'file'; |
|
|
|
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
my $published=$construct; |
my $published=$construct; |
$published=~s{^/home/httpd/html/priv/}{/home/httpd/html/res/}; |
$published=~s{^\Q$londocroot/priv/\E}{$londocroot/res/}; |
my ($type,$result); |
my ($type,$result); |
if ( -d $construct ) { |
if ( -d $construct ) { |
return ('error','<p><span class="LC_error">'.&mt('Error: destination for operation is an existing directory.').'</span></p>'); |
return ('error','<p><span class="LC_error">'.&mt('Error: destination for operation is an existing directory.').'</span></p>'); |
Line 363 sub cleanDest {
|
Line 368 sub cleanDest {
|
($newpath,$error)=&relativeDest($fn,$newpath,$uname,$udom); |
($newpath,$error)=&relativeDest($fn,$newpath,$uname,$udom); |
if (! -d "$newpath") { |
if (! -d "$newpath") { |
$request->print('<p><span class="LC_warning">' |
$request->print('<p><span class="LC_warning">' |
.&mt("You have requested to create file in directory [_1] which doesn't exist. The requested directory path has been removed from the requested file name." |
.&mt("You have requested to create file in directory [_1] which doesn't exist. The requested directory path has been removed from the requested filename." |
,&display($newpath)) |
,&display($newpath)) |
.'</span></p>'); |
.'</span></p>'); |
$dest=~s|.*/||; |
$dest=~s|.*/||; |
Line 393 sub relativeDest {
|
Line 398 sub relativeDest {
|
my $error = ''; |
my $error = ''; |
if ($newfilename=~/^\//) { |
if ($newfilename=~/^\//) { |
# absolute, simply add path |
# absolute, simply add path |
$newfilename='/home/httpd/html/res/'.$udom.'/'.$uname.'/'; |
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
|
$newfilename="$londocroot/res/$udom/$uname/"; |
} else { |
} else { |
my $dir=$fn; |
my $dir=$fn; |
$dir=~s/\/[^\/]+$//; |
$dir=~s{/[^/]+$}{}; |
$newfilename=$dir.'/'.$newfilename; |
$newfilename=$dir.'/'.$newfilename; |
} |
} |
$newfilename=~s://+:/:g; # remove duplicate / |
$newfilename=~s{//+}{/}g; # remove duplicate / |
while ($newfilename=~m:/\.\./:) { |
while ($newfilename=~m{/\.\./}) { |
$newfilename=~ s:/[^/]+/\.\./:/:g; #remove dir/.. |
$newfilename=~ s{/[^/]+/\.\./}{/}g; #remove dir/.. |
} |
} |
my ($authorname,$authordom)=&Apache::loncacc::constructaccess($newfilename); |
my ($authorname,$authordom)=&Apache::lonnet::constructaccess($newfilename); |
unless (($authorname) && ($authordom)) { |
unless (($authorname) && ($authordom)) { |
my $otherdir = &display($newfilename); |
my $otherdir = &display($newfilename); |
$error = &mt('Access denied to [_1]',$otherdir); |
$error = &mt('Access denied to [_1]',$otherdir); |
Line 431 Parameters:
|
Line 437 Parameters:
|
|
|
sub CloseForm1 { |
sub CloseForm1 { |
my ($request, $fn) = @_; |
my ($request, $fn) = @_; |
$request->print('<p><input type="submit" value="'.&mt('Continue').'" /></p></form>'); |
$request->print('<input type="submit" value="'.&mt('Continue').'" /></form>'); |
$request->print('<form action="'.&url($fn). |
$request->print(' <form action="'.&url($fn).'" method="post">'. |
'" method="post"><p><input type="submit" value="'.&mt('Cancel').'" /></p></form>'); |
'<input type="submit" value="'.&mt('Cancel').'" /></form>'); |
} |
} |
|
|
|
|
Line 819 Parameters:
|
Line 825 Parameters:
|
|
|
=item $domain - Name of the domain of the user |
=item $domain - Name of the domain of the user |
|
|
=item $fn - Source file name |
=item $fn - Source filename |
|
|
=item $newfilename |
=item $newfilename |
- Name of the file to be created; no path information |
- Name of the file to be created; no path information |
Line 832 Side Effects:
|
Line 838 Side Effects:
|
=item 2 new forms are displayed. Clicking on the confirmation button |
=item 2 new forms are displayed. Clicking on the confirmation button |
causes the browser to attempt to load the specfied URL, allowing the |
causes the browser to attempt to load the specfied URL, allowing the |
proper handler to take care of file creation. There is also a Cancel |
proper handler to take care of file creation. There is also a Cancel |
button which returns you to the driectory listing you came from |
button which returns you to the directory listing you came from |
|
|
=back |
=back |
|
|
Line 874 sub NewFile1 {
|
Line 880 sub NewFile1 {
|
'<form name="fileaction" action="/adm/cfile" method="post">'. |
'<form name="fileaction" action="/adm/cfile" method="post">'. |
'<input type="hidden" name="qualifiedfilename" value="'.$fn.'" />'. |
'<input type="hidden" name="qualifiedfilename" value="'.$fn.'" />'. |
'<input type="hidden" name="action" value="newfile" />'. |
'<input type="hidden" name="action" value="newfile" />'. |
'<span class ="LC_nobreak">'.&mt('Enter a file name: ').'<input type="text" name="newfilename" value="Type Name Here" onfocus="if (this.value == '."'Type Name Here') this.value=''".'" /> <input type="submit" value="Go" />'. |
'<span class ="LC_nobreak">'.&mt('Enter a filename: ').'<input type="text" name="newfilename" value="Type Name Here" onfocus="if (this.value == '."'Type Name Here') this.value=''".'" /> <input type="submit" value="Go" />'. |
'</span></form></p>'. |
'</span></form></p>'. |
'<p><form action="'.&url($fn). |
'<p><form action="'.&url($fn). |
'" method="post"><p><input type="submit" value="'.&mt('Cancel').'" /></form></p>'); |
'" method="post"><p><input type="submit" value="'.&mt('Cancel').'" /></form></p>'); |
Line 956 sub phaseone {
|
Line 962 sub phaseone {
|
$dirlist=$fn; |
$dirlist=$fn; |
} |
} |
$r->print('<div class="LC_error">'.$error.'</div>'. |
$r->print('<div class="LC_error">'.$error.'</div>'. |
'<h3><a href="'.&url($dirlist).'">'.&mt('Return to Directory'). |
'<p><a href="'.&url($dirlist).'">'.&mt('Return to Directory'). |
'</a></h3>'); |
'</a></p>'); |
return; |
return; |
} |
} |
$r->print('<form action="/adm/cfile" method="post">'. |
$r->print('<form action="/adm/cfile" method="post">'. |
Line 1093 sub Rename2 {
|
Line 1099 sub Rename2 {
|
} |
} |
} else { |
} else { |
$request->print( |
$request->print( |
'<p>' |
'<p class="LC_error">' |
.&mt('No such file: [_1]', |
.&mt('No such file: [_1]', |
&display($oldfile)) |
&display($oldfile)) |
.'</p></form>' |
.'</p></form>' |
Line 1381 sub phasetwo {
|
Line 1387 sub phasetwo {
|
$dest = $newdir."/"; |
$dest = $newdir."/"; |
} |
} |
if ( ($env{'form.action'} eq 'newdir') && ($env{'form.phase'} eq 'two') && ( ($env{'form.callingmode'} eq 'testbank') || ($env{'form.callingmode'} eq 'imsimport') ) ) { |
if ( ($env{'form.action'} eq 'newdir') && ($env{'form.phase'} eq 'two') && ( ($env{'form.callingmode'} eq 'testbank') || ($env{'form.callingmode'} eq 'imsimport') ) ) { |
$r->print('<h3><a href="javascript:self.close()">'.&mt('Done').'</a></h3>'); |
$r->print( |
|
'<p>' |
|
.&Apache::lonhtmlcommon::confirm_success(&mt('Done')) |
|
.'<br /><a href="javascript:self.close()">'.&mt('Continue').'</a>' |
|
.'</p>' |
|
); |
} else { |
} else { |
if ($env{'form.action'} eq 'rename') { |
if ($env{'form.action'} eq 'rename') { |
$r->print('<h3><a href="'.&url($dest).'">'.&mt('Return to Directory').'</a></h3>'); |
$r->print( |
$r->print('<h3><a href="'.&url($dest_newname).'">'.$disp_newname.'</a></h3>'); |
'<p>'.&Apache::lonhtmlcommon::confirm_success(&mt('Done')).'</p>' |
|
.&Apache::lonhtmlcommon::actionbox( |
|
['<a href="'.&url($dest).'">'.&mt('Return to Directory').'</a>', |
|
'<a href="'.&url($dest_newname).'">'.$disp_newname.'</a>'])); |
} else { |
} else { |
$r->print(&done(&url($dest))); |
$r->print(&done(&url($dest))); |
} |
} |
Line 1435 sub handler {
|
Line 1449 sub handler {
|
} |
} |
|
|
# ----------------------------------------------------------- Start page output |
# ----------------------------------------------------------- Start page output |
my $uname; |
|
my $udom; |
|
|
|
($uname,$udom)=&Apache::loncacc::constructaccess($fn); |
my ($uname,$udom) = &Apache::lonnet::constructaccess($fn); |
&Debug($r, |
&Debug($r, |
"loncfile::handler constructaccess uname = $uname domain = $udom"); |
"loncfile::handler constructaccess uname = $uname domain = $udom"); |
unless (($uname) && ($udom)) { |
if (($uname eq '') || ($udom eq '')) { |
$r->log_reason($uname.' at '.$udom. |
$r->log_reason($uname.' at '.$udom. |
' trying to manipulate file '.$env{'form.filename'}. |
' trying to manipulate file '.$env{'form.filename'}. |
' ('.$fn.') - not authorized', |
' ('.$fn.') - not authorized', |
Line 1468 function writeDone() {
|
Line 1480 function writeDone() {
|
|; |
|; |
$loaditem{'onload'} = "writeDone()"; |
$loaditem{'onload'} = "writeDone()"; |
} |
} |
|
|
|
my $londocroot = $r->dir_config('lonDocRoot'); |
|
my $trailfile = $fn; |
|
$trailfile =~ s{^/(priv/)}{$londocroot/$1}; |
|
|
# Breadcrumbs |
# Breadcrumbs |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
&Apache::lonhtmlcommon::add_breadcrumb({ |
&Apache::lonhtmlcommon::add_breadcrumb({ |
'text' => 'Construction Space', |
'text' => 'Construction Space', |
'href' => &Apache::loncommon::authorspace(), |
'href' => &Apache::loncommon::authorspace($fn), |
}); |
}); |
&Apache::lonhtmlcommon::add_breadcrumb({ |
&Apache::lonhtmlcommon::add_breadcrumb({ |
'text' => 'File Operation', |
'text' => 'File Operation', |
Line 1486 function writeDone() {
|
Line 1502 function writeDone() {
|
{'add_entries' => \%loaditem,}) |
{'add_entries' => \%loaditem,}) |
.&Apache::lonhtmlcommon::breadcrumbs() |
.&Apache::lonhtmlcommon::breadcrumbs() |
.&Apache::loncommon::head_subbox( |
.&Apache::loncommon::head_subbox( |
&Apache::loncommon::CSTR_pageheader()) |
&Apache::loncommon::CSTR_pageheader($trailfile)) |
); |
); |
|
|
$r->print('<h3>'.&mt('Location').': '.&display($fn).'</h3>'); |
$r->print('<p>'.&mt('Location').': '.&display($fn).'</p>'); |
|
|
if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) { |
if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) { |
$r->print('<p class="LC_info">' |
$r->print('<p class="LC_info">' |
Line 1500 function writeDone() {
|
Line 1516 function writeDone() {
|
|
|
|
|
&Debug($r, "loncfile::handler Form action is $env{'form.action'} "); |
&Debug($r, "loncfile::handler Form action is $env{'form.action'} "); |
if ($env{'form.action'} eq 'delete') { |
my %action = &Apache::lonlocal::texthash( |
$r->print('<h3>'.&mt('Delete').'</h3>'); |
'delete' => 'Delete', |
} elsif ($env{'form.action'} eq 'rename') { |
'rename' => 'Rename', |
$r->print('<h3>'.&mt('Rename').'</h3>'); |
'move' => 'Move', |
} elsif ($env{'form.action'} eq 'move') { |
'newdir' => 'New Directory', |
$r->print('<h3>'.&mt('Move').'</h3>'); |
'decompress' => 'Decompress', |
} elsif ($env{'form.action'} eq 'newdir') { |
'copy' => 'Copy', |
$r->print('<h3>'.&mt('New Directory').'</h3>'); |
'newfile' => 'New Resource', |
} elsif ($env{'form.action'} eq 'decompress') { |
'newhtmlfile' => 'New Resource', |
$r->print('<h3>'.&mt('Decompress').'</h3>'); |
'newproblemfile' => 'New Resource', |
} elsif ($env{'form.action'} eq 'copy') { |
'newpagefile' => 'New Resource', |
$r->print('<h3>'.&mt('Copy').'</h3>'); |
'newsequencefile' => 'New Resource', |
} elsif ($env{'form.action'} eq 'newfile' || |
'newrightsfile' => 'New Resource', |
$env{'form.action'} eq 'newhtmlfile' || |
'newstyfile' => 'New Resource', |
$env{'form.action'} eq 'newproblemfile' || |
'newtaskfile' => 'New Resource', |
$env{'form.action'} eq 'newpagefile' || |
'newlibraryfile' => 'New Resource', |
$env{'form.action'} eq 'newsequencefile' || |
'Select Action' => 'New Resource', |
$env{'form.action'} eq 'newrightsfile' || |
); |
$env{'form.action'} eq 'newstyfile' || |
if ($action{$env{'form.action'}}) { |
$env{'form.action'} eq 'newtaskfile' || |
$r->print('<h2>'.$action{$env{'form.action'}}.'</h2>'); |
$env{'form.action'} eq 'newlibraryfile' || |
|
$env{'form.action'} eq 'Select Action' ) { |
|
$r->print('<h3>'.&mt('New Resource').'</h3>'); |
|
} else { |
} else { |
$r->print('<p class="LC_error">' |
$r->print('<p class="LC_error">' |
.&mt('Unknown Action').' '.$env{'form.action'} |
.&mt('Unknown Action: [_1]',$env{'form.action'}) |
.'</p>' |
.'</p>' |
.&Apache::loncommon::end_page() |
.&Apache::loncommon::end_page() |
); |
); |
return OK; |
return OK; |
} |
} |
|
|
if ($env{'form.phase'} eq 'two') { |
if ($env{'form.phase'} eq 'two') { |
&Debug($r, "loncfile::handler entering phase2"); |
&Debug($r, "loncfile::handler entering phase2"); |
&phasetwo($r,$fn,$uname,$udom); |
&phasetwo($r,$fn,$uname,$udom); |