jeudi, août 11 2011

Tentative réussie d'export d'un blog DotClear vers Blurb

Il y a quelques mois j’avais déjà fait un article quant à une tentative d’export de mon blog DotClear vers le client java de Blurb. Le problème auquel je m’étais heurté était l’export fait par WordPress (alias URL wp-admin/export.php) et dont je ne trouvais pas d’équivalents immédiat dans DotClear. 

Ce script WordPress genère un fichier WXR (Wordpress eXtended RSS (WXR))  qui est partiellement documenté sur http://doc.tiki.org/Wordpress+Importer

De plus amples informations sont également disponibles sur
http://ipggi.wordpress.com/2011/03/16/the-wordpress-extended-rss-wxr-exportimport-xml-document-format-decoded-and-explained/
et un exemple sur
http://code.google.com/p/google-blog-converters-appengine/source/browse/trunk/samples/wordpress-sample.wxr

Au lieu d’écrire une page implémentant ce format ou de traduire pour DotClear le script officiel (http://phpcrossref.com/wordpress/wp-admin/export.php.html), j’ai cherché une solution plus facile à mettre en place. DotClear permet également la génération de fichiers de type XML notamment pour le flux RSS – à l’adresse <votre site>index.php?feed/rss2.

La structure de ce fichier XML est assez proche de celle du format WXR et de cet exemple: http://code.google.com/p/google-blog-converters-appengine/source/browse/trunk/samples/wordpress-sample.wxr. Si l’on copie le contenu de ce fichier et le colle dans une requête interceptée dans Burp Proxy, ça marche!

L’idée est la suivante:

  1. Créer un second template XML semblable à celui de RSS2 mais dédié à WXR
  2. Définir un point d’entrée dans DotClear pour cette URL
  3. Adapter le template WXR pour contenir toutes les informations nécessaires à Blurb pour son export.

Dans DotClear 2.3, il suffit de faire une copie du fichier inc/public/default-templates/rss2.xml et de le renommer wxr.xml

Le reste est une comparaison des champs entre le fichier RSS2 et l’exemple WXR mentionné plus haut. Pour restituer tous les champs nécessaires, la documentation des tags de DotClear est d’une grande aide, notamment:

Voici mon fichier wxr.xml une fois les modifications terminées – à noter que l’export des commentaires n’est pas supporté mais ne nécessiterai que quelques tags supplémentaires:

<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="DotClearHack" -->
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:wp="http://wordpress.org/export/1.0/"
>
<channel>
<title><![CDATA[{{tpl:BlogName encode_xml="1"}}{{tpl:SysFeedSubtitle encode_xml="1"}}]]></title>
<link>{{tpl:BlogURL}}</link>
<description>{{tpl:BlogDescription encode_xml="1"}}</description>
<language>{{tpl:BlogLanguage}}</language>
<pubDate>{{tpl:BlogUpdateDate rfc822="1"}}</pubDate>
<copyright>{{tpl:BlogCopyrightNotice encode_xml="1"}}</copyright>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<generator>Dotclear</generator>
<tpl:Entries lastn="1000">
<item>
<title>{{tpl:EntryTitle encode_xml="1"}}</title>
<link>{{tpl:EntryURL}}</link>
<guid isPermaLink="false">{{tpl:EntryFeedID}}</guid>
<pubDate>{{tpl:EntryDate rfc822="1"}}</pubDate>
<dc:creator>{{tpl:EntryAuthorCommonName encode_xml="1"}}</dc:creator>
<tpl:EntryIf has_category="1">
<category>{{tpl:EntryCategory encode_html="1"}}</category>
</tpl:EntryIf>
<description></description>
<!-- WP specific stuff -->
<content:encoded>{{tpl:EntryExcerpt absolute_urls="1" encode_xml="1"}} {{tpl:EntryContent absolute_urls="1" encode_html="1"}}</content:encoded>
<wp:post_id>{{tpl:EntryID}}</wp:post_id>
<wp:post_date>{{tpl:EntryDate format="%Y-%m-%d %T"}}</wp:post_date>
<wp:post_date_gmt>{{tpl:EntryDate format="%Y-%m-%d %T"}}</wp:post_date_gmt>
<wp:comment_status>open</wp:comment_status>
<wp:ping_status>open</wp:ping_status>
<wp:post_name>post-name-value</wp:post_name>
<wp:status>publish</wp:status>
<wp:post_parent>0</wp:post_parent>
<wp:menu_order>0</wp:menu_order>
<wp:post_type>post</wp:post_type>
<wp:post_password></wp:post_password>
</item>
</tpl:Entries>
</channel>
</rss>

Finalement, il a encore fallu ajouter le code suivant en rouge dans /inc/public/lib.urlhandlers.php pour que l’URL soit reconnue et mappée vers le bon fichier de ressource que nous venons de créer:

// dans la fonction feed

if (preg_match('#^rss2/xslt$#',$args,$m))
{
# RSS XSLT stylesheet
self::serveDocument('rss2.xsl','text/xml');
return;
}
if (preg_match('#^wxr$#',$args,$m))
{
# RSS XSLT stylesheet
self::serveDocument('wxr.xml','text/xml');
return;
}

Il nous reste à apporter la dernière touche à Burp pour que la requête d’exportation WordPress atterisse au bon endroit:

POST /wp-admin/export.php\?download=true&author=all

devient

POST /<cheminVersDotClear>/index.php\?feed/wxr

Et voilà!

image

Est-ce vraiment tout?

Malheureusement il y a eu quelques problèmes supplémentaires, non lié à Blurb mais à des vieux articles DotClear qui empêchaient l’export propre de toutes les photos. Ce problème a été adressé via des mises à jour de la base de donnée, mais plus d’informations suivront dans une petite semaine avec le récapitulatif comment faire pour exporter n’importe quel blog DotClear – ou WordPress - dans Blurb Sourire

dimanche, juillet 17 2011

Erreur otherBlog lors de la mise à jour vers DotClear 2.3.1

L’erreur suivante est apparue sur ce blog lors du passage en version 2.3.1:

La constante DC_ROOT n'indique pas le bon chemin d'accès à Dotclear...

La solution était toute simple: il suffit de mettre à jour ce plugin et d’utiliser la version la plus récente – soit actuellement la version 1.7.2!

mercredi, mai 18 2011

Tentative #1 d'export d'un blog DotClear vers Blurb

Introduction et idée de base

Blurb est un site Internet permettant l’impression de livres-photos comme tant d’autres. Ce qui rend Blurb plus intéressant que par exemple www.myphotobook.ch est le site propose un client Java à installer sur son ordinateur. Ce client permet ensuite l’importation d’album photos de plusieurs sources, dont certains blogs.

Bien que cette importation de blog semble très intéressante au premier abord, il n’est pas possible de spécifier l’URL de son blog hébergé soi-même. L’interface ne permet le téléchargement que depuis une liste pré-définie de fournisseurs de blogs.

Le but est de configurer le client Blurb afin qu’il importe mon compte DotClear hébergé par mes soins sur un domaine dédié en lieu et place du service d’un des fournisseurs listés ci-dessous. 

Même si le but n’a pas été atteint pour l’instant, de premiers résultats intéressants sont présentés :)

