Verdandi 1.6.0

Ich habe ein kleines bisschen am Theme gebastelt, um ein Problem zu lösen. Ich benutze das ActivityPub-Plugin von Matthias Pfefferle, um das Blog mit dem Fediverse zu verbinden. Aber da Verdandi ein klassisches Theme ist und Matthias sein Plugin primär für Block-Themes gebaut hat, fehlen mir unter den Artikeln die Likes. Die kommen nämlich über einen Block, bzw. ein Widget. Um also alle Reaktionen aus dem Fediverse anzeigen zu können, brauche ich einen neuen Sidebar pro Post. Sein Inhalt wird zwischen dem eigentlichen Text des Posts und den Kommentaren eingeblendet.

Wenn man die Sache passend konfiguriert (der Post-Sidebar ist nur sichtbar und konfigurierbar, wenn man einen einzelnen Post auswählt) und das entsprechende Widget auswählt, zeigen sich auch die Likes.

Vom Styling her passt das nicht ganz, aber mit etwas CSS-Übersteuerung sieht es ganz OK aus. Das hier verwende ich (ist nicht im Theme!)

.activitypub-reactions h6 {
  border-top: none;
  font-size: 1.4rem;
  margin:0;
}
Code-Sprache: CSS (css)

Und damit man sieht, wie das Ganze aussieht, habe ich mich dann gleich mal selbst gelikt.

Verdandi 1.5.1

In den letzten Wochen tat sich bis auf einige wenige kleine Bugfixes nichts am Theme. Gestern dann gab es tatsächlich eine kleine Neuerung, der gleich ein Minifix hinterhergeschoben wurde.

Verdandi unterstützt jetzt den Stil align-wide. Damit können einzelne Elemente wie Bilder breiter dargestellt werden als der eigentliche Text. Wahlweise ein bisschen oder über die gesamte Bildschirmbreite. Das funktioniert natürlich nur, wenn der Sidebar ausgeschaltet wird und die Widgets nach unten wandern. Auf Mobilgeräten ist das sowieso schon der Fall.

Mir gefällt die Dynamik, die dadurch entsteht.

Bei aktiviertem Sidebar ändert sich nichts. Fast nichts. In der Mobilansicht habe ich Bilder für alle Varianten auf volle Breite gezogen.

Der kleine Umbau lässt mich jetzt darüber nachdenken, wie ich optional das Suchwidget in den Header bekomme. Denn das hätte ich gerne oben und damit ohne scrollen beim Öffnen der Seite sofort im Zugriff.

WordPress absichern

In der letzten Zeit war ich – auch als Nebeneffekt von vielen Basteleien – etwas schludrig, was die Sicherheit dieses Servers anging. Daher mal für mein zukünftiges Ich ein paar Basics zur Sicherheit von WordPress.

Was könnte passieren, wenn ich mir ein Skript einfange (durch z.B. ein unterwandertes WordPress-Plugin oder ein allzu naiv ausprobiertes PHP-Projekt, das gerade meine Aufmerksamkeit erweckte) und übles im Sinn hat? Ohne Vorkehrungen kann es mit den Rechten des Webservers (www-data) Systembefehle ausführen, Dateien erzeugen, gefundene Daten publik machen und allerlei anderen Schabernack treiben.

Um das auszuschließen, sollte man PHP verbieten, bestimmte Funktionen auszuführen. Dazu gehört unter anderem eval, mit dem sich beliebige Systembefehle ausführen lassen. Das lässt sich einfach in der php.ini mit der Anweisung disable_functions=... machen. Ein auskommentiertes Beispiel ist standardmäßig immer dabei.

Die nächste Schutzschicht sind die Dateirechte. Der Webserver und damit PHP sollten nach Möglichkeit nur Leserechte, aber keine Schreibrechte haben. Zunächst werden dazu alle Rechte einem anderen, z.B. dem eigenen User (hier naheliegenderweise rolf) übertragen:

