Beiträge

Bug in WordPress XMLRPC wp.uploadfile – Dateiupload funktioniert nicht!

Gerade habe ich einen Bug in der XMLRPC-Schnittstelle von WordPress gefunden. Anscheinen nutzt diese Funktion aber wohl kaum jemand, wenn es noch keinem Aufgefallen ist. Ich habe aber genau diese Klasse kopiert und in einem anderen Projekt verwendet, um es mir mal einfacher zu machen. :-)

Der Bug befindet sich in der wp.uploadFile aka mw_newMediaObject Funktion. Mit dieser Funktion können Dateien über die XMLRPC-Schnittstelle in den Blog geladen werden.
Das Problem, es funktioniert nur nicht wirklich. Die Daten müssen per base64_encode codiert werden. Hab ich auch brav gemacht, nur werden sie im Blog nicht wieder decodiert und damit genau so gespeichert wie sie übertragen werden. Das kann jedoch nicht funktionieren.

Also habe ich mich auf die Suche gemacht und den Fehler gefunden. Die XMLRPC Klasse von WordPress (class-IXR.php) erkennt auf der Client-Seite Base64-Codierte Strings nicht. Ich habe im Netz auch keine Möglichkeit gefunden wie man prüfen kann ob ein String im Base64-Format vorliegt. Daher habe ich zu einer anderen Möglichkeit gegriffen den Bug zu fixen.

Wir gehen mal wieder in den Code. Achtung: Wenn diese Änderung im Blog selbst vorgenommen wird, wird es beim nächsten Update überschrieben!
Als erstes nehmen wir uns ca. Zeile 35 vor. Hier sollte folgendes stehen:


foreach ($this->data as $key => $value) {
     $this->data[$key] = new IXR_Value($value);
}

Das ändern wir in:


foreach ($this->data as $key => $value) {
     if($key == "bits") $this->data[$key] = new IXR_Value($value, "base64");
     else $this->data[$key] = new IXR_Value($value);
}

Soweit ich gesehen habe gibt es den „bits“ Parameter nur ein mal in der Schnittstelle. Und zwar genau dort wo der Base64-String unserer Datei drin ist. Also sagen wir „Wenn Parameter ‚bits‘ ist, dann ist es Base64. Und schon schalten wir die automatische – und falsche – Erkennung des Variablen-Types aus und sagen gleich das es Base64 ist.

Dann gehen wir noch zu einem anderen Bug. Der ist ca. in Zeile 114. Die Originalzeile heißt:


     case 'date':
     case 'base64':
          return $this->data->getXml();
          break;

Das gibt einen Fehler. Die Funktion getXml() gibt es unter $this->data nicht und wäre auch Schwachsinn.  Die Zeilen müssen wie folgt aussehen:


     case 'date':
          return $this->data->getXml();
          break;
     case 'base64':
          return '<base64>'.$this->data.'</base64>';
          break;

So, jetzt sollte es funktionieren.

Wie gesagt, wenn ihr die Klasse kopiert habt und in einem anderen Projekt verwendet, dann ist es ok. Wenn ihr es im WordPress selbst ändert dann wird es beim nächsten Update überschrieben.

[PHP] Fehlerausgabe lokal/web switchen

Hallo,

eigentlich immer ist es erforderlich sich in der Programmierungsphase die Fehlermeldungen ausgeben zu lassen um zu sehen wo und welche Fehler auftreten. Wenn das Projekt dann aber online ist dürfen diese aber nicht mehr (öffentlich) Ausgegeben werden.

Ich persönlich programmiere meine Projekte erst auf meinem lokalen Rechner und lade die Projekte dann auf den Webspace. Daher habe ich folgende Zeilen, direkt nach dem PHP-Tag („<?php“), in meine Scripte eingebaut:

if ($_SERVER["SERVER_NAME"] == "localhost") { error_reporting(E_ALL); ini_set('display_errors', 1); }
else ini_set('display_errors', 0);

Diese bewirken nun folgendes: Das Script überprüft ob das Script lokal ausgeführt wird. Wenn ja dann werden alle Fehlermeldungen von PHP ausgegeben. Wenn es nicht lokal ausgeführt wird (also auf einem öffentlichen Webspace/-server) dann wird keine Fehlermeldung mehr ausgegeben.
Im zweiten Fall sollte aber auf jeden fall eine Error-Reporting-Routine eingebaut werden um evtl. auftretende Fehler zu protokollieren.

Gruß
Gordon


Hinweis: Die Verwendung meiner Codeschnipsel erfolgt auf eigene Gefahr! Ich übernehme auch keine Garantie auf Funktionstüchtigkeit (jeder Server ist anders konfiguriert. Bei Problemen können Sie hier aber gern einen Kommentar schreiben und wir suchen eine Lösung. ;)

osDate – Fehler nach der Installation

Nun ist es mal wieder so weit. Ich will eine kleine (oder hoffenlich bald größere) Community erstellen.

Dazu habe ich mal wieder osDate auserwählt.

Nun habe ich es lokal installiert und die Routine ist durchlaufen. Alles ging glatt… ABER jetzt sagt mir mein liebes osDate

osDate ist nicht installiert, oder eine Installation war nicht erfolgreich.
Rufe die install.php auf um osDate zu installieren.

Das habe ich doch gerade :(

Die Lösung des Problems:

Öffne die Datei „myconfig/config.php“ und suche die Zeile in der folgendes steht:

define( ‚OSDATE_INSTALLED‘, ‚0‘ );

und mache daraus

define( ‚OSDATE_INSTALLED‘, ‚1‘ );

Nun sollte es funktionieren. Ist ein Fehler in der Installationsroutine.