Newsbeuter: un lecteur de flux RSS en mode texte (ou comment devenir hacker pour les nuls...)

J'ai découvert Newsbeuter il n'y a pas très longtemps. L'intérêt du mode texte pour ce genre d'outils c'est qu'on ne charge pas trop les ressources et qu'on peut se concentrer sur ce qui est important: le texte et pas le reste qui est censé faire beau. De plus, le fait d'axer beaucoup de choses sur le texte fait qu'on évite de perdre trop de temps à lire les articles "bookmarks" ou "image" (ceux qui contiennent très peu d'informations ou juste une image avec commentaire).

Pour les articles qui se révèlent intéressants par leur contenu texte, j'utilise la fonction d'ouverture des liens de Newsbeuter qui permet l'affichage dans un navigateur web graphique.

Tout ça pour dire que la gestion des flux RSS avec cet outil très simple est vraiment facilitée. Il se concentre sur l'essentiel: une liste de flux. Pour chaque flux, une liste de messages et on peut lire chaque message. Pas besoin de graphisme pour faire tout ça. De plus, Newsbeuter récupère les flux en local, on peut donc les lire déconnecté d'Internet. Enfin, le fait de disposer d'une liste locale permet facilement de voir si un flux a reçu de nouveaux messages: plus besoin de cliquer à tord et à travers.

Mais, Newsbeuter est également un prétexte pour parler de développement et de hacking. On pense souvent que le développement est une affaire compliquée et que corriger des bugs et proposer des patchs, c'est pour les pros, les gens qui ont utilisé l'application depuis des lustres et qui ont étudié son fonctionnement interne. Mais, Newsbeuter va me donner l'occasion de démontrer le contraire...

Le problème de proxy

J'ai testé Newsbeuter au bureau et je me suis arraché les cheveux: pas moyen de le faire fonctionner ! Au bureau, je suis dérrière un proxy (en fait plusieurs au choix). Ce proxy demande une authentification avec un compte/mot de passe personnel avant d'effectuer une requête vers un serveur externe. Cette authentification est gérée en mode "Digest": le flux qui me conduit à livrer mon mot de passe personnel est chiffré. D'une manière générale, assez peu de programmes gèrent ce mode d'authentification pour les proxy. Souvent, seul le mode "Basic" est utilisé.

En utilisant Wireshark, je me suis amusé à voir comment Newsbeuter faisait pour converser avec le proxy. Je me suis vite rendu compte, au vu des en-têtes HTTP qu'il n'utilisait que l'authentification en mode "Basic"... dommage ! J'ai fouillé le site officiel du logiciel et j'ai trouvé un outil de suivi de bugs (hébergé par Google). J'ai cherché des traces de mon problème en recherchant les termes proxy dans les bugs ouverts et fermés. Ma recherche a été infructueuse...

Du hacking, sauce légère

