--- loncom/interface/lonsource.pm 2009/04/04 21:47:41 1.22 +++ loncom/interface/lonsource.pm 2012/10/29 17:38:56 1.29 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA -# Souce Code handler +# Source Code handler # -# $Id: lonsource.pm,v 1.22 2009/04/04 21:47:41 bisitz Exp $ +# $Id: lonsource.pm,v 1.29 2012/10/29 17:38:56 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,7 +40,7 @@ use Apache::lonmeta; use Apache::File; use Apache::lonlocal; use HTML::Entities; -use LONCAPA; +use LONCAPA qw(:DEFAULT :match); sub make_link { my ($filename, $listname) = @_; @@ -50,8 +50,8 @@ sub make_link { } sub stage_2 { - my ($r, $filename, $author, $listname) = @_; - my ($uname, $udom) = &Apache::loncacc::constructaccess('/~'.$author.'/',$r->dir_config('lonDefDomain')); + my ($r, $filename, $listname) = @_; + my ($author)=($filename=~/\/res\/[^\/]+\/([^\/]+)\//); $r->print(&Apache::loncommon::start_page('Copy Problem Source Code to Construction Space') .&mt('Please enter the directory that you would like the source code to go into.') .'
'
@@ -68,11 +68,7 @@ sub stage_2 {
return OK;
}
-
-sub copy_stage {
- my ($r, $filename, $listname, $newpath) = @_;
-
-#Figure out if we are author or co-author
+sub copy_author {
my $role;
my $domain;
my $author_name;
@@ -83,11 +79,26 @@ sub copy_stage {
$domain = $env{'user.domain'};
$author_name = $env{'user.name'};
}
+ return ($role,$author_name,$domain);
+}
+
+
+sub copy_stage {
+ my ($r, $filename, $listname, $newpath) = @_;
+
+#Figure out if we are author or co-author
+ my ($role,$author_name,$domain)=©_author();
+
+# Construct path to copy and filter out any possibly nasty stuff
+ my $path_to_new_file = $r->dir_config('lonDocRoot').
+ "/priv/$domain/$author_name/$newpath/$listname";
+ $path_to_new_file=~s/\.\.//g;
+ $path_to_new_file=~s/\~//g;
+ $path_to_new_file=~s/\/+/\//g;
- my $path_to_new_file = '/home/'.$author_name.'/public_html/'.$newpath.'/'.$listname;
#Just checking again for access as we want to make sure that it is really ok now that we have the real path
- my ($uname,$udom)= &Apache::loncacc::constructaccess($path_to_new_file,$domain);
+ my ($uname,$udom)= &Apache::lonnet::constructaccess($path_to_new_file);
if (!$uname || !$udom) {
$r->print(&Apache::loncommon::start_page('Not Allowed'));
@@ -96,29 +107,27 @@ sub copy_stage {
return;
}
-
#allowed
$r->print(&Apache::loncommon::start_page('Copying Source'));
my $result = &Apache::loncfile::exists($uname, $udom, $path_to_new_file);
$r->print($result);
if(($result) && ($result =~ m|published|) ) {
- &delete_copy_file($r, $author_name, $newpath, $filename, $path_to_new_file, '1');
+ &delete_copy_file($r, $newpath, $filename, $path_to_new_file, '1');
} elsif(($result) && ($result =~ m|exists!|)) {
- &confirm($r, $author_name, $newpath, $filename, $path_to_new_file);
+ &confirm($r, $newpath, $filename, $path_to_new_file);
} else {
- ©_file($r, $author_name, $newpath, $filename, $path_to_new_file);
+ ©_file($r, $newpath, $filename, $path_to_new_file);
}
$r->print(&Apache::loncommon::end_page());
}
sub confirm {
- my ($r, $author_name, $newpath, $filename, $path_to_new_file) = @_;
+ my ($r, $newpath, $filename, $path_to_new_file) = @_;
$r->print("Press delete to remove file and replace it with a copy of the source you are viewing
");
$r->print('
'.&mt('No such file').'
'); return 0; } - ©_file($r, $author_name, $newpath, $filename, $path_to_new_file); + ©_file($r, $newpath, $filename, $path_to_new_file); } } sub copy_file { - my ($r, $author_name, $newpath, $filename, $path_to_new_file) = @_; + my ($r, $newpath, $filename, $path_to_new_file) = @_; $r->print("Creating directories"); - my $path = '/home/'.$author_name.'/public_html/'; + +#Figure out if we are author or co-author + my ($role,$author_name,$domain)=©_author(); + + my $path = $r->dir_config('lonDocRoot')."/priv/$domain/$author_name/"; my @directories = split(/\//,$newpath); + foreach my $now_checking (@directories) { if($now_checking ne '') { $path = $path.'/'.$now_checking; @@ -158,11 +177,11 @@ sub copy_file { else { unless(mkdir($path, 02770)) { - $r->print(''.&mt('Error').': '.$!.''); + $r->print(''.&mt('Error:').' '.$!.'
'); return 0; } unless(chmod(02770, ($path))) { - $r->print(' '.&mt('Error').': '.$!.''); + $r->print(''.&mt('Error:').' '.$!.'
'); return 0; } } @@ -177,28 +196,86 @@ sub copy_file { print $fs $file_output; } $r->print("'. + &mt('Source code is displayed, but you can not copy to Authoring Space, as you do not have an author or co-author role on this server.'). + '
'.&mt('Close Window'). + ''. + &mt('Source code is displayed, but you can not copy to Authoring Space on this server.'). + '
'.&mt('Close Window'). + ''. + &mt('Unable to retrieve file contents.'). + '
'.&mt('Close Window').'' + ); } - my $rows = $count; - my $cols = $maxlength; - $r->print(''); - return OK; - + $r->print(&Apache::loncommon::end_page()); + return; } sub includemeta { @@ -215,7 +292,11 @@ sub includemeta { } else { $file_output=~s/(\<(?:html|problem)[^\>]*\>)/$1\n\/i; } - return $file_output; + if ($file_output eq '-1') { + return; + } else { + return $file_output; + } } sub handler { @@ -228,39 +309,27 @@ sub handler { if ($source ne 'open') { $env{'user.error.msg'}="$filename:cre:1:1:Source code not available"; return HTTP_NOT_ACCEPTABLE; - } - unless ((&Apache::lonnet::allowed('bre',$filename)) && - (&Apache::lonnet::allowed('cre','/'))) { + } + unless (&Apache::lonnet::allowed('bre',$filename)) { $env{'user.error.msg'}="$filename:bre:1:1:Access to resource denied"; return HTTP_NOT_ACCEPTABLE; - } + } + unless (&Apache::lonnet::allowed('cre','/')) { + $env{'user.error.msg'}="$filename:cre:1:1:Access to source code denied"; + return HTTP_NOT_ACCEPTABLE; + } &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; if ($env{'form.action'} eq 'stage2') { - my $author = &Apache::lonnet::metadata($filename,'authorspace'); - #strip the domain of the author name - if ($author =~ /:/) { - ($author) = split(/:/,$author); - } else { - ($author) = split(/@/,$author); - } - &stage_2($r, $env{'form.filename'}, $author, $listname); + &stage_2($r,$filename,$listname); } elsif($env{'form.action'} eq 'copy_stage') { - ©_stage($r, $filename,$env{'form.listname'},$env{'form.newpath'}); + ©_stage($r,$filename,$listname,$env{'form.newpath'}); } elsif($env{'form.action'} eq 'delete_confirm') { - &delete_copy_file($r, $env{'form.author'}, $env{'form.newpath'}, $env{'form.filename'}, $env{'form.path'}, '0'); + &delete_copy_file($r,$env{'form.newpath'},$filename, $env{'form.path'}, '0'); } else { - $r->print(''); - $r->print('