Pré-requis

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 blurb, 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 Blurb est installé sur l’ordinateur et que les paramètres de proxy de la JRE utilisée par Blurb 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 Blurb 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. Modification de code dans DotClear

DotClear ne sachant pas nativement faire l’export des données comme souhaité, nous devons y ajouter un module d’export “WXR”.

La première étape est de sauver le fichier suivant sous le nom de wxr.xml dans le sous-répertoire DotClear inc/public/default-templates/:
<?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 la fonction feed de /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:

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;
}
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: [VotreSite]
request header

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

POST /[Votre URL]/index.php\?feed/wxr

 

image

4.3 Test de connexion

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

image

Bingo, la liste des blogs nous est retournée!

image

image

5. Pas toutes mes photos sont importées dans Blurb! Pourquoi?

Ce problème semble être du au type de lien utilisé par DotClear pour les photos. Certaines anciennes versions de DotClear ne semblait pas encoder les liens avec les caractères approprié (%20 pour l’espace par exemple).

La solution – contraignante – consiste à aller mettre à jour cet encodage dans la base de données. Il faut d’abord identifier tous les répertoires d’images contenant des espaces ou des caractères spéciaux.

La requête SQL suivante permet ensuite de voir si des articles possèdent le problème d’encodage mentionné:

SELECT post_id from dc_post where  INSTR(post_content_xhtml, '<a href="/[Votre URL]/public/repertoire photo avec espace/') > 0

Si un ou plusieurs documents sont retournés, il faut faire la mise à jour à l’aide de la commande SQL suivante – attention, il est vivement conseillé de faire une sauvegarde de la base de données avant d’exécuter de telles commandes!
UPDATE dc_post
set post_content =
   REPLACE(post_content,
   '|/[Votre URL]/public/repertoire photo avec espace/',
   '|/[Votre URL]/public/repertoire%20photo%20avec%20espace/'),
post_content_xhtml = REPLACE(post_content_xhtml,
   '<a href="/[Votre URL]/public/repertoire photo avec espace/',
   '<a href="/[Votre URL]/public/repertoire%20photo%20avec%20espace/')

Afin de détecter d’autres problèmes, il peut être intéressant de jeter un oeil au répertoire de travail de Blurb, situé dans Documents\BookSmartData\<nomDuProjet>\library\. Il s’y trouve notamment un fichier .bml qui est la transcription XML en plus haut niveau de ce qui a été récupéré via WXR.