shopt -s dotglob
chown -R rolf.rolf  /srv/www/scaldra.net/*
shopt -u dotglobCode-Sprache: Bash (bash)

Das shopt ist notwendig, damit chown auch alle hidden-Dateien erfasst.
Danach werden alle Dateien auf Minimalrechte zurückgesetzt (Ich darf alles und der Webserver nur lesen):

find   /srv/www/scaldra.net -type d -exec chmod 755 {} \;
find  /srv/www/scaldra.net -type f -exec chmod 644 {} \;Code-Sprache: Bash (bash)

Damit ich weiterhin in meine Posts Bilder verwenden kann, muss das Upload-Verzeichnis dann doch noch ein paar Rechte mehr bekommen:

find   /srv/www/scaldra.net/htdocs/wp-content/uploads -type d -exec chmod 777 {} \;
find  /srv/www/scaldra.net/htdocs/wp-content/uploads -type f -exec chmod 666 {} \;Code-Sprache: Bash (bash)

Das Gleiche gilt für das Cache-Verzeichnis:

find   /srv/www/scaldra.net/htdocs/wp-content/cache -type d -exec chmod 777 {} \;
find  /srv/www/scaldra.net/htdocs/wp-content/cache -type f -exec chmod 666 {} \;Code-Sprache: Bash (bash)

Jetzt habe ich eine WordPress-Installation, die recht gut gegen viele Angriffe abgesichert ist. Allerdings lassen sich jetzt auch keine Themes oder Plugins mehr installieren. Wenn ich das will, und das ist ja eher selten, muss ich zunächst dem Webserver wieder Schreibrechte geben:

shopt -s dotglob
chown -R www-data.www-data  /srv/www/scaldra.net/*
shopt -u dotglobCode-Sprache: Bash (bash)

Dann wird fröhlich installiert und danach werden die Rechte wieder auf den eigenen Benutzer zurückgedreht.

Die Rechteänderung bringt leider mit sich, dass das Autoupdate an den Dateirechten scheitert. WordPress wird im Website-Zustand darauf hinweisen, dass nicht auf das Dateisystem zugegriffen werden kann. Was ja auch stimmt, das darf ja nicht mehr www-data, sondern nur noch rolf.

Da ich nun keine Lust habe alle Updates ab jetzt manuell durchzuführen, muss ich etwas tiefer in WordPress einsteigen und die WP-CLI installieren

Mit ihr lassen alle Wartungsjobs, die normalerweise per Klick in der GUI gemacht werden, durch einen Commandline-Aufruf ersetzen. Auf diese Weise lassen sich auch alle zeitgesteuerten Aufgaben mit dem persönlichen User (hier also rolf) durchführen. Es braucht lediglich ein Job in der /etc/cron.d, der bei mir wordpress heißt und zwei Zeilen enthält

*/5 * * * * rolf wp --path=/srv/www/scaldra.net/htdocs cron event run --due-now >>/home/rolf/wpv.log
11 8 * * * rolf /home/rolf/wp-update >>/home/rolf/wp.logCode-Sprache: Bash (bash)

Die erste Zeile führt alle fünf Minuten die üblichen zeitgesteuerten Aufgaben in WordPress durch. Die zweite Zeile kümmert sich morgens um 8:11 darum, dass die gesamte Installation auf Stand bleibt. Sie ruft dazu ein kleines bash-Skript auf, das die diversen Aktualisierungen anstößt:

#!/bin/bash
wp --path=/srv/www/scaldra.net/htdocs  plugin update --all  > /dev/null 2>&1
wp --path=/srv/www/scaldra.net/htdocs  core update  > /dev/null 2>&1
wp --path=/srv/www/scaldra.net/htdocs  theme update --all > /dev/null 2>&1
wp --path=/srv/www/scaldra.net/htdocs  language theme --all update > /dev/null 2>&1
wp --path=/srv/www/scaldra.net/htdocs  language plugin --all update > /dev/null 2>&1
wp --path=/srv/www/scaldra.net/htdocs  language core update  > /dev/null 2>&1
Code-Sprache: Bash (bash)

Das sind zunächst die Plugins, WordPress selbst und die Themes. Aber das reicht noch nicht ganz. Mit den letzten drei Zeilen des Skripts werden die Übersetzungen von Themes und Plugins aktualisiert.