Le code de Newsbeuter étant hébergé sur GitHub, j'ai profité de l'interface de recherche pour chercher tout simplement le terme proxy dans le code ! En fait, le source ne contient que deux occurence au terme "proxy": dans le fichier rss/parser.cpp et src/utils.cpp. Au passage, j'ai remarqué que Newsbeuter était codé en C++, langage dans lequel je n'ai aucune compétence (mais j'ai des notions de C). En analysant ces fichiers, j'ai vu que la gestion du rapatriement des flux utilisait "libcurl". Instinctivement, j'ai consulté la documentation de curl pour vérifier si ce dernier gérait les proxy qui demandent une authentification en mode "Digest". Et, effectivement, il y avait une option pour gérer le mode d'authentification du proxy: Basic, Digest ou NTLM.

En utilisant curl, j'ai réussi à récupérer un flux RSS à la main par ce proxy Digest. Je me suis donc dit qu'il était possible à la libcurl de faire pareil. J'ai rapidement parcouru le code faisant référence à la gestion de proxy dans Newsbeuter pour voir que les options de gestion de proxy défines dans le fichier de conf de Newsbeuter étaient simplement retranscrites en tant qu'options pour la libcurl.

J'ai rapidement fouillé l'API de la libcurl qui est facile à comprendre, surtout si on utilise son implémentation simplifiée (curl_easy_...). J'ai appris rapidement comment passer des options à la libcurl avant un téléchargement. J'ai trouvé une variable de configuration nommée CURLOPT_PROXYAUTH et en faisant une recherche rapide dans le moteur de recherche de Google, j'ai vu comment on s'en servait. Du coup, m'est apparu la révélation: par défaut, la libcurl utilise le mode d'authentification de proxy "Basic". Mais il est possible de rendre son comportement plus intelligent en utilisant le mode d'authentification CURLAUTH_ANY qui essaye d'abord le mode "Basic" puis analyse la réponse du proxy (qui indique qu'il veut du "Digest") et renvoie la bonne requête en mode "Digest".

Ainsi, pour faire fonctionner mon proxy en mode "Digest", j'ai juste eu à ajouter au code source de Newsbeuter une instruction du type: "Si l'utilisateur a configuré de quoi s'authentifier sur un proxy, on positionne l'option CURLOPT_PROXYAUTH à CURLAUTH_ANY et on ajoute les éléments de connexion (login/password)". En C++, j'ai donc dû simplement ajouter une ligne du type: curl_easy_setopt(handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY); .

Le cas présenté est extrèmement simple: la libcurl se veut facile d'emploi. Du coup, j'ai mis à peine 1h pour faire tout ce qui vient d'être cité plus haut. La correction est vraiment triviale mais jusqu'à présent, personne n'avait dû avoir le problème (les proxy Digest sont assez rares visiblement).

Comment tester

Modifier un code c'est bien, le tester, c'est mieux ! J'avais besoin de tester ça sur une Debian Squeeze. La version de Newsbeuter dans cette distribution est proche de la dernière version officielle du logiciel (2.2 contre 2.3). Voici comment j'ai procédé à la recompilation du paquet:

  • apt-get source newsbeuter (récupérer le source de Newsbeuter dans l'archive Debian)
  • se placer dans le répertoire de Newsbeuter (cd newsbeuter-2.2) et effectuer les modifications dans le source.
  • dans le répertoire newsbeuter-2.2 faire: fakeroot dpkg-buildpackage
  • Ca compile et produit un paquet newsbeuter-2.2-2_i386.deb
  • Il ne reste plus qu'à tester le paquet en l'installant: dpkg -i ./newsbeuter-2.2-2_i386.deb
  • Tester l'application en lançant newsbeuter et constater que ça marcher derrière un proxy Digest !
  • Comme ça marche, on va bloquer la version de newsbeuter pour éviter qu'aptitude n'écrase notre version spéciale: aptitude hold newsbeuter

Comment participer

J'ai ouvert un ticket dans le bugtracker de l'application en expliquant le problème. Le mieux est sans doute de faire un patch mais comme je n'ai pas l'habitude d'en faire, il me fallait réapprendre à utiliser correctement diff. Ce n'est pas compliqué mais je n'avais pas trop le temps. Du coup, j'ai laissé les indications de modifications avec les lignes de code dans le bug tracker.

Quelques jours plus tard, le mainteneur de Newsbeuter a de lui même effectué les corrections dans le source...

Dans quelques jours (ou mois), la version de Newsbeuter dans Debian sera mise à jour avec le support des proxy "Digest".

Conclusion

D'abord, Newsbeuter c'est bien, mangez-en ! Ensuite, débugguer une application n'est pas forcément quelquechose de compliqué. Effectivement, la taille du code, le fait qu'on utilise des bibliothèques externes sont des éléments qui rebuttent de prime abord. Mais l'expérience montre qu'il ne faut pas laisser tomber même si la tâche semble immense. N'oublions pas que la majorité des développeurs n'aiment pas réinventer la roue et qu'il existe sans doute quelques éléments déjà à disposition pour corriger un logiciel ou lui apporter de nouvelles fonctionnalités.

La correction de bugs est un art à part entière: c'est un ensemble de techniques qui sont bien différentes de la conception d'application. Je suis complètement néophyte en la matière mais je suis sûr qu'il existe des méthodes permettant de gagner du temps. Dans mon cas, le fait de pouvoir explorer le code facilement en est une. Le fait que l'API d'une bibliothèque soit simple à comprendre en est une autre.

Pour la suite, j'aimerai bien faire fonctionner correctement elinks avec ce proxy Digest mais c'est une autre histoire...

Posted mer. 23 juin 2010 18:58:21 Tags: