Skip to content

Schreibseite - #32

Closed
tombrain wants to merge 309 commits into
henshingly:masterfrom
tombrain:schreibseite
Closed

tombrain wants to merge 309 commits into
henshingly:masterfrom
tombrain:schreibseite

Conversation

@tombrain

Copy link
Copy Markdown
Contributor

No description provided.

Die oeffentliche Spielerstatistik (lmo-statshow.php) und die
Druckansicht (lmo-statprint.php) uebernahmen sort, begin, direction und
team ungeprueft aus der Anfrage:

- begin=abc fuehrte unter PHP 8 zu einem Fatal Error
  (Unsupported operand types: string + string).
- Eine unbekannte oder nicht-numerische Sortierspalte (sort=99,
  sort=abc) erzeugte Warnungen beim Sortieren. Jetzt wird in diesem
  Fall nach der ersten Spalte sortiert; das gilt auch fuer eine
  unpassende Standardsortierung aus der Konfiguration.
- Die Werte wurden unmaskiert in Links und in die Ueberschrift der
  Druckansicht geschrieben (Cross-Site-Scripting). Die Zahlen werden
  jetzt als Zahlen behandelt, die Mannschaft wird maskiert.
- Die Druckansicht warnte beim Oeffnen, wenn es zur Liga keine
  Statistik gibt. Jetzt erscheint nur die vorgesehene Meldung.
Spielerstatistik: Spieler und Spalten anlegen und loeschen, Werte
eintragen, Formelspalten (auch Division durch 0, unvollstaendige und
eingeschleuste Formeln), oeffentliche Seite und Druckansicht mit
Sortierung und unpassenden Parametern, kein Aendern ohne Anmeldung.
Seit b0e3dba liest die classlib die Werte einer Partie unabhaengig von
der Zeilenreihenfolge in der Ligadatei. Dadurch aendert sich fuer
golden/special.l98 die "Bewertung der Restprogramme" auf der
Statistikseite (Punkte der Gegner aus der classlib-Tabelle). Die beiden
Snapshots hielten noch die Werte von vor dem Fix fest und liessen die
GitHub Action scheitern.
actions/checkout@v4 und actions/cache@v4 laufen auf Node.js 20, das
auf den GitHub-Runnern abgekuendigt ist; v5 nutzt Node.js 24.

ubuntu-latest wechselt ab 19.10.2026 auf Ubuntu 26. Die Snapshot-Tests
haengen von der Umgebung ab (faketime, PHP-Pakete), deshalb ist der
Runner jetzt fest auf ubuntu-24.04 gestellt und aendert sich nicht von
selbst.
Bei gleichen Punkten, Minuspunkten und Toren hing die Reihenfolge der
classlib-Tabelle vom Vergleich der ganzen Tabellenzeilen ab und war
damit praktisch zufaellig. lmo-calctable.php stellt in diesem Fall das
Team mit der hoeheren Nummer nach vorn. liga::sortTable() sortiert
jetzt genauso, Minitabelle und Statistik zeigen damit dieselben Plaetze
wie die Haupttabelle.

Sichtbar z.B. in der Beispielliga 1l_2024-25 ohne Ergebnisse: Die
Plaetze der Gegner im Restprogramm der Statistikseite aendern sich,
die Snapshots sind entsprechend aktualisiert.
Die classlib kannte die Option HandS nicht: Minitabelle und Statistik
zeigten bei Ligen mit Handicap eine andere Reihenfolge als die
Haupttabelle.

liga::calcTable() wendet die Reihenfolge jetzt wie lmo-calctable.php
an, nur in der Gesamttabelle: Der Wert HS des Spieltags enthaelt je
Platz der errechneten Tabelle den neuen Platz; bei gleichen Angaben
stehen die Teams in umgekehrter Reihenfolge der errechneten Tabelle.
Fuer die Tabelle der ganzen Saison gilt die Reihenfolge des aktuellen
Spieltags (Actual), sonst die des angegebenen Spieltags.

