Bug 32437: Cleanup script
[srvgit] / tools / picture-upload.pl
index 868149e..1f4c62b 100755 (executable)
 use Modern::Perl;
 
 use File::Temp;
-use File::Copy;
 use CGI qw ( -utf8 );
 use GD;
+use MIME::Base64;
 use C4::Context;
-use C4::Auth;
-use C4::Output;
+use C4::Auth qw( get_template_and_user );
+use C4::Output qw( output_and_exit output_html_with_http_headers );
 use C4::Members;
 
 use Koha::Logger;
@@ -52,7 +52,8 @@ my ($template, $loggedinuser, $cookie)
 
 our $filetype      = $input->param('filetype') || '';
 my $cardnumber     = $input->param('cardnumber');
-our $uploadfilename = $input->param('uploadfile') || '';
+our $uploadfilename = $input->param('uploadfile') || $input->param('uploadfilename') || '';
+my $uploadfiletext = $input->param('uploadfiletext') || '';
 my $uploadfile     = $input->upload('uploadfile');
 my $borrowernumber = $input->param('borrowernumber');
 my $op             = $input->param('op') || '';
@@ -84,7 +85,7 @@ our @counts = ();
 our %errors = ();
 
 # Case is important in these operational values as the template must use case to be visually pleasing!
-if ( ( $op eq 'Upload' ) && $uploadfile ) {
+if ( ( $op eq 'Upload' ) && ($uploadfile || $uploadfiletext) ) {
 
     output_and_exit( $input, $cookie, $template, 'wrong_csrf_token' )
         unless Koha::Token->new->check_csrf({
@@ -101,18 +102,35 @@ if ( ( $op eq 'Upload' ) && $uploadfile ) {
       File::Temp::tempfile( SUFFIX => $filesuffix, UNLINK => 1 );
     my ( @directories, $results );
 
-    $errors{'NOTZIP'} = 1
-      if ( $uploadfilename !~ /\.zip$/i && $filetype =~ m/zip/i );
     $errors{'NOWRITETEMP'} = 1 unless ( -w $dirname );
-    $errors{'EMPTYUPLOAD'} = 1 unless ( length($uploadfile) > 0 );
+    if ( length($uploadfiletext) == 0 ) {
+        $errors{'NOTZIP'} = 1
+          if ( $uploadfilename !~ /\.zip$/i && $filetype =~ m/zip/i );
+        $errors{'EMPTYUPLOAD'} = 1 unless ( length($uploadfile) > 0 );
+    }
 
     if (%errors) {
         $template->param( ERRORS => [ \%errors ] );
         output_html_with_http_headers $input, $cookie, $template->output;
         exit;
     }
-    while (<$uploadfile>) {
-        print $tfh $_;
+
+    if ( length($uploadfiletext) == 0 ) {
+        while (<$uploadfile>) {
+            print $tfh $_;
+        }
+    } else {
+        # data type controlled in toDataURL() in template
+        if ( $uploadfiletext =~ /data:image\/jpeg;base64,(.*)/ ) {
+            my $encoded_picture = $1;
+            my $decoded_picture = decode_base64($encoded_picture);
+            print $tfh $decoded_picture;
+        } else {
+            $errors{'BADPICTUREDATA'} = 1;
+            $template->param( ERRORS => [ \%errors ] );
+            output_html_with_http_headers $input, $cookie, $template->output;
+            exit;
+        }
     }
     close $tfh;
     if ( $filetype eq 'zip' ) {
@@ -127,12 +145,13 @@ if ( ( $op eq 'Upload' ) && $uploadfile ) {
         }
         push @directories, "$dirname";
         foreach my $recursive_dir (@directories) {
-            opendir RECDIR, $recursive_dir;
-            while ( my $entry = readdir RECDIR ) {
+            my $recdir_h;
+            opendir $recdir_h, $recursive_dir;
+            while ( my $entry = readdir $recdir_h ) {
                 push @directories, "$recursive_dir/$entry"
                   if ( -d "$recursive_dir/$entry" and $entry !~ /^\./ );
             }
-            closedir RECDIR;
+            closedir $recdir_h;
         }
         foreach my $dir (@directories) {
             $results = handle_dir( $dir, $filesuffix, $template );
@@ -207,8 +226,9 @@ sub handle_dir {
         my ( $file, $filename );
         undef $cardnumber;
         $logger->debug("Passed a zip file.");
-        opendir DIR, $dir;
-        while ( my $filename = readdir DIR ) {
+        my $dir_h;
+        opendir $dir_h, $dir;
+        while ( my $filename = readdir $dir_h ) {
             $file = "$dir/$filename"
               if ( $filename =~ m/datalink\.txt/i
                 || $filename =~ m/idlink\.txt/i );
@@ -222,7 +242,9 @@ sub handle_dir {
             return \%direrrors;
         }
 
-        while ( my $line = <$fh> ) {
+        my @lines = <$fh>;
+        close $fh;
+        foreach my $line (@lines) {
             $logger->debug("Reading contents of $file");
             chomp $line;
             $logger->debug("Examining line: $line");
@@ -242,8 +264,7 @@ sub handle_dir {
             $source = "$dir/$filename";
             %counts = handle_file( $cardnumber, $source, $template, %counts );
         }
-        close $fh;
-        closedir DIR;
+        closedir $dir_h;
     }
     else {
         %counts = handle_file( $cardnumber, $source, $template, %counts );
@@ -270,7 +291,7 @@ sub handle_file {
         # Now process any imagefiles
         $logger->debug("Source: $source");
         my $size = ( stat($source) )[7];
-        if ( $size > 550000 ) {
+        if ( $size > 2097152 ) {
             # This check is necessary even with image resizing to avoid possible security/performance issues...
             $filerrors{'OVRSIZ'} = 1;
             push my @filerrors, \%filerrors;