* checkin with 3.2.0beta0 release header
[BackupPC.git] / lib / BackupPC / CGI / RestoreFile.pm
index 52f3e90..9af2df1 100644 (file)
@@ -10,7 +10,7 @@
 #   Craig Barratt  <cbarratt@users.sourceforge.net>
 #
 # COPYRIGHT
-#   Copyright (C) 2003  Craig Barratt
+#   Copyright (C) 2003-2007  Craig Barratt
 #
 #   This program is free software; you can redistribute it and/or modify
 #   it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@
 #
 #========================================================================
 #
-# Version 2.1.0beta1, released 9 Apr 2004.
+# Version 3.2.0beta0, released 5 April 2009.
 #
 # See http://backuppc.sourceforge.net.
 #
@@ -41,6 +41,7 @@ use BackupPC::CGI::Lib qw(:all);
 use BackupPC::FileZIO;
 use BackupPC::Attrib qw(:all);
 use BackupPC::View;
+use Encode qw/from_to decode_utf8/;
 
 sub action
 {
@@ -142,6 +143,8 @@ sub restoreFile
     if ( !$Privileged ) {
         ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_restore_backup_files2}}"));
     }
+    $bpc->ConfigRead($host);
+    %Conf = $bpc->Conf();
     ServerConnect();
     ErrorExit($Lang->{Empty_host_name}) if ( $host eq "" );
 
@@ -150,9 +153,14 @@ sub restoreFile
     my $view = BackupPC::View->new($bpc, $host, \@Backups);
     my $a = $view->fileAttrib($num, $share, $dir);
     if ( $dir =~ m{(^|/)\.\.(/|$)} || !defined($a) ) {
-        ErrorExit("Can't restore bad file ${EscHTML($dir)}");
+        $dir = decode_utf8($dir);
+        ErrorExit("Can't restore bad file ${EscHTML($dir)} ($num, $share)");
     }
     my $f = BackupPC::FileZIO->open($a->{fullPath}, 0, $a->{compress});
+    if ( !defined($f) ) {
+        my $fullPath = decode_utf8($a->{fullPath});
+        ErrorExit("Unable to open file ${EscHTML($fullPath)} ($num, $share)");
+    }
     my $data;
     if ( !$skipHardLink && $a->{type} == BPC_FTYPE_HARDLINK ) {
        #
@@ -164,7 +172,6 @@ sub restoreFile
         }
        $f->close;
        $linkName =~ s/^\.\///;
-       my $share = $1 if ( $dir =~ /^\/?(.*?)\// );
        restoreFile($host, $num, $share, $linkName, 1, $dir);
        return;
     }
@@ -175,9 +182,21 @@ sub restoreFile
                                    || "application/octet-stream";
     my $fileName = $1 if ( $dir =~ /.*\/(.*)/ );
     $fileName =~ s/"/\\"/g;
-    print "Content-Type: $contentType\n";
-    print "Content-Transfer-Encoding: binary\n";
-    print "Content-Disposition: attachment; filename=\"$fileName\"\n\n";
+
+    print "Content-Type: $contentType\r\n";
+    print "Content-Transfer-Encoding: binary\r\n";
+
+    if ( $ENV{HTTP_USER_AGENT} =~ /\bmsie\b/i
+                && $ENV{HTTP_USER_AGENT} !~ /\bopera\b/i ) {
+        #
+        # Convert to cp1252 for MS IE.  TODO: find a way to get IE
+        # to accept UTF8 encoding.  Firefox accepts inline encoding
+        # using the "=?UTF-8?B?base64?=" format, but IE doesn't.
+        #
+        from_to($fileName, "utf8", "cp1252")
+                        if ( $Conf{ClientCharset} ne "" );
+    }
+    print "Content-Disposition: attachment; filename=\"$fileName\"\r\n\r\n";
     while ( $f->read(\$data, 1024 * 1024) > 0 ) {
         print STDOUT $data;
     }