Nicht nachgebildet sind zwei Sonderfaelle des Kerns, die von der URL
abhaengen (Aufruf mit st=... oder mit ausdruecklichem endtab des
letzten Spieltags): dort nimmt der Kern die Reihenfolge des letzten
Spieltags.
Der Vergleich Kern gegen classlib und der Test der Minitabelle nehmen
voelligen Gleichstand und Handicap nicht mehr aus. Dazu Unit-Tests fuer
die Reihenfolge bei Gleichstand und fuer die Handicap-Reihenfolge.
Unter Windows (core.autocrlf) lag docker/run-tests.sh mit CRLF in der
Arbeitskopie. Ein neu gebautes Test-Image startete damit nicht:
"exec /usr/local/bin/run-tests: no such file or directory".
.gitattributes legt fuer *.sh jetzt LF fest.
lmo/composer.json und README nennen PHP 8.0 bis 8.4, getestet wurde
nur 8.3. Die Action laeuft jetzt mit der aeltesten, der neuesten und
der Version, mit der die Snapshots aufgezeichnet wurden.

Unter PHP 8.4 laeuft die Suite unveraendert. Unter PHP 8.0 wichen
sieben Snapshots nur in versionsabhaengigen Texten ab: Deprecated-
Meldungen, die es erst ab 8.1 gibt, Wortlaut einzelner Warnungen,
Liste der Zeitzonen und der Apostroph, den htmlspecialchars() erst ab
8.1 maskiert. Der Snapshot-Vergleich gleicht diese Unterschiede unter
PHP < 8.1 auf beiden Seiten aus; die Snapshots selbst bleiben
unveraendert.
PHP 8.5 ist veroeffentlicht, die README nennt aber 8.4 als hoechste
Version. Der Lauf zeigt, ob LMO und die Snapshots unter 8.5 bestehen;
fail-fast ist aus, die anderen Versionen laufen unabhaengig davon.
Im Web-Container der Entwicklungsumgebung brach "Liga per E-Mail" mit
'Class "ZipArchive" not found' ab: Die PHP-Erweiterung zip fehlte im
Image. Danach waere der Versand trotzdem gescheitert, weil es im
Container kein Mailprogramm gibt.

- web.Dockerfile installiert zip. mail() liefert an den neuen Dienst
  "mail" (Mailpit); dessen Postfach ist unter http://localhost:8025/
  erreichbar, nach draussen geht nichts.
- composer.json nennt ext-zip neben ext-gd als empfohlene Erweiterung.
- docker/README.md beschreibt fuer Entwickler die Dienste, Adressen,
  Volumes und Einstellungen.
Die mitgelieferten Ligen haben keine Ergebnisse, und die Addons liessen
sich nur ueber von Hand gebaute Adressen ausprobieren.

http://localhost:8082/demo/ zeigt Minitabelle, Mini-Spielplan, Viewer
(nach Spieltag und nach Datum), Ticker und Spielerstatistik eingebettet
und mit direktem Link, umschaltbar zwischen zwei Beispielligen:
1. Bundesliga 2025/26 (beendet) und 2026/27 (Stand 5. Spieltag).
Ergebnisse aus den OpenLigaDB-Daten der Tests, Termine erfunden.

Seite und Daten liegen in docker/demo und werden nicht mit LMO
ausgeliefert. Der Container kopiert fehlende Beispieldateien beim Start
in die Volumes und ueberschreibt nichts.
lmo/includes/PHPMailer.php war eine veraenderte Kopie von PHPMailer
6.9.2 ohne Namespace, ohne SMTP- und ohne Exception-Klasse. Die
Bibliothek kommt jetzt wie die Template-Klasse ueber Composer
(phpmailer/phpmailer ^7.1) und wird ueber lmo/vendor/autoload.php
geladen; die Kopie ist entfernt.

Alle fuenf Versandstellen (Liga per E-Mail, Tippspiel: Rundmail,
Passwort vergessen, Freischaltung, Benachrichtigung) erzeugten
PHPMailer im Ausnahme-Modus, werteten aber den Rueckgabewert von send()
aus. Schlug der Versand fehl, endete die Seite mit einem Fatal Error;
bei der Rundmail brach schon eine ungueltige Adresse den ganzen Lauf
ab. Die neue Funktion lmo_mailer() liefert ein vorbereitetes Objekt
ohne Ausnahmen: send() gibt false zurueck, der Grund steht in
ErrorInfo und wird als Meldung ausgegeben.

