[LON-CAPA-cvs] cvs: loncom /interface portfolio.pm

banghart lon-capa-cvs@mail.lon-capa.org
Wed, 25 Aug 2004 18:48:26 -0000


banghart		Wed Aug 25 14:48:26 2004 EDT

  Modified files:              
    /loncom/interface	portfolio.pm 
  Log:
  
  	Does not allow overwriting existing file when uploading. 
  	User instead receives this message:
  	Unable to upload $filename, a file by that name was found in $path
  	To upload, rename or delete existing $filename in $path.
  	
  
  
  
Index: loncom/interface/portfolio.pm
diff -u loncom/interface/portfolio.pm:1.32 loncom/interface/portfolio.pm:1.33
--- loncom/interface/portfolio.pm:1.32	Wed Aug 25 13:30:49 2004
+++ loncom/interface/portfolio.pm	Wed Aug 25 14:48:26 2004
@@ -266,6 +266,19 @@
 	      $ENV{'form.currentpath'}.'" />');
 }
 
+sub clean_filename {
+    my ($fname)=@_;
+# Replace Windows backslashes by forward slashes
+    $fname=~s/\\/\//g;
+# Get rid of everything but the actual filename
+    $fname=~s/^.*\/([^\/]+)$/$1/;
+# Replace spaces by underscores
+    $fname=~s/\s+/\_/g;
+# Replace all other weird characters by nothing
+    $fname=~s/[^\w\.\-]//g;
+    return $fname;
+}
+
 sub close_form {
     my ($r)=@_;
     $r->print('<p><input type="submit" value="'.&mt('Continue').
@@ -377,11 +390,33 @@
     my ($r)=@_;
     #FIXME if the file already exists we need to do a confirmation pass 
     #before overwriting
-    my $result=&Apache::lonnet::userfileupload('uploaddoc','',
-					 'portfolio'.$ENV{'form.currentpath'});
-    if ($result !~ m|^/uploaded/|) {
-	$r->print('<font color="red"> An errror occured ('.$result.
-		  ') while trying to upload '.&display_file().'</font><br />');
+    my $fname=$ENV{'form.uploaddoc.filename'};
+    $fname=&clean_filename($fname);
+   	my $portfolio_root = &Apache::loncommon::propath($ENV{'user.domain'},
+						 $ENV{'user.name'}).
+						'/userfiles/portfolio';
+	my @dir_list=&Apache::lonnet::dirlist($ENV{'form.currentpath'},
+					    $ENV{'user.domain'},
+					    $ENV{'user.name'},$portfolio_root);
+  	my $found_file = 0;
+    foreach my $line (@dir_list) {
+    	#$strip holds directory/file name
+    	#$dom 
+    	my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef)=split(/\&/,$line,16); 
+        if ($filename eq $fname){
+            $found_file = 1;
+        }
+    }
+    if ($found_file){   
+        $r->print('<font color="red">Unable to upload <strong>'.$fname.'</strong>, a file by that name was found in <strong>'.$ENV{'form.currentpath'}.'</strong></font>'.
+                  '<br />To upload, rename or delete existing '.$fname.' in '.$ENV{'form.currentpath'});
+    } else {
+        my $result=&Apache::lonnet::userfileupload('uploaddoc','',
+	        	 'portfolio'.$ENV{'form.currentpath'});
+        if ($result !~ m|^/uploaded/|) {
+        	$r->print('<font color="red"> An errror occured ('.$result.
+		              ') while trying to upload '.&display_file().'</font><br />');
+        }
     }
     $r->print(&done());
 }
@@ -409,6 +444,9 @@
 sub handler {
     # this handles file management
     my $r = shift;
+	my $portfolio_root = &Apache::loncommon::propath($ENV{'user.domain'},
+							 $ENV{'user.name'}).
+							'/userfiles/portfolio';
     &Apache::loncommon::no_cache($r);
     &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;
@@ -443,10 +481,6 @@
 	if ($ENV{'form.currentpath'}) {
 	    $current_path = $ENV{'form.currentpath'};
 	}
-
-	my $portfolio_root = &Apache::loncommon::propath($ENV{'user.domain'},
-							 $ENV{'user.name'}).
-							'/userfiles/portfolio';
 	my @dir_list=&Apache::lonnet::dirlist($current_path,
 					    $ENV{'user.domain'},
 					    $ENV{'user.name'},$portfolio_root);