Fix lost form submissions on archives, the unlocked update finish and six more
Update Symfony to 7.4.23 (12 advisories in 8 packages). - A form can be sent from /beitraege, /kategorie/... and /schlagwort/...; it answered 404 before anything was stored or mailed. - Booleans reach the database as integers, so MySQL in strict mode accepts form submissions, task switches and plugin states. - A stepped form with a required multiple choice shows its message instead of stopping on a TypeError. - The second update step runs under the update lock; a concurrent finish no longer rolls a successful update back. - Accordion entries and gallery images can be selected from the editor panel again. - Category and tag names are escaped in the archive heading. - Restoring a published page from the bin needs the publisher role. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
This commit is contained in:
1 parent
441e629e80
commit
d464c82ac8
17 files changed
+324
-168
No files matched your search
@@ -311,6 +311,31 @@ final class ArchiveUpdateTest extends TestCase
|
||||
self::assertFileDoesNotExist($this->root.'/'.Updater::MAINTENANCE_FILE);
|
||||
}
|
||||
|
||||
public function testASecondFinishWhileOneRunsDoesNotSwitchBack(): void
|
||||
{
|
||||
// Meta-Refresh und der Link „Weiter, falls nichts passiert“ können den Abschluss zweimal
|
||||
// anstoßen. Der zweite darf nichts tun - vorher scheiterte er an der laufenden Migration
|
||||
// und schaltete ein gelungenes Update zurück.
|
||||
$this->releases->release(self::BASE, self::API, '1.1.0', $this->archive('1.1.0'));
|
||||
self::assertTrue($this->updater()->run()['ok']);
|
||||
$sperre = (new Updater($this->root, 'sqlite:///'.$this->root.'/var/cms.db', new CommandRunner(), $this->db))->lock();
|
||||
self::assertNotNull($sperre);
|
||||
|
||||
$zweiter = $this->updater()->finish($this->installation(), static fn (): string => 'würde zurückschalten');
|
||||
|
||||
self::assertTrue($zweiter['laeuft'] ?? false);
|
||||
self::assertSame('1.1.0', trim((string) file_get_contents($this->root.'/VERSION')), 'Der Code der neuen Fassung bleibt.');
|
||||
self::assertNotNull($this->updater()->pending(), 'Der offene Abschluss gehört weiter dem ersten Lauf.');
|
||||
self::assertSame('migrieren', $this->updater()->status()['phase']);
|
||||
|
||||
flock($sperre, LOCK_UN);
|
||||
fclose($sperre);
|
||||
// Wer die Sperre schon hält (der Abschluss aus der Ferne), läuft durch.
|
||||
$fertig = $this->updater()->finish($this->installation());
|
||||
self::assertTrue($fertig['ok'], $this->explain($fertig));
|
||||
self::assertNull($this->updater()->pending());
|
||||
}
|
||||
|
||||
public function testANewVersionThatDoesNotRunIsSwitchedBackCompletely(): void
|
||||
{
|
||||
// Wie bei reiseSoft: Läuft die neue Fassung nach den Migrationen nicht, kommt die alte
|
||||
|
||||
Reference in new issue
Block a user