--- loncom/publisher/lonpublisher.pm 2011/10/26 15:05:25 1.273
+++ loncom/publisher/lonpublisher.pm 2014/08/03 13:52:59 1.292
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Publication Handler
#
-# $Id: lonpublisher.pm,v 1.273 2011/10/26 15:05:25 www Exp $
+# $Id: lonpublisher.pm,v 1.292 2014/08/03 13:52:59 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -66,10 +66,10 @@ invocation by F:
=head1 OVERVIEW
-Authors can only write-access the C~authorname/> space. They can
-copy resources into the resource area through the publication step,
-and move them back through a recover step. Authors do not have direct
-write-access to their resource space.
+Authors can only write-access the C space.
+They can copy resources into the resource area through the
+publication step, and move them back through a recover step.
+Authors do not have direct write-access to their resource space.
During the publication step, several events will be
triggered. Metadata is gathered, where a wizard manages default
@@ -102,8 +102,6 @@ to publication space.
Many of the undocumented subroutines implement various magical
parsing shortcuts.
-=over 4
-
=cut
######################################################################
@@ -121,7 +119,6 @@ use HTML::LCParser;
use HTML::Entities;
use Encode::Encoder;
use Apache::lonxml;
-use Apache::loncacc;
use DBI;
use Apache::lonnet;
use Apache::loncommon();
@@ -150,6 +147,8 @@ my $lock;
=pod
+=over 4
+
=item B
Evaluates a string that contains metadata. This subroutine
@@ -469,7 +468,7 @@ Currently undocumented
#########################################
#########################################
sub set_allow {
- my ($allow,$logfile,$target,$tag,$oldurl)=@_;
+ my ($allow,$logfile,$target,$tag,$oldurl,$type)=@_;
my $newurl=&urlfixup($oldurl,$target);
my $return_url=$oldurl;
print $logfile 'GUYURL: '.$tag.':'.$oldurl.' - '.$newurl."\n";
@@ -481,6 +480,11 @@ sub set_allow {
($newurl !~ /^mailto:/i) &&
($newurl !~ /^(?:http|https|ftp):/i) &&
($newurl !~ /^\#/)) {
+ if (($type eq 'src') || ($type eq 'href')) {
+ if ($newurl =~ /^([^?]+)\?[^?]*$/) {
+ $newurl = $1;
+ }
+ }
$$allow{&absoluteurl($newurl,$target)}=1;
}
return $return_url;
@@ -722,9 +726,11 @@ sub fix_ids_and_indices {
foreach my $type ('src','href','background','bgimg') {
foreach my $key (keys(%parms)) {
if ($key =~ /^$type$/i) {
+ next if (($lctag eq 'img') && ($type eq 'src') &&
+ ($parms{$key} =~ m{^data\:image/gif;base64,}));
$parms{$key}=&set_allow(\%allow,$logfile,
$target,$tag,
- $parms{$key});
+ $parms{$key},$type);
}
}
}
@@ -791,10 +797,69 @@ sub fix_ids_and_indices {
}
if (!$endtag) { if ($token->[4]=~m:/>$:) { $endtag=' /'; }; }
$outstring.='<'.$tag.$newparmstring.$endtag.'>';
- if ($lctag eq 'm' || $lctag eq 'script' || $lctag eq 'answer'
- || $lctag eq 'display' || $lctag eq 'tex') {
+ if ($lctag eq 'm' || $lctag eq 'answer' || $lctag eq 'display' ||
+ $lctag eq 'tex') {
$outstring.=&get_all_text_unbalanced('/'.$lctag,\@parser);
- }
+ } elsif ($lctag eq 'script') {
+ if ($parms{'type'} eq 'loncapa/perl') {
+ $outstring.=&get_all_text_unbalanced('/'.$lctag,\@parser);
+ } else {
+ my $script = &get_all_text_unbalanced('/'.$lctag,\@parser);
+ if ($script =~ m{\.set\w+(Src|Swf)\(["']}i) {
+ my @srcs = split(/\.set/i,$script);
+ if (scalar(@srcs) > 1) {
+ foreach my $item (@srcs) {
+ if ($item =~ m{^(FlashPlayerSwf|MediaSrc|XMPSrc|ConfigurationSrc|PosterImageSrc)\((['"])(?:(?!\2).)+\2\)}is) {
+ my $srctype = $1;
+ my $quote = $2;
+ my ($url) = ($item =~ m{^\Q$srctype($quote\E([^$quote]+)\Q$quote)\E});
+ $url = &urlfixup($url);
+ unless ($url=~m{^(?:http|https|ftp)://}) {
+ $allow{&absoluteurl($url,$target)}=1;
+ if ($srctype eq 'ConfigurationSrc') {
+ if ($url =~ m{^(.+/)configuration_express\.xml$}) {
+#
+# Camtasia 8.1: express_show/spritesheet.png needed, and included in zip archive.
+# Not referenced directly in .html or _player.html files,
+# so add this file to %allow (where is name user gave to file/archive).
+#
+ my $spritesheet = $1.'express_show/spritesheet.png';
+ $allow{&absoluteurl($spritesheet,$target)}=1;
+ }
+ } elsif ($srctype eq 'PosterImageSrc') {
+ if ($url =~ m{^(.+)_First_Frame\.png$}) {
+ my $prefix = $1;
+#
+# Camtasia 8.1: _Thumbnails.png needed, and included in zip archive.
+# Not referenced directly in .html or _player.html files,
+# so add this file to %allow (where is name user gave to file/archive).
+#
+ my $thumbnail = $prefix.'_Thumbnails.png';
+ $allow{&absoluteurl($thumbnail,$target)}=1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if ($script =~ /\(document,\s*(['"])script\1,\s*\[([^\]]+)\]\);/s) {
+ my $scriptslist = $2;
+ my @srcs = split(/\s*,\s*/,$scriptslist);
+ foreach my $src (@srcs) {
+ if ($src =~ /(["'])(?:(?!\1).)+\.js\1/) {
+ my $quote = $1;
+ my ($url) = ($src =~ m/\Q$quote\E([^$quote]+)\Q$quote\E/);
+ $url = &urlfixup($url);
+ unless ($url=~m{^(?:http|https|ftp)://}) {
+ $allow{&absoluteurl($url,$target)}=1;
+ }
+ }
+ }
+ }
+ $outstring .= $script;
+ }
+ }
} elsif ($token->[0] eq 'E') {
if ($token->[2]) {
unless ($token->[1] eq 'allow') {
@@ -1017,6 +1082,11 @@ sub publish {
$outdep.= ' - '.&mt('Currently not available').
'';
} else {
+#
+# Store the fact that the dependency has been used by the target file
+# Unfortunately, usage is erroneously named sequsage in lonmeta.pm
+# The translation happens in lonmetadata.pm
+#
my %temphash=(&Apache::lonnet::declutter($target).'___'.
&Apache::lonnet::declutter($thisdep).'___usage'
=> time);
@@ -1480,6 +1550,8 @@ Returns:
0: fail
1: success
+=back
+
=cut
#'stupid emacs
@@ -1770,21 +1842,17 @@ sub phasetwo {
my $thissrcdir=$thissrc;
$thissrcdir=~s/\/[^\/]+$/\//;
- $r->print(&Apache::loncommon::head_subbox(
- &Apache::lonhtmlcommon::start_funclist().
- &Apache::lonhtmlcommon::add_item_funclist(
+ $r->print(
+ &Apache::lonhtmlcommon::actionbox([
''.
&mt('View Published Version').
- '').
- &Apache::lonhtmlcommon::add_item_funclist(
+ '',
''.
&mt('Back to Source').
- '').
- &Apache::lonhtmlcommon::add_item_funclist(
+ '',
''.
&mt('Back to Source Directory').
- '').
- &Apache::lonhtmlcommon::end_funclist())
+ ''])
);
}
return 1;
@@ -1880,8 +1948,9 @@ sub publishdirectory {
$thisdisfn=~s/\/+/\//g;
my $thisdisresdir=$thisdisfn;
$thisdisresdir=~s/^\/priv\//\/res\//;
- my $resdir='/home/httpd/html'.$thisdisresdir;
- $r->print(&Apache::lonhtmlcommon::start_pick_box()
+ my $resdir = $r->dir_config('lonDocRoot').$thisdisresdir;
+ $r->print('');
+ &checkbox('forceoverride','force directory level metadata over existing')
+ );
$r->print(&Apache::lonhtmlcommon::row_closure(1)
.&Apache::lonhtmlcommon::end_pick_box()
+ .' '
);
$lock=0;
} else {
@@ -1925,7 +1994,7 @@ sub publishdirectory {
if ($filename=~/\.(\w+)$/) { $extension=$1; }
if ($cmode&$dirptr) {
if (($filename!~/^\./) && ($env{'form.pubrec'})) {
- &publishdirectory($r,$docroot.$fn.'/'.$filename,$thisdisfn.'/'.$filename);
+ &publishdirectory($r,$fn.'/'.$filename,$thisdisfn.'/'.$filename);
}
} elsif ((&Apache::loncommon::fileembstyle($extension) ne 'hdn') &&
($filename!~/^[\#\.]/) && ($filename!~/\~$/)) {
@@ -2014,7 +2083,7 @@ sub defaultmetapublish {
$r->print($reply.'
');$r->rflush;
}
# ------------------------------------------------------------------- Link back
- $r->print("".&mt('Back to Metadata').'');
+ $r->print("".&mt('Back to Metadata').'');
$r->print(&Apache::loncommon::end_page());
return OK;
}
@@ -2078,7 +2147,7 @@ sub handler {
# -------------------------------------------------------------- Check filename
my $fn=&unescape($env{'form.filename'});
- ($cuname,$cudom)=&Apache::loncacc::constructaccess($fn);
+ ($cuname,$cudom)=&Apache::lonnet::constructaccess($fn);
# ----------------------------------------------------- Do we have permissions?
unless (($cuname) && ($cudom)) {
$r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
@@ -2143,8 +2212,8 @@ sub handler {
# Breadcrumbs
&Apache::lonhtmlcommon::clear_breadcrumbs();
&Apache::lonhtmlcommon::add_breadcrumb({
- 'text' => 'Construction Space',
- 'href' => &Apache::loncommon::authorspace(),
+ 'text' => 'Authoring Space',
+ 'href' => &Apache::loncommon::authorspace($fn),
});
&Apache::lonhtmlcommon::add_breadcrumb({
'text' => 'Resource Publication',
@@ -2157,7 +2226,7 @@ sub handler {
$r->print(&Apache::loncommon::start_page('Resource Publication',$js)
.&Apache::lonhtmlcommon::breadcrumbs()
.&Apache::loncommon::head_subbox(
- &Apache::loncommon::CSTR_pageheader()) # FIXME crumbs broken?
+ &Apache::loncommon::CSTR_pageheader($docroot.$fn))
);
my $thisdisfn=&HTML::Entities::encode($fn,'<>&"');
@@ -2168,7 +2237,10 @@ sub handler {
if ($fn=~/\/$/) {
# -------------------------------------------------------- This is a directory
&publishdirectory($r,$docroot.$fn,$thisdisfn);
- $r->print(''.&mt('Return to Directory').'');
+ $r->print(
+ '
'.
+ &Apache::lonhtmlcommon::actionbox([
+ ''.&mt('Return to Directory').'']));
} else {
# ---------------------- Evaluate individual file, and then output information.
$fn=~/\.(\w+)$/;
@@ -2218,7 +2290,7 @@ ENDCAPTION
$r->print(&Apache::lonhtmlcommon::row_closure()
.&Apache::lonhtmlcommon::row_title(&mt('Diffs')));
$r->print(<
+
ENDDIFF
$r->print(&mt('Diffs with Current Version').'');
}
@@ -2260,7 +2332,5 @@ __END__
=back
-=back
-
=cut