[LON-CAPA-cvs] cvs: loncom /xml londefdef.pm scripttag.pm
raeburn
raeburn at source.lon-capa.org
Thu Sep 26 18:03:36 EDT 2013
raeburn Thu Sep 26 22:03:36 2013 EDT
Modified files:
/loncom/xml scripttag.pm londefdef.pm
Log:
- Access to dependencies/links in HTML files uploaded directly to a course,
where dependency or linked item was also uploaded directly to the same
course.
- Code used to clean up relative paths and/or check for valid absolute path
moved from within scripttag::start_script() to new subroutine:
londefdef::clean_docs_httpref() to facilitate reuse.
- Access can be granted to dependencies or linked items which are:
(a) referenced in src attribute of iframe tag
(b) referenced in src attribute of script tag (javascript)
(c) referenced in href attribute of a tag
(d) referenced in javascript object in text with <script></script>
via set.FlashPlayerSwf
set.MediaSrc
set.XMPSrc
set.ConfigurationSrc
set.PosterImageSrc
e.g., TSC.playerConfiguration.set.FlashPlayerSwf("somepath/file_controller.swf")
to support upload of Camtasia player directly to a course (Camtasia 8.1).
-------------- next part --------------
Index: loncom/xml/scripttag.pm
diff -u loncom/xml/scripttag.pm:1.166 loncom/xml/scripttag.pm:1.167
--- loncom/xml/scripttag.pm:1.166 Tue Aug 7 14:50:17 2012
+++ loncom/xml/scripttag.pm Thu Sep 26 22:03:36 2013
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# <script> definiton
#
-# $Id: scripttag.pm,v 1.166 2012/08/07 14:50:17 raeburn Exp $
+# $Id: scripttag.pm,v 1.167 2013/09/26 22:03:36 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -31,6 +31,8 @@
use strict;
use Apache::lonnet;
use Apache::lonlocal;
+use Apache::lonxml();
+use Apache::londefdef();
use Apache::style();
#Globals
@@ -129,32 +131,30 @@
$result.=$bodytext;
if ($type eq "text/javascript") {
my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
- if (($src =~ /\.js$/) && ($src !~ m{^(/|https?://)})) {
- my ($path,$scriptname) = ($src =~ m{^(.+)/([^/]*)$});
- my $docuri =
- $Apache::lonnet::env{'request.noversionuri'};
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- if ($docuri =~ m{^(\Q/uploaded/$cdom/$cnum\E)/(docs/.*/)[^/]+$}) {
- my $prefix = $1;
- my $relpath = $2;
- my $cleanrelpath;
- foreach my $dir (split(/\//,$relpath.$path)) {
- next if ($dir eq '.');
- if ($dir eq '..') {
- $cleanrelpath =~ s{([^/]+/)$}{};
- } else {
- $cleanrelpath .= $dir.'/';
- }
- }
- $cleanrelpath =~ s{/$}{};
- if ($cleanrelpath ne '') {
- $src = $prefix.'/'.$cleanrelpath.'/'.$scriptname;
- } else {
- $src = $prefix.'/'.$scriptname;
+ my $url=&Apache::lonnet::hreflocation('',$env{'request.filename'});
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ if ($src =~ /\.js$/) {
+ if ($src !~ m{^(/|https?://)}) {
+ my $cleanhref = &Apache::londefdef::clean_docs_httpref($src,$url,$cdom,$cnum);
+ if ($cleanhref) {
+ &Apache::lonxml::extlink($cleanhref);
}
- if ($src ne '') {
- &Apache::lonxml::extlink($src);
+ }
+ } elsif (($src eq '') && ($bodytext ne '')) {
+ if ($url =~ m{^\Q/uploaded/$cdom/$cnum/docs/\E}) {
+ if ($bodytext =~ m{\.set\w+(Src|Swf)\(["']}i) {
+ my @srcs = split(/\.set/,$bodytext);
+ if (@srcs > 1) {
+ foreach my $item (@srcs) {
+ if ($item =~ m{^(?:FlashPlayerSwf|MediaSrc|XMPSrc|ConfigurationSrc|PosterImageSrc)\(['"])([^$1]+)$1\)}is) {
+ my $cleanhref = &Apache::londefdef::clean_docs_httpref($2,$url,$cdom,$cnum);
+ if ($cleanhref) {
+ &Apache::lonxml::extlink($cleanhref);
+ }
+ }
+ }
+ }
}
}
}
Index: loncom/xml/londefdef.pm
diff -u loncom/xml/londefdef.pm:1.446 loncom/xml/londefdef.pm:1.447
--- loncom/xml/londefdef.pm:1.446 Sun Sep 22 15:35:45 2013
+++ loncom/xml/londefdef.pm Thu Sep 26 22:03:36 2013
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Tags Default Definition Module
#
-# $Id: londefdef.pm,v 1.446 2013/09/22 15:35:45 raeburn Exp $
+# $Id: londefdef.pm,v 1.447 2013/09/26 22:03:36 raeburn Exp $
#
#
# Copyright Michigan State University Board of Trustees
@@ -1728,6 +1728,15 @@
if (!&Apache::lonnet::allowed('bre',$linkurl)) {
if (&Apache::lonnet::is_on_map($url)) {
&Apache::lonxml::extlink($linkurl);
+ } elsif ($env{'request.course.id'}) {
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ if ($linkurl =~ m{^([^/]|/uploaded/$cdom/$cnum/docs/)}) {
+ my $cleanhref = &Apache::londefdef::clean_docs_httpref($linkurl,$url,$cdom,$cnum);
+ if ($cleanhref) {
+ &Apache::lonxml::extlink($cleanhref);
+ }
+ }
}
}
}
@@ -3610,6 +3619,23 @@
} else {
$currentstring = $token->[4];
}
+ if (($url !~ m{^https?://}) && ($env{'request.course.id'})) {
+ my $docuri = &Apache::lonnet::hreflocation('',$env{'request.filename'});
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ if ($url =~ m{^([^/]|/uploaded/)}) {
+ my $cleanhref = &Apache::londefdef::clean_docs_httpref($url,$docuri,$cdom,$cnum);
+ if ($cleanhref) {
+ &Apache::lonxml::extlink($cleanhref);
+ }
+ } elsif (($url =~ m{/res/$LONCAPA::domain_re/}) && ($docuri =~ m{^\Q/uploaded/$cdom/$cnum/docs/\E})) {
+ if (!&Apache::lonnet::allowed('bre',$url)) {
+ if (&Apache::lonnet::is_on_map($url)) {
+ &Apache::lonxml::extlink($url);
+ }
+ }
+ }
+ }
}
} else {
$currentstring = $token->[4];
@@ -4562,6 +4588,54 @@
}
+sub clean_docs_httpref {
+ my ($href,$docuri,$cdom,$cnum) = @_;
+ if ($docuri eq '') {
+ &Apache::lonnet::hreflocation('',$env{'request.filename'});
+ }
+ if ($cdom eq '') {
+ $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ }
+ if ($cnum eq '') {
+ $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ }
+ my $cleanhref;
+ if ($docuri =~ m{^(\Q/uploaded/$cdom/$cnum/docs/\E)(.+/)[^/]+$}) {
+ my $prefix = $1;
+ my $relpath = $2;
+ my ($hrefpath,$fname);
+ if ($href =~ m{^/}) {
+ if ($href =~ m{^\Q$prefix\E(.+/)([^/]+)$}) {
+ $hrefpath = $1;
+ $fname = $2;
+ } else {
+ return $cleanhref;
+ }
+ } else {
+ (my $path,$fname) = ($href =~ m{^(.+)/([^/]*)$});
+ $hrefpath = $relpath.$path;
+ }
+ if ($fname ne '') {
+ my $cleanrelpath;
+ foreach my $dir (split(/\//,$hrefpath)) {
+ next if ($dir eq '.');
+ if ($dir eq '..') {
+ $cleanrelpath =~ s{([^/]+/)$}{};
+ } else {
+ $cleanrelpath .= $dir.'/';
+ }
+ }
+ $cleanrelpath =~ s{/$}{};
+ if ($cleanrelpath ne '') {
+ $cleanhref = $prefix.'/'.$cleanrelpath.'/'.$fname;
+ } else {
+ $cleanhref = $prefix.'/'.$fname;
+ }
+ }
+ }
+ return $cleanhref;
+}
+
=pod
=head1 NAME
@@ -4656,7 +4730,22 @@
I'm in a table....
}
-
+=item clean_docs_httpref($href,$docuri,$cdom,$cnum)
+ HTML pages uploaded to a course which contain dependencies either from iframes,
+ javascript files or objects (FlashPlayerSwf, MediaSrc, XMPSrc, ConfigurationSrc,
+ and PosterImageSrc) for which dependency is another file uploaded to the same
+ course.
+
+ Required input:
+ href - dependency (either a relative URL, or an absolute URL)
+ Optional inputs:
+ docuri - URL of HTML page containing the dependency
+ cdom - Course domain
+ cnum - CourseID
+
+ Output:
+ returns an absolute URL constructed from the href provided, and the calling context.
+ (this will be null, if the URL does not begin: /uploaded/$cdom/$cnum/docs/).
=back
More information about the LON-CAPA-cvs
mailing list