--- loncom/cgi/decompress.pl	2003/10/18 17:42:45	1.2
+++ loncom/cgi/decompress.pl	2008/11/28 20:42:20	1.17
@@ -1,7 +1,8 @@
 #!/usr/bin/perl
 #
-# 
+#
 # Copyright Michigan State University Board of Trustees
+# $Id
 #
 # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
 #
@@ -28,56 +29,75 @@
 # A CGI script that decompresses compressed files for mass uploading into
 # construction space
 ####
+use strict;
 use lib '/home/httpd/lib/perl';
-use LONCAPA::Configuration;
-use LONCAPA::loncgi();
+use Apache::lonnet;
+use Apache::lonlocal;
+use LONCAPA::loncgi;
 
-if(! &LONCAPA::loncgi::check_cookie_and_load_env()){
-	print "Content-type: text/html\n\n";
-	 print <<END;
-	 NO COOKIE!
-END
-}
-else
-{
-	$url = $ENV{'HTTP_REFERER'};
-	$url =~ m|/{2}|;
-	$url = $';
-	$url =~ m|/{1}|;
-	$referer = $`;
-	if($referer ne $ENV{'SERVER_NAME'})
-	{	print "Content-type: text/html\n\n";
-		print "You are trying something that is not allowed, go to the real homeserver and try again";
+my %location_of;
+foreach my $program ('tar','gunzip','bunzip2','unzip') {
+    foreach my $dir ('/bin/','/usr/bin/','/usr/local/bin/','/sbin/',
+		     '/usr/sbin/') {
+	if (-x $dir.$program) {
+	    $location_of{$program} = $dir.$program;
 	}
-	else
-	{
-		$url = $';	
-		$url =~ m|$ENV{'user.name'}/{1}|;
-		$url = $';
-		$url =~ m|\?{1}|;
-		$url = $`;
-		$path ="/home/$ENV{'user.name'}/public_html/";
-		$back_path = "";
-		while($url =~ m|/|)
-		{
-			$path .= $`;
-			$back_path .= $`;
-			$path .= "/";
-			$back_path .= "/";
-			$url = $';
-		}
-		chdir $path;
-		$filename=$url;
-		if($url =~ m|zip|){system "unzip -qq $filename &> /dev/null";}
-		elsif($url =~ m|tar.gz|){system "tar -zxpvf $filename &> /dev/null";}
-		elsif($url =~ m|tar.bz2|){system "tar -jxpvf $filename &> /dev/null";}
-		elsif($url =~ m|bz2|){system "bunzip2 $filename &> /dev/null";}
-		elsif($url =~ m|tgz|){system "tar -zxpvf $filename &> /dev/null";}
-		elsif($url =~ m|gz|){system "gunzip $filename &> /dev/null";}
-		elsif($url =~ m|tar|){system "tar -xpvf $filename &> /dev/null";}
+    }
+}
+
+print("Content-type: text/html\n\n");
+
+if (!&LONCAPA::loncgi::check_cookie_and_load_env()) {
+    &Apache::lonlocal::get_language_handle();
+    print(&LONCAPA::loncgi::missing_cookie_msg());
+} else {
+    &Apache::lonlocal::get_language_handle();
+    my %lt = &Apache::lonlocal::texthash (
+                                            bade => 'Bad Environment!',
+                                            outo => 'Output of decompress:',
+                                            comp => 'Decompress complete.', 
+                                            erro => 'An error occurred',
+                                         );
+    my $file=$Apache::lonnet::env{'cgi.file'};
+    my $dir=$Apache::lonnet::env{'cgi.dir'}; 
+    if(! $file || ! $dir) {
+        print(<<END);
+        <html><body><span class="LC_error">$lt{'bade'}</span></body></html>
+END
+    } else {
+        print(<<END);
+	<html><body><p><b>$lt{'outo'}</b></p>
+END
+        chdir($dir);
+	my @cmd;
+        if ($file =~ m|\.zip$|) {
+            @cmd = ($location_of{'unzip'},"-o");
+        } elsif ($file =~ m|\.tar\.gz$|
+		 || $file =~ m|\.tgz$| ) {
+            @cmd = ($location_of{'tar'},"-zxpvf");
+        } elsif ($file =~ m|\.tar\.bz2$|) {
+            @cmd = ($location_of{'tar'},"-jxpvf");
+        } elsif ($file =~ m|\.bz2$|) {
+            @cmd = ($location_of{'bunzip2'});
+        } elsif ($file =~ m|\.gz$|) {
+	    @cmd = ($location_of{'gunzip'});
+        } elsif ($file =~ m|\.tar$|) {
+            @cmd = ($location_of{'tar'},"-xpvf");
+        } else {
+            print('<span class="LC_error">'.&Apache::lonlocal::mt('There has been an error in determining the file type of [_1], please check the name',$file).'</span>');
+        }
+	if (@cmd) {
+	    undef($!);
+	    undef($@);
+	    open(OUTPUT,"-|", @cmd, $file);
+	    while (my $line = <OUTPUT>) { print("$line<br />"); }
+	    close(OUTPUT);
+	    print("<p><b>$lt{'comp'}</b></p>");
+	    if ($! || $@) {
+		print('<p><span class="LC_error">'.$lt{'erro'}.'<br />'.$!.'<br />'.$@.'</span></p>');
+	    }
 	}
-	
+        print('</body></html>');
+    }
 }
-print "Content-type: text/html\n\n";
-print '<META http-equiv="refresh" content="0; URL=';
-print "http://$ENV{'SERVER_NAME'}/~$ENV{'user.name'}/$back_path"; print '" >'; 
\ No newline at end of file
+