Entfernt ist ausserdem der Rueckfall auf ein direktes mail() in
lmo-tippemail.php: Er benutzte Variablen, die es nicht gibt, und wurde
nie erreicht.
Die Mails des Tippspiels bauten ihre Links aus
$_SERVER['REQUEST_SCHEME']. Diese Variable setzt nicht jeder Webserver;
dann gab es eine Warnung und einen Link ohne Protokoll. Die neue
Funktion lmo_request_origin() ermittelt das Protokoll in diesem Fall
ueber $_SERVER['HTTPS'].

"Passwort vergessen" und die Freischaltung haengten ausserdem
REQUEST_URI an, also die Adresse samt Parametern der aktuellen Anfrage,
und danach noch einmal "?action=tipp". Bei einer Anfrage mit Parametern
entstand so ein Link mit zwei Fragezeichen. Jetzt wird wie bei der
Rundmail PHP_SELF verwendet.
…ruch

Ohne die Erweiterung zip endete der Versand mit
'Class "ZipArchive" not found'. Jetzt erscheint die Meldung, dass die
Mail nicht gesendet werden konnte, mit dem Hinweis auf die fehlende
Erweiterung. Die temporaere Zip-Datei wird nur noch geloescht, wenn sie
angelegt wurde (sonst PHP-Warnung).
Die Testumgebung faengt Mails ueber sendmail_path als Dateien in der
Testinstanz ab und kann einen fehlgeschlagenen Versand nachstellen.
Geprueft werden "Liga per E-Mail" (Zip-Anhang, Versandfehler, fehlende
zip-Erweiterung, kein Versand ohne Anmeldung) und "Passwort vergessen"
im Tippspiel (neues Passwort, Link, Versandfehler, unbekannter Name).

Die GitHub Action laedt dafuer zusaetzlich die Erweiterung zip.
Rief ein Hilfsadmin ohne erweiterte Rechte die Mannschaftsverwaltung
(st=-2) oder die Spielanzahl (st=-3) auf, fiel lmo-adminmain.php in den
Ergebnis-Editor und dieser arbeitete mit dem "Spieltag -2": Dutzende
PHP-Warnungen und ein unbrauchbares Formular. Unter PHP 8.5 kam die
Meldung "Using null as an array offset is deprecated" dazu, wodurch der
Snapshot helper_roles nur dort abwich.

lmo-adminedit.php oeffnet bei einem Spieltag ausserhalb der Liga jetzt
den aktuellen Spieltag. Der Snapshot zeigt an dieser Stelle den
normalen Editor ohne Warnungen.
- admin_without_login: Zeilennummer einer bestehenden Warnung in
  lmo-functions.php (dort sind lmo_mailer() und lmo_request_origin()
  dazugekommen)
- todo=tippemail: die Warnung zu REQUEST_SCHEME entfaellt
Der Mini-Spielplan zeigt die Zeit bis zum Spiel. Die Testuhr (faketime)
laeuft waehrend des Aufrufs weiter: Dauert er ueber die volle Sekunde
hinaus, ist eine Minute weniger uebrig, und der Snapshot wich ab (in
der GitHub Action unter PHP 8.5 aufgetreten, aber nicht von der
PHP-Version abhaengig). Die Minutenzahl wird vor dem Vergleich durch
einen Platzhalter ersetzt.
…rdner

lmo-admindownload.php brach ohne die PHP-Erweiterung zip mit
'Class "ZipArchive" not found' ab. Jetzt erscheint eine Fehlermeldung.

Das Archiv wurde als ligen.zip im Programmverzeichnis angelegt, das
nicht beschreibbar sein muss; es entsteht jetzt im Ausgabeordner.