image

 

Pré-requis

 

1. Configuration de DotClear

Afin de respecter les bonnes pratiques de sécurité, nous allons créer un compte utilisateur dans DotClear ayant juste les permissions requises pour l’export des billets. Après avoir crée le compte blurp, on lui attribue la permission “gérer tous les billets et commentaires” pour le blog à exporter.

image

Dans les paramètres du blog, assurez-vous tout en bas de la page que l’interface XML-RPC est bien activée. Notez également l’URL du serveur.

image

 

2. Mise en place sur le poste de travail

Je pars de l’idée que Blurp est installé sur l’ordinateur et que les paramètres de proxy de la JRE utilisée par Blurp ont été édités comme suit:

  • http.proxyHost=localhost
  • http.proxyPort=8080
  • http.proxyHost=localhost
  • http.proxyPort=8080

Afin d’auditer voire éditer les requêtes que Blurp va faire, nous allons installer Burp – un outil fréquemment utilisé pour l’audit de sécurité d’application web. La version gratuite est de loin suffisante pour les besoins que nous allons avoir.

image

Finalement, il est également nécessaire de noter l’adresse IP du site Internet hébergeant notre blog – dans cet exemple ce sera 93.88.254.17.

 

3. Début de l’analyse des flux HTTP de Blurb

Comme mentionné dans un précédent billet, il semble que DotClear ait maintenant une interface XML-RPC préférant l’API WordPress à Movable Type.

Dans la fenêtre d’import de blog, donnons les coordonnées de notre utilisateur blurb et sélectionnons comme service WordPress:

image

La requête interceptée par burp est la suivante:

POST /xmlrpc.php HTTP/1.1
Content-Type: text/xml
User-Agent: Blurb BookSmart 3.0.3
Cache-Control: no-cache
Pragma: no-cache
Host: wordpress.com
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Proxy-Connection: keep-alive
Content-Length: 199

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params><param><value>blurp</value></param>
<param><value>[ceci fut mon mot de passe…]</value>
</param></params></methodCall>

 

4. Re-routage des requêtes vers notre blog

Burp va nous permettre de mettre un certain nombre de règles afin d’envoyer cette requête non pas chez WordPress.com mais directement sur notre blog. Pour ce faire, nous devons:

  • faire en sorte que la requête parte sur notre blog au lieu de wordpress.com
  • réécrire les URLs afin qu’elles soient adaptées pour DotClear

 

4.1 Correction de la résolution hostname - IP

Comme toutes les requêtes sont passées via notre proxy Burp, nous pouvons y changer l’assignation hostname – adresse IP. Cela se fait facilement dans l’onglet Options de Burp:

image

4.2 Redirection appropriée des URLs

Il est également nécessaire de corriger les URLs ainsi que le champ Host: de l’entête HTTP. Les options nécessaires à cela sont disponibles dans l’onglet Proxy – sous-onglet options – section match and replace.

Il est nécessaire d’ajouter les règles suivantes:

Type Match Replace
request header POST /xmlrpc.php POST /[Votre URL]/index.php?xmlrpc/default
request header Host: wordpress.com Host:www.ness.ch

image

4.3 Test de connexion

Le grand moment est là – vérifions si nous arrivons à récupérer la liste des blogs:

image

Bingo, la liste nous est retournée!

image

 

5. Ce qui ne marche pas… encore

Malheureusement, la suite de l’import ne marche pas.

image

Au lieu d’utiliser des APIs standards XML/RPC, Blurb fait des requêtes spécifiques à WordPress et pour lesquels il n’existe pas d’équivalent DotClear – du moins d’après mes premières investigations. Telle était ma liste de règles Burp avant que j’abandonne provisoirement cette voie.

Type Match Replace
request header POST /xmlrpc.php POST /[Votre URL]/index.php?xmlrpc/default
request header POST /wp-login.php POST /[Votre URL]/admin/auth.php
request header POST /wp-admin/export.php\?download=true&author=all POST /[Votre URL]/admin/plugin.php?p=importExport&t=e&f=dcExportFlat
request header Host: wordpress.com Host:www.ness.ch

- page 2 de 3 -