From a6ed938f30a84e83a62432aa8ecd10f057efe677 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Wed, 1 Mar 2017 14:16:31 +0100 Subject: [PATCH] =?utf8?q?Dateimanagement:=20Fehler=20beim=20Umbenennen=20?= =?utf8?q?richtig=20zur=C3=BCckgeben?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/SL/Controller/File.pm b/SL/Controller/File.pm index 8d2e9f2bd..add213b04 100644 --- a/SL/Controller/File.pm +++ b/SL/Controller/File.pm @@ -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}); -- 2.20.1