Insgesamt funktioniert das sehr gut. Dass der Website-Zustand mich jetzt an mault, dass WordPress nicht schreiben kann, ist für mich verschmerzbar. Allerdings musste ich Matomo entfernen und durch ein anderes Statistiktool ersetzen. Es orientierte sich an der Meldung zum Website-Zustand und wollte daher nicht mehr mitspielen.

Zum Schluss noch ein paar weiterführende Links:

Nachtrag 4.10.2024

Im Website-Zustand fand sich in den letzten Tagen hartnäckig der Hinweis, dass die Übersetzungen nicht aktuell seien. Durch diesen Hack ließ sich das Problem beseitigen:

wp --path=/srv/www/scaldra.net/htdocs  eval "require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; (new Language_Pack_Upgrader(new Language_Pack_Upgrader_Skin(['url' => 'update-core.php?action=do-translation-upgrade', 'nonce' => 'upgrade-translations', 'title' => __('Update Translations'), 'context' => WP_LANG_DIR])))->bulk_upgrade();";   > /dev/null 2>&1Code-Sprache: Bash (bash)

Schön geht anders. Hier noch der Link zur Lösung: How do you update all translations using wp-cli?

Verdandi 1.3.0

Ich habe wieder ein bisschen am Theme geschraubt; herausgekommen sind einige kleinere Verbesserungen:

  • Unterstützung für das Beitragsformat Link
  • Bessere Seitennavigation
  • Einige kleinere CSS-Änderungen (schönere Buttons, verbesserte Konsistenz des Farbschemas und noch ein paar andere Kleinigkeiten)

ActivityPub reaktiviert

Es mag etwas kurios erscheinen, aber ich habe hier zum dritten Mal das ActivityPub-Plugin aktiviert. Es war bereits 2022 und 2023 eingeschaltet, wurde aber nach einiger Zeit dann immer wieder abgeschaltet. Ein Grund war, dass die geteilten Beiträge nicht so recht in das Kurznachrichten-Ambiente von Mastodon passten.
Inzwischen sehe ich ActivityPub anders. Es ist einfach die Weiterentwicklung des klassischen RSS-Feeds. Statt nur Sender zu sein, kann ich jetzt gleichzeitig auch Empfänger sein. Jeder kann die Beiträge in dem Client lesen, der ihm am meisten zusagt, aber über ActivityPub kann sie oder er mir auch antworten.

Verdandi

Ende März kam mir der Gedanke, das Theme dieses Blogs auch direkt über WordPress verfügbar zu machen. Das Erste, was ich dazu machen musste, war den Namen zu ändern. Jedes Theme hat natürlich seinen eigenen Namen und Legible war schon vergeben. Also brauchte ich einen neuen Namen. Ich wählte Verdandi. Sie ist die Norne der Gegenwart und schreibt laut einiger Quellen alles auf, was geschieht.

Der passende Name für ein Theme, das primär für Blogs gedacht ist.

Am 1. April begann ich es durch den QM-Prozess von WordPress lotsen. Hinter den Kulissen mussten viele Kleinigkeiten hübsch gemacht, werden wie korrekte Lizenzen oder Anpassungen für die Darstellung von Elementen, die ich noch nie benutzt hatte. Das war aufwändiger als gedacht, hat für mich aber zu insgesamt schönen Ergebnis geführt.


In Zukunft wird es immer wieder kleinere Korrekturen und Anpassungen geben, aber im Kern ist das Theme fertig und muss „nur“ noch auf Stand gehalten werden. Und falls ich interessante Elemente in anderen Blogs finde, dann könnte es gut sein, dass sie auch hier integriere.


Da es mit Absicht kein Blocktheme ist, funktioniert es auch mit ClassicPress.


Zum Abschluss habe ich ihm dann noch eine eigene Site spendiert, die anschaulich zeigt, was Verdandi kann. Bei WordPress findet man es hier. Die Entwicklung findet weiter auf Codeberg statt, und zwar hier (der Codestand wird dort oft etwas weiter sein und sich auch auf dieser Seite wiederfinden).