Dateimanagement: Fehler beim Umbenennen richtig zurückgeben
authorMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 1 Mar 2017 13:16:31 +0000 (14:16 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 1 Mar 2017 13:25:28 +0000 (14:25 +0100)
Ist man z.B. bei den Artikelstammdaten und versucht, eine Datei
umzubenennen, und ändert den Namen nicht, so sollte eine Fehlermeldung
angezeigt werden. Wurde sie aber nicht, weil Folgendes passierte:

• Im ClientJS-Flash wird Fehlermeldung erzeugt und das ClientJS sofort
  gerendert, anschließend mit »return« der innerste Block verlassen
• Der innerste Block ist aber ein »eval { … }«, und nicht die Funktion
  selber. Daher geht der Kontrollfluss nach dem »eval« weiter. Dabei
  werden mehr Sachen auf das ClientJS raufgepusht und aschließend
  erneut gerendert.

Dieses zweite Rendern schreibt dann erneut HTTP-Response-Zeilen sowie
ein vollständiges Array von ClientJS-Aktionen.

Der JavaScript-Code auf der Browser-Seite bekommen somit:

• HTTP-Response-Zeilen #1
• ClientJS-Array #1
• HTTP-Response-Zeilen #2
• ClientJS-Array #2

Damit kann er natürlich nicht umgehen, ignoriert die komplette
Antwort, und die Fehlermeldung wird somit nicht angezeigt.

Der Fix ist, nur das Umbenennen innerhalb des »eval« zu machen, und
den Rückgabewert außerhalb des »eval« zu prüfen. Bei einem anderen
Wert als SL::File::RENAME_OK wird das ClientJS dann nur einmal
gerendert und anschließend die Funktion verlassen.

SL/Controller/File.pm

index 8d2e9f2..add213b 100644 (file)
@@ -173,21 +173,25 @@ sub action_ajax_rename {
 
   } else {
     # normal rename
+    my $res;
+
     eval {
-      my $res = $file->rename($::form->{to});
+      $res = $file->rename($::form->{to});
       $main::lxdebug->message(LXDebug->DEBUG2(), "rename result=".$res);
-      if ($res > SL::File::RENAME_OK) {
-        $self->js->flash('error',
-                         $res == SL::File::RENAME_EXISTS      ? $::locale->text('File still exists !')
-                       : $res == SL::File::RENAME_SAME        ? $::locale->text('Same Filename !')
-                       :                                        $::locale->text('File not exists !'))->render;
-        return 1;
-      }
       1;
     } or do {
       $self->js->flash(       'error', t8('internal error (see details)'))
                ->flash_detail('error', $@)->render;
       return;
+    };
+
+    if ($res != SL::File::RENAME_OK) {
+      $self->js->flash('error',
+                         $res == SL::File::RENAME_EXISTS ? $::locale->text('File still exists !')
+                       : $res == SL::File::RENAME_SAME   ? $::locale->text('Same Filename !')
+                       :                                   $::locale->text('File not exists !'))
+        ->render;
+      return;
     }
   }
   $self->is_global($::form->{is_global});