--- loncom/interface/lonsource.pm 2011/10/31 01:16:59 1.27 +++ loncom/interface/lonsource.pm 2012/04/21 02:48:24 1.28 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Source Code handler # -# $Id: lonsource.pm,v 1.27 2011/10/31 01:16:59 raeburn Exp $ +# $Id: lonsource.pm,v 1.28 2012/04/21 02:48:24 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) = @_; @@ -201,23 +201,81 @@ sub copy_file { } sub print_item { - my ($r, $filename) = @_; - my $file_output = &includemeta(&Apache::lonnet::getfile($Apache::lonnet::perlvar{'lonDocRoot'}.$filename),$filename); - my $count=0; - my $maxlength=-1; - foreach (split ("\n", $file_output)) { - $count+=int(length($_)/79); - $count++; - if (length($_) > $maxlength) { - $maxlength = length($_); + my ($r,$filename,$listname) = @_; + my $file_output = + &includemeta(&Apache::lonnet::getfile($Apache::lonnet::perlvar{'lonDocRoot'}.$filename), + $filename); + $r->print(&Apache::loncommon::start_page('View Source Code',undef, + {'only_body' => 1})); + if ($file_output ne '') { + my $access_to_cstr; + my $lonhost = $r->dir_config('lonHostID'); + if (&Apache::lonnet::is_library($lonhost)) { + my @possdoms = &Apache::lonnet::current_machine_domains(); + foreach my $dom (@possdoms) { + if ($env{"user.role.au./$dom/"}) { + $access_to_cstr = 1; + last; + } + } + unless ($access_to_cstr) { + foreach my $key (keys(%env)) { + if ($key =~ m{^\Quser.role.ca./\E($match_domain)/}) { + my $adom = $1; + if (grep(/^\Q$adom\E$/,@possdoms)) { + $access_to_cstr = 1; + last; + } + } + } + } + if ($access_to_cstr) { + $r->print(' +
+ + + + + +

+ '); + } else { + $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'). + '

' + ); + } + } else { + $r->print('

'. + &mt('Source code is displayed, but you can not copy to Authoring Space on this server.'). + '

'.&mt('Close Window'). + '

' + ); + + } + my $count=0; + my $maxlength=-1; + foreach (split ("\n", $file_output)) { + $count+=int(length($_)/79); + $count++; + if (length($_) > $maxlength) { + $maxlength = length($_); + } } + my $rows = $count; + my $cols = $maxlength; + $r->print('
'."\n". + '
'); + } else { + $r->print('

'. + &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 { @@ -234,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 { @@ -247,32 +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') { - &stage_2($r, $filename,$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.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('
'); - &print_item($r, $env{'form.filename'}); + &print_item($r,$filename,$listname); } return OK; }