[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