Eine Liganummer, die es nicht gibt (down=99), erzeugte eine
PHP-Warnung; sie liefert jetzt einfach nichts.
"Spalte loeschen" mit einer Nummer, die es in der Statistik nicht gibt,
erzeugte eine PHP-Warnung und schrieb die Datei trotzdem neu. Die
Aktion wird jetzt nur fuer vorhandene Spalten ausgefuehrt.
AdminDownloadTest: einzelne Liga, unbekannte Nummer, alle Ligen als
Zip, fehlende zip-Erweiterung, kein Download ohne Anmeldung.
Die GitHub Action ist unter PHP 8.5 gruen. README, TESTING.md und der
Changelog nennen jetzt PHP 8.0 bis 8.5.
Dateien wie lmo-adminsubnavi.php oder lmo-savehtml.php sind nur dazu
da, von lmo.php, lmoadmin.php oder einem Addon eingebunden zu werden.
Direkt im Browser aufgerufen liefen sie ohne Konfiguration und ohne
Rechtepruefung los: PHP-Warnungen, Bruchstuecke der Seite und in
mehreren Faellen ein Fatal Error mit Dateipfaden.

Alle 131 Dateien in lmo/ und den Addons, die init.php nicht selbst
laden, pruefen jetzt am Anfang, ob PATH_TO_LMO definiert ist, und
beenden sich sonst ohne Ausgabe. Die Konstante setzt init.php als
Erstes, im normalen Betrieb greift die Pruefung also nie. Unveraendert
bleiben die Einstiegsseiten (lmo.php, lmoadmin.php, Minitabelle,
Viewer, Download ...), lmo-setup.php, index.php und die classlib.

Der Snapshot direct_include_access zeigt fuer die geprueften Dateien
jetzt eine leere Antwort.
getLangSelector() griff ungeprueft auf $_SESSION['lmouserlang'] zu.
Im Admin-Bereich ohne Anmeldung gab es dafuer je Sprache eine
PHP-Warnung. Fehlt der Wert, gilt jetzt keine Sprache als gewaehlt.
Wird eine Liga aus einer Vorlage mit mehr Mannschaften angelegt,
enthaelt der Spielplan Partien mit Mannschaftsnummern, die es in der
neuen Liga nicht gibt. lmo-zustat.php warnte dafuer je Partie und
zaehlte sie als ausstehende Spiele mit. Solche Partien werden jetzt
uebersprungen; im Snapshot sinkt die Zahl der gezaehlten Partien
dadurch von 30 auf 21.
Snapshot neu: eigene Bezeichnungen fuer Punkte und Tore bleiben leer, die Auswahl der Fieberkurve wird gleich beim Speichern bereinigt.
Snapshots neu: Torkorrektur und Strafbeginn wandern beim Loeschen mit der Mannschaft, eine neue Mannschaft hat sofort Kurz- und Mittelnamen, im Pokal laeuft das Loeschen ohne Warnungen.
Aufgezeichnet mit dem bisherigen Code. Im Pokal bricht die Seite der zweiten Runde dabei mit einem Fatal Error ab (gewinn() in lmo-functions.php rechnet mit "_"), wenn in der Runde davor nur das Rueckspiel einer Paarung gespielt ist; deshalb fehlt dort das Formular.
Zehn Snapshots neu: [News] bleibt ohne Zeilen leer (kein NC=0), die Seite einer Pokalrunde bricht nicht mehr ab, nach dem Speichern zeigt die Seite den gespeicherten Stand (Auswahl des Zusatzes).
…atistikdatei nicht von der PHP-Version abhaengt
… mit eigenen Hilfsvariablen

Vier Snapshots neu: eine neue Liga hat sofort Mittelnamen und die leeren Eintraege namePkt/nameTor.
…e Bruecke

Nichts im Programm benutzt $ligaDaten mehr; init.php bindet die alten Einzelvariablen nicht mehr an.
Geloescht: src/Liga/LigaDaten.php, lmo/lmo-ligadaten.php, lmo/lmo-savefile.php und die Tests der Bruecke (LigaDatenTest, die Vergleichstests gegen sie). Die alten Einzelvariablen einer geladenen Liga gibt es damit nicht mehr; das Test-Hilfsskript calc.php liest die Spieltage aus $lmo_liga.
fix(phpstan): Tore in Tabelle::werte() als lokale Werte
Keine Seite braucht die Uebersetzung in die alten Tabellenfelder mehr. Die Datei liegt jetzt unter tests/GoldenMaster/bin/calctable.php; CalculationTest und die Tests, die ueber calc.php rechnen, halten die Tabelle weiter in dieser Form fest.
@tombrain tombrain closed this Oct 12, 2026
@tombrain
tombrain deleted the schreibseite branch October 12, 2026 16:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant