Geek, alcool et rock'n'roll

Aller au contenu | Aller au menu | Aller à la recherche

Informatique

Des trucs de geeks

Fil des billets - Fil des commentaires

lundi 12 juillet 2010

MySQL Connector, GPL, et autres licences

Chouette, se disent mes lecteurs, encore un billet geek !

Aujourd'hui, je vais partager avec vous des problèmes de licences. Je me pose certaines questions concernant la contamination[1] de la GPL.

Tout ça a commencé avec l'utilisation d'un connecteur MySQL. Le connecteur MySQL, c'est ce bout de code qui permet à une application d'accéder à une base de données MySQL. Ce connecteur est sous licence GPL, avec une exception pour d'autres licences Open Source, le but étant qu'un logiciel Open Source peut utiliser le connecteur même si sa licence n'est pas compatible avec la GPL.

Évidemment, en entreprise, on ne veut pas forcément ouvrir son code en Open Source. Dans le cas de MySQL, généralement ça ne pose pas de problème, car ça reste côté serveur et il n'y a pas redistribution. Mais dès lors qu'il y a redistribution (vers des filiales par exemple), le problème se pose.

Le connecteur C

On va parler d'abord du connecteur C, car c'est le plus simple à aborder du point de vue des licences : si on l'utilise, on doit se lier avec, et donc la GPL doit s'appliquer. Dès lors, si on veut distribuer un logiciel en C (ou C++) qui a besoin d'une base de données, il y a peu de choix :

  • soit on achète une licence à MySQL[2],
  • soit on change de base de données, par exemple PostgreSQL[3], qui est sous une licence similaire à BSD.

Le connecteur Java

On va corser un peu et parler du connecteur Java.

En Java, on utilise une interface bien pratique qui s'appelle JDBC. Cette interface est implémentée par tous les connecteurs de base de données, ce qui permet très facilement de passer d'une base à une autre. Évidemment, il va exister des différences dans les implémentations, ne serait-ce que dans le SQL à utiliser, mais l'API est identique. JDBC permet un découplage entre la bibliothèque GPL et l'application qui l'utilise.

Il y a deux manières d'utiliser un connecteur JDBC : soit directement, soit, dans le cas d'une application JEE, par le conteneur JEE.

Utilisation directe

Dans ce cas, même s'il y a découplage par JDBC, je pense qu'on rentre dans le champ de la GPL. En effet, on va spécifiquement ajouter le connecteur dans le classpath de l'application, et généralement on va même l'embarquer avec les autres bibliothèques utilisées. Et on va même nommer directement le Driver spécifique à ce connecteur. Pour le connecteur MySQL, ça se fait ainsi :

Class.forName("com.mysql.jdbc.Driver");

On peut évidemment exporter cette chaîne de caractères dans un fichier de configuration, pour découpler un peu plus, mais j'ai l'impression que c'est noyer le poisson.

Utilisation dans le cadre du serveur d'application

Dans un serveur d'application, c'est le serveur qui va fournir la connexion à la base de données. En principe, l'application ne sait pas particulièrement où elle est connectée, et à qui. Ainsi, à mon sens, l'application peut utiliser le connecteur GPL dans ce cas... puisqu'elle ne sait même pas qu'elle l'utilise[4].

On est pourtant dans ce que j'appelle une zone grise, car c'est pas très clair tout ça. Dans une telle application, on va tout de même avoir des requêtes SQL spécifiques à MySQL. Ou bien on va configurer Hibernate en lui disant qu'on utilise un connecteur MySQL. Des trucs comme ça qui sont autant d'indices qu'on est bien adhérent à MySQL, que l'application ne fonctionnera pas sans connecteur, que donc la licence GPL s'applique, et qu'on a donc pas le droit d'utiliser la bibliothèque.

Et dans PHP ?

PHP, c'est commode, vient avec son client MySQL. Ce client MySQL est bien sûr implémenté en utilisant le connecteur C vu plus haut[5].

Dès lors, une application PHP qui n'est pas GPL ou dans une licence Open Source concernée par l'exception a-t-elle le droit d'utiliser directement le client MySQL de PHP ? Et si elle passe par une bibliothèque d'abstraction comme PDO ?

Conclusion

J'en n'ai pas vraiment. Je dirais juste que la GPL, c'est assez facile à appliquer dans le monde des programmes compilés (et encore, avec les chargements dynamiques de bibliothèques, ça peut devenir aussi compliqué). Mais dans le monde des langages interprétés (ou entre les deux, comme Java), c'est plus difficile.

Et vous, vous avez un avis ?

Notes

[1] Ou l'incompatibilité, pour éviter le terme de "contamination".

[2] C'est bien, car on participe ainsi à son développement.

[3] C'est bien aussi, car c'est à mon avis la meilleure base de données Open SOurce.

[4] Dans ce cas, quelqu'un est-il hors-la-loi ? Celui qui déploie l'application ?

[5] Je viens de lire que PHP a fait leur propre client MySQL. Dans ce cas, ça ne s'applique sans doute pas.

mardi 6 juillet 2010

Intégrer Jackson avec CXF 2.2

Bonjour à tous,

Et oui, encore un billet technique, désolé à mes lecteurs non-geeks ;-)

Aujourd'hui, en effet, je me suis pris le chou avec CXF. J'espère que ça pourra être utile à d'autres ;-)

Le contexte : JAX-RS et CXF

À tort ou à raison, on utilise CXF comme implémentation JAX-RS. JAX-RS, c'est une spécification Java pour pouvoir faire du REST. CXF utilise Jettison comme sérialiseur JSON. Or, Jettison s'appuie sur JAXB[1], ce qui est bien pratique pour le développeur, mais tout pourri pour ce qui est du JSON produit[2].

Jackson : le sérialiseur JSON idéal

C'est là qu'intervient jackson. Je crois que c'est aujourd'hui le meilleur sérialiseur JSON pour Java. Et en plus, il y a plein de docs pour le faire fonctionner avec JAX-RS. Sauf qu'en fait, ça marche pas[3].

La solution avec Spring

Voici la solution trouvée, dans un fichier de contexte Spring :

<jaxrs:server id="monBeauServiceRest" address="/service">
  <jaxrs:serviceBeans>
    <ref bean="monBeanRest" />
  </jaxrs:serviceBeans>
  <jaxrs:providers>
    <ref bean="jsonProvider"/>
  </jaxrs:providers> 
</jaxrs:server>

<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider">
</bean>

Notes

[1] La spécification Java pour faire du XML facilement.

[2] Notamment, les tableaux/collections sont sérialisés différemment en fonction de leur contenu. Pratique.

[3] Ou alors ça marche peut-être en JAX-RS 1.1 implémenté par CXF 2.3 pas encore sorti. Ou avec Jersey.

vendredi 21 mai 2010

Problème de mémoire avec les closures dans Internet Explorer

Comme décrit dans l'article lié depuis mon post précédent, Internet Explorer (jusqu'à la version 7 comprise) n'arrive pas à libérer de la mémoire dans certains cas, autrefois assez rares, mais très répandus dans notre monde 2.0.

Un article de Microsoft décrit bien les différents cas où ce problème arrive. Utile à avoir sous la main !

jeudi 20 mai 2010

Les closures avec JavaScript

Un dernier pense-bête pour la route, histoire de faire de la place dans ma barre d'onglets : l'excellente explication de Richard Cornford sur les closures en Javascript.

Préparez-vous à avoir mal à la tête, c'est pas simple. Mais il est nécessaire de comprendre ça dès lors qu'on veut coder du JavaScript un peu sérieusement. Bonne lecture !

Dive into HTML5

Je continue mon petit pense-bête, avec un bouquin sur HTML5 directement disponible en ligne : Dive into HTML 5. Le livre sera disponible et vendu au format papier lorsqu'il sera fini.

C'est la suite des excellents Dive into Accessibility (dispo aussi en français grâce au travail de Karl Dubost) et Dive into Python.

Marc Pilgrim est fou. :-)

HTML5, CSS3, nouvelles API, et les anciens navigateurs avec Modernizr

Ce billet me sert surtout de pense-bête pour Modernizr.

Ça a l'air pas mal : pouvoir simplement utiliser les fonctionnalités récentes du Web (The Web Stack comme dit Eric Meyer) tout en assurant une dégradation gracieuse pour les navigateurs à la mord moi le noeud plus anciens. C'est un peu la suite de html5shiv.

Dans la même veine, il y a aussi IE-CSS3 qui permet l'usage des pseudo-sélecteurs CSS3 dans IE5 à IE8, en utilisant une bibliothèque JavaScript. Un pseudo-sélecteur, c'est un truc comme :empty, :disabled, etc. Dommage, ça ne supporte pas :required ou :valid :-).

Quelqu'un a déjà utilisé tout ça ?

vendredi 26 mars 2010

Paris-Web 2010 : appel à propositions !

(english version below)

Version française

Bonjour à tous,

Paris Web est une conférence française organisée chaque année autour des questions d'accessibilité, de qualité et de design web. Pour sa cinquième édition, la conférence veut élargir son sujet et vous propose de réfléchir sur la question suivante : « Améliorer l'expérience utilisateur à travers un design et des contenus appropriés » (question non limitative).

Paris Web 2010 se tiendra du 14 au 16 octobre 2010, et nous invitons tous les orateurs potentiels à se manifester par un email à l'adresse propositions@paris-web.fr.

Vous pouvez proposer un ou plusieurs sujets dans les formats suivants :

  1. Conférence : 50 minutes, questions comprises.
  2. Mini-conférence : 15 minutes, sans questions du public.
  3. Atelier : 1 heure 30 (ou 3 heures pour un atelier double).

Les conférences et mini-conférences auront lieu dans les amphithéâtres les jeudi et vendredi. Les ateliers auront lieu dans des salles de 40 à 60 personnes le samedi. Ils sont l'occasion d'une grande interactivité, et peuvent être soit sous une forme théorique, soit sous une forme pratique (le cas échéant, des salles équipées d'ordinateurs seront prévues).

La date limite de dépôt des propositions de contributions est fixée au 31 mai 2010.

Idéalement, merci de présenter votre proposition de la façon suivante :

  1. Vous, en quelques lignes
    Qui êtes-vous ? Quel est votre parcours ? Votre spécialité ?
  2. Votre sujet
    En dix lignes maximum, un titre (qui n'a pas besoin d'être définitif) et un résumé de ce que vous allez traiter. Merci d'indiquer le niveau du public estimé.
  3. La forme de votre intervention
    Selon vous, cette intervention sera-t-elle plutôt une conférence, une mini-conférence, un atelier ? (nous pouvons en rediscuter ensemble)

Les personnes qui ont fait une proposition seront avisées personnellement de la suite donnée, que leur proposition soit retenue ou non.

Si vous êtes retenu, vous aurez la possibilité d'être défrayé pour vos transports et logé à l'hôtel par nos soins. Pour rappel, vous serez filmé et les vidéos seront mises à disposition gratuitement sur internet (sous licence CC-By-NC).

Vivement octobre !

English version

Hello all,

Paris Web is a French conference organised each year and revolving around questions of web accessibility, quality and design. For its fifth edition, the conference wants to broaden its subject base and suggests that you think of this question: “Improve the user experience through appropriate design and contents” (non-limiting question).

Paris Web 2010 will take place on the 14-16th of October 2010, and we invite all the potential speakers to speak out and get in touch with us at propositions@paris-web.fr.

You can submit one or more topics under the following formats:

  1. Conference:  50 minutes, Q&A included
  2. Mini-conference: 15 minutes, without Q&A
  3. Workshop: 1 hour 30 (or 3 hours for a double-length workshop)

Conferences and mini-conferences will take place in amphitheaters on Thursday and Friday. Workshops will take place in 40 to 60 people rooms on Saturday. They are a moment of intense interactivity, and can be either theoretical or practical (rooms with computers will be provided if necessary).

The deadline for proposals is set to the 31st of May 2010.

Ideally, here is the form your proposal should have:

  1. You, in a few lines
    Who are you? What is your experience? Your specialty?
  2. Your subject
    In up to ten lines, a title (doesn't need to be the definitive choice) and a summary of what you wish to deal with. Please indicate the estimated level of the audience.
  3. The form of your intervention
    According to you, will this be better suited for a conference, a mini-conference, or a workshop? (We can talk about it.)

People who have submitted a subject will be notified personally, whether their subject is selected or not.

If you are selected, you will be able to have your travel expenses and hotel paid. Please bear in mind that videos will be recorded and will be made available for free on the internet (under the CC-By-NC licence).

We can't wait for October!

mardi 12 janvier 2010

VMware Player 3 (ou Workstation 7) et Linux 2.6.32

Il y a des problèmes avec la compilation de certains modules spécifiques à VMware. On obtient une erreur du type :

/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: In function ‘VNetUserListenerEventHandler’:
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: (Each undeclared identifier is reported only once
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: for each function it appears in.)
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: In function ‘VNetUserListenerRead’:
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: implicit declaration of function ‘signal_pending’
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: implicit declaration of function ‘schedule’
make[4]: *** [/tmp/vmware-root/modules/vmnet-only/vnetUserListener.o] Erreur 1
make[3]: *** [_module_/tmp/vmware-root/modules/vmnet-only] Erreur 2

La méthode la plus simple pour le faire fonctionner, je l'ai trouvée sur un blog de geek. Je la recopie ici afin d'apporter un peu de pérennité, on sait jamais. Les deux dernières commandes sont à exécuter avec les droits root :

cd /tmp
tar xf /usr/lib/vmware/modules/source/vmnet.tar
tar xf /usr/lib/vmware/modules/source/vmci.tar

cd vmnet-only
sed -i "/vnetInt.h/ a\#include \"compat_sched.h\"" vnetUserListener.c

cd ../vmci-only/include
sed -i "/compat_page.h/ a\#include \"compat_sched.h\"" pgtbl.h

cd /tmp
tar cf /usr/lib/vmware/modules/source/vmnet.tar vmnet-only
tar cf /usr/lib/vmware/modules/source/vmci.tar vmci-only

Il suffit ensuite de redémarrer vmplayer (ou vmware si c'est Workstation) et leur appli se charge de recompiler les modules si elle ne les trouve pas.

lundi 4 janvier 2010

Flex Builder 3 avec Eclipse Galileo 3.5.1 sous Linux

Un petit billet pour pointer vers les sites qui m'ont servi à résoudre ça :

(et oui, désolé, je fais du Flex, un peu...)

jeudi 24 décembre 2009

How to update the BIOS firmware on a Dell Laptop using only Debian Linux

(Yes, I know that's GNU/Linux, but my title was already too long :-) ) Translation of my last post in english. Hope it will be readable :-)

Dell publishes all BIOS firmwares as a Windows .EXE. When we try naively to execute it using Wine, Wine stops because the exe tries to flash the firmware using direct access to the hardware... which doesn't work with Wine.

The solution is to use dellBiosUpdate, which ships with the Debian package libsmbios-bin:

aptitude install libsmbios-bin

This tool needs 2 things : the bios firmware in HDR format, and the kernel module dell_rbu to do the update. For this last part, it's easy on a normal Debian (read: with a Debian kernel):

modprobe dell_rbu

For the HDR file, I tried during 2 hours... and indeed it was very easy (please replace the filename by the actual filename):

wine E6400A19.EXE -writehdrfile

Yes, Dell's .EXE knows how to write the HDR file !

Now, you can execute dellBiosUpdate :

dellBiosUpdate -f ./E6400A19.hdr -u

And reboot !

Please note that if you don't use Debian, Dell has some easy setup to update the BIOS firmware under Linux. It seems to work on RPM distributions, and also in Ubuntu. I tried to make it work with Debian, I think I successed but the repository seems to contain rather old firmwares. Maybe I'll try to help them make it work with Debian :-)

Comment mettre à jour le Bios de son portable Dell sous Debian Linux

(oui, je sais, on dit GNU/Linux, mais mon titre était déjà trop long)

(English translation)

Aujourd'hui, on continue encore un peu avec les billets geeks. Et ça me permettra de pas perdre 2 heures la prochaine fois :-)

En effet, aujourd'hui, j'ai voulu mettre à jour mon BIOS. En effet, il est possible que ce soit ça qui fasse que... bref, cette histoire sera pour plus tard.

Il faut savoir que Dell fournit ses nouveaux bios sous forme d'un exécutable Windows. Quand on l'exécute bêtement avec Wine, ça plante... car il essaie de flasher directement le Bios en accédant au matériel, et Wine n'a pas implémenté ça.

La solution consiste à passer par l'utilitaire dellBiosUpdate, qui se trouve dans le paquet Debian libsmbios-bin:

aptitude install libsmbios-bin

Cet utilitaire a besoin de deux choses : le Bios au format HDR, et le module noyau dell_rbu pour faire l'update proprement dite. Pour le module, rien de plus simple sur une Debian "normale" :

modprobe dell_rbu

Pour le fichier HDR, j'ai peiné pendant 2 heures, et en fait, c'est très simple (remplacer le nom du fichier par le nom correct):

wine E6400A19.EXE -writehdrfile

Et oui, les exécutables de flashage du Bios Dell savent écrire le HDR !

Et voilà, il ne reste plus qu'à exécuter dellBiosUpdate :

dellBiosUpdate -f ./E6400A19.hdr -u

Et à redémarrer sa machine.

Notez que si vous n'êtes pas sur Debian, Dell propose une manière facile de mettre à jour son Bios. J'ai essayé de faire marcher ça sous Debian, je pense que j'ai réussi à peu près, mais le dépôt ne semble pas à jour avec les derniers Bios. Je vais voir si je peux pas les aider à faire marcher ça pour Debian[1].

Notes

[1] Chouette, un autre projet, j'en manquais.

mardi 22 décembre 2009

Debian, Java et IPV6

J'ai décidé hier de mettre à jour la Debian de mon PC du boulot.

Globalement, ça s'est bien passé. Il y a eu cependant deux problèmes majeurs : VMWare ne se lance plus, et j'en parlerai dans un autre billet si j'arrive à résoudre le problème, et Eclipse me retournait un joli "network unreachable" dès que j'essayais d'accéder au gestionnaire des plug-ins.

J'ai d'abord réalisé un petit programme Java, pour vérifier que c'était bien tout Java qui était concerné :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class TestReseau {
	public static void main(String[] args) throws MalformedURLException,
			IOException {
		URLConnection connection = new URL("http://www.google.fr")
				.openConnection();
		BufferedReader reader = new BufferedReader(new InputStreamReader(
				connection.getInputStream()));

		StringBuilder sb = new StringBuilder();
		String line;

		while ((line = reader.readLine()) != null) {
			sb.append(line + '\n');
		}

		System.out.println(sb.toString());
	}
}

Et, oui, que ce soit avec Java 5, Java 6, ou OpenJDK, le même problème apparaissait.

Une recherche rapide m'a amené sur le bug tracker Debian, avec la solution :

  • modifier /etc/sysctl.d/bindv6only.conf, nouveau fichier amené par la version 4.38 de netbase,
  • changer la valeur de net.ipv6.bindv6only vers 0,
  • et recharger procps par /etc/init.d/procps restart.

C'est très pénible de perdre une heure sur des changements silencieux comme ça, mais au moins, j'ai trouvé la solution... pas comme avec VMWare.

Mise à jour : il y a eu aussi un ptit bug avec Eclipse avec un GTK récent. Rapidement résolu en utilisant la variable d'environnement préconisée : GDK_NATIVE_WINDOWS=1. Le problème était que les contrôles ne répondaient pas toujours correctement (genre les boutons-poussoirs restaient appuyés quand on cliquait dessus, sans produire d'effet).

dimanche 22 novembre 2009

Plug-in captcha accessible pour Dotclear 2

Ça fait quelques semaines que je travaille sur un plug-in captcha accessible pour Dotclear 2. Ce plugin existait pour Dotclear 1 et je l'utilisais, et donc il m'a manqué lorsque je suis passé sous Dotclear 2[1].

C'est quoi, un captcha ?

Un captcha, c'est un mécanisme qui permet de s'assurer que ce qui interagit avec le programme est bien un être humain. Pour cela, plusieurs techniques sont utilisables. Vous avez sans doute déjà rencontré ces images avec du texte tordu à l'intérieur, qu'il faut recopier dans une case, pour prouver qu'on n'est pas une machine.

Pourquoi un captcha accessible ?

Je ne sais pas pour vous, mais moi, les images avec du texte tordu, ça me saoule : non seulement ce n'est pas complètement efficace, mais en plus je n'y arrive pas toujours du premier coup ! À force de vouloir les faire inviolables, ils en deviennent inviolables même pour des vrais humains !

Et ne parlons même pas des personnes qui ont vraiment des problèmes handicapants.

Un captcha accessible devra montrer que l'être qui commente sur un billet est bien un être humain, et ce de manière moins agressive que les captchas graphiques.

C'est quoi le principe ?

Le principe est simple : lorsque quelqu'un veut poser un commentaire, il doit aussi répondre à une question simple, du genre "combien font deux et deux ?". Si il n'y répond pas ou s'il répond à côté, le message est marqué comme "indésirable". Dans le cas idéal, il faudrait que, lorsqu'on répond mal, le plug-in propose de répondre à nouveau, jusqu'à un certain nombre d'échecs (2 ou 3 ?), mais ce n'est pas fait pour le moment.

De fait, lorsque j'utilisais ce plug-in dans le passé, je n'ai jamais eu de problème de spam, alors que j'en ai aujourd'hui avec Dotclear 2 et ses plugins de spam par défaut.

Comment ça marche ? Un peu de technique

On stocke la liste des questions en base de données. J'en suis à construire la gui pour cela en m'inspirant du filtre des bad words. Dans la base, on a aussi une table de correspondance entre un hash, créé lorsque le formulaire de commentaires est affiché, et la question posée. Cela évite le rejeu (genre si on fait qu'un hash de la question, il suffit de donner le hash avec la réponse qui va bien, et voilà, l'antispam est contourné), et permet de vérifier néanmoins que la réponse est correcte.

Une version 1.0

Je me dis qu'il y a encore beaucoup de choses à faire, mais voici néanmoins une version 1.0 (voir les fichiers attachés).

Voici les fonctionnalités implementées :

  • Gestion des questions/réponses depuis l'interface d'admin
  • Installation automatique de la base de données et d'une question par défaut
  • Purge des sessions stockées en base
  • Traduction française et anglaise

Ce qu'il me reste à faire avant d'être pleinement satisfait :

  • faire une passe sur l'architecture, peut-être repenser les objets existants
  • renommer certaines classes pour coller aux conventions Dotclear
  • implémenter la possibilité de se tromper une ou deux fois
  • peut-être implémenter l'install dans mon objet AccessibleCaptcha, qui serait juste appelé dans _install.php.

Gestionnaire de versions

J'en ai profité pour essayer mercurial, donc j'ai créé un repo sur bitbucket :

Page sur le wiki de Dotclear Lab

Mes références

Notes

[1] Et en plus le site du plugin pour Dotclear 1 n'existe plus. Si besoin, je dois en avoir une copie dans un coin !

Votre vieux noyau Linux tue vos processus ?

Oui, c'est un peu ce qui est arrivé sur nos machines du boulot.

On a du vieux Redhat Enterprise Linux 4, qui vient avec un vieux noyau 2.6.9 patché jusqu'au cou[1].

Et voilà, ce bon vieux noyau contenait un mécanisme appelé l'OOM killer. Ce mécanisme permet, lorsqu'il n'y a plus de mémoire vive disponible, de tuer le "meilleur" processus afin de récupérer de la mémoire vive.

En soi, c'est plutôt louable. Mais voilà, vous vous en doutez, c'est bien la définition de "meilleur" qui pêche ! En l'occurence, c'étaient les processus serveurs. Gênant.

Notes

[1] Pour info, on en est au 2.6.31 aujourd'hui. Le 2.6.9 "original" date d'octobre 2004. De l'eau a coulé sous les ponts...

Lire la suite...

vendredi 20 novembre 2009

Rescanner le bus SCSI sous Linux 2.6

C'est tout simple :

echo “- - -” > /sys/class/scsi_host/hostH/scan

Il faut évidemment remplacer H par un numéro, généralement 0 lorsqu'on n'a qu'un bus SCSI.

Avec cette commande, on détecte donc les devices SCSI qui ont été ajoutés depuis le dernier scan du bus... utile lorsqu'on ajoute un disque dynamiquement dans une VM gérée par VMWare (ou autres (?)).

On peut vérifier la détection avec la commande dmesg :

SCSI device sdb: 20971520 512-byte hdwr sectors (10737 MB)
sdb: cache data unavailable
sdb: assuming drive cache: write through
 sdb: unknown partition table
Attached scsi disk sdb at scsi0, channel 0, id 1, lun 0

(oui, c'est un aide-mémoire... mais qui sait, ça peut servir à d'autres ?)

Trouvé sur le site d'IBM, où se trouvent aussi d'autres commandes qui peuvent servir.

lundi 16 novembre 2009

Comment intégrer proprement du Flash dans une page web

Ça fait trop longtemps que je vois du code crado pour insérer du Flash, alors qu'il existe du code standard qui fonctionne sous tous les navigateurs[1], qui utilise une seule balise object.

Voici donc ma manière à moi d'insérer une application Flash, avec par exemple la vidéo des Girls in Hawaii insérée dans un post précédent :

<object width="425" height="344"
     type="application/x-shockwave-flash"
     data="http://www.youtube-nocookie.com/v/CYpxmGaV6Ro&hl=fr&fs=1&rel=0">
  <param name="movie" value="http://www.youtube-nocookie.com/v/CYpxmGaV6Ro&hl=fr&fs=1&rel=0" />
  <param name="allowFullScreen" value="true"></param>
  <param name="allowscriptaccess" value="always" />
  Girls in Hawaii - Joking about my life
</object>

Note: Je viens de voir que Dotclear 2 permet d'ajouter un média externe, et qu'il utilise ce même code pour le faire !

Notes

[1] À ma connaissance

jeudi 5 novembre 2009

Récupérer le mot de passe admin stocké dans OpenLDAP

Au menu, un petit problème qui m'a embêté aujourd'hui. Ça pourra paraître bateau à pas mal de gens, mais j'ai bien dû chercher une heure avant de trouver la solution par moi-même, car Google ne m'aidait pas trop. J'espère que ça servira donc à quelqu'un.

Le problème

J'avais une vieille installation de OpenLDAP sur une machine, installé et configuré automatiquement par les outils Debian.

Si je ne me trompe pas, ces outils installent une base sécurisée, dans le sens où le mot de passe admin n'est stocké en clair nulle part. Ils le demandent à l'installation (avec le Bind DN associé), l'insèrent dans le référentiel, et configurent le fichier slapd.conf pour autoriser ce Bind DN à écrire partout.

Me voilà bien embêté, 2 ans après, pour accéder à ce Bind DN ! Les mots de passe par défaut habituels y sont tous passés: password, secret, admin... Rien n'y fait.

La manière brute

Le premier essai, naïf, a consisté à accéder au référentiel directement. Un ptit coup de slapcat permet de récupérer l'intégralité du contenu du référentiel. Là, on a, pour notre DN, un champ userPassword, qui ressemble à ça :

userPassword:: e01ENX1BjhU4KiFacVhpaT0oKYDeRTNuQ3p3PT0=

(Note: je l'ai modifié, ce n'est sans doute plus quelque chose qui veut dire quelque chose).

Ce champ est encodé en Base64, pour le décoder j'ai utilisé l'outil base64 de la manière suivante :

echo 'e01ENX1BjhU4KiFacVhpaT0oKYDeRTNuQ3p3PT0=' | base64 -d

Cela a retourné la chaîne {crypt}AT35SkUje86dKL7KE3nCzw== (ou quelque chose approchant, j'avoue que je triche).

Zut, une chaîne hashée... J'aurais dû m'y attendre ! Je me suis donc fait un petit fichier passwd-like contenant une ligne :

admin:AT35SkUje86dKL7KE3nCzw

Et j'ai lancé l'excellent logiciel de crackage de mot de passesécurité john :

john passwd

Après quelques minutes de crackage intensif, john ne m'a rien trouvé. J'avais utilisé un mot de passe à peu près sécurisé. J'ai donc utilisé mon cerveau pour changer directement le mot de passe.

La manière douce

C'est en fait beaucoup plus simple. On peut définir un DN root avec un mot de passe associé dans le fichier de configuration du serveur OpenLDAP. C'est d'ailleurs ce qui est indiqué souvent dans les divers HOWTO.

C'est donc ce que j'ai fait; j'ai ajouté les lignes suivantes à l'endroit opportun de mon fichier /etc/ldap/slapd.conf:

rootdn "cn=root,dc=monbeaudomaine,dc=fr"
rootpw monbeausapin

Puis j'ai redémarré slapd, je me suis connecté sur le référentiel en utilisant ces informations, et j'ai pu changer le mot de passe de mon DN admin précédent. Je me suis ensuite empressé de commenter ces deux lignes puis de redémarrer à nouveau slapd.

jeudi 1 octobre 2009

VMWare, linux, souris

Depuis que j'avais mis à jour ma Debian, la souris ne fonctionnait plus correctement dans mon VMWare Windows que j'utilise pour accéder aux applications spécifiques du boulot. En effet, elle n'affectait plus la VM guest, donc je n'arrivais plus à contrôler le système.

J'ai trouvé la solution sur un blog anglophone: il suffit de lancer, à la place de vmplayer :

VMWARE_USE_SHIPPED_GTK=yes vmplayer

et voilà :)

mercredi 29 juillet 2009

Trou de sécurité chez Adobe Flash

Certains le savent peut-être déjà, mais un gros trou de sécurité affecte Adobe Flash. Sauf cas particulier, il est à peu près sûr que vous ayiez ce logiciel installé (c'est celui qui permet de lire les vidéos sur Youtube et la quasi totalité des des sites de vidéo[1]). Donc, vous êtes mal, car il n'y a pas encore de correctif sorti par Adobe, prévu pour jeudi et vendredi. Et puis, ah oui, j'oubliais, des exploitations du bug sont déjà en ligne sur Internet. Bref, vous êtes mal.

A partir de là, il y a deux solutions :

  • désactiver Flash tant qu'il n'y a pas de correctif de la part d'Adobe. Dans Firefox 3 (ou 3.5), ça se fait dans "Outils/Modules complémentaires", et il faut aller dans l'onglet "Plugins'". Là, on peut désactiver le plug-in Adobe Flash. Par contre, il sera désactivé pour tous les sites, et il faudra le réactiver à nouveau après le correctif d'Adobe.
  • installer l'excellente extension Firefox NoScript, installable directement depuis "Outils/Modules complémentaires".

L'extension NoScript désactive tout contenu actif (Javascript, Flash, Silverlight) par défaut, et vous permet de l'activer site par site. Ainsi, aucun risque de se choper du code qui viendrait d'un site non connu.

Il faut savoir en effet que, bien souvent, même les sites corrompus (c'est-à-dire les sites où vous auriez l'habitude d'aller, mais qui se seraient fait pirater pour pouvoir ajouter l'exploitation du bug) font référence au script d'exploitation depuis un serveur distant. En fait, avec NoScript, la seule possibilité de ne pas être protégé est si un site que vous avez autorisé se retrouve complètement piraté. Je ne vais pas vous mentir, ça peut arriver.

Bon, en plus, en définissant précisément les domaines de confiance, cela vous permet de pas donner vos informations à n'importe qui, et de véritablement contrôler ce qui est exécuté chez vous. Et donc, vous seriez aussi un peu mieux protégé contre les problèmes de sécurité à venir.

Bref, NoScript, c'est bon, mangez-en :-)

Notes

[1] Sauf la démo de dailymotion qui utilise les fonctionnalités HTML5.

jeudi 26 mars 2009

Namespaces et XML, et, surtout, elementFormDefault

Bon, ce soir, je comprenais pas pourquoi j'avais des éléments non qualifiés dans mes messages SOAP :

<?xml version="1.0"  standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:sayHello xmlns:ns2="http://hello/">
<arg0>Juju</arg0>
</ns2:sayHello>
</S:Body>
</S:Envelope>

Alors que dans mon WSDL, j'avais un truc comme ça :

<xs:schema targetNamespace='http://hello/' version='1.0' xmlns:tns='http://hello/' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
 <xs:element name='sayHello' type='tns:sayHello'/>

 <xs:complexType name='sayHello'>
  <xs:sequence>
   <xs:element minOccurs='0' name='arg0' type='xs:string'/>
  </xs:sequence>
 </xs:complexType>
</xs:schema>

Mon arg0 aurait du être dans mon tarnetNamespace !

Alors, j'ai été lire la spécification XML Schema. Je dois dire que c'est un peu douloureux, mais j'ai tout de même trouvé la réponse !

Elle est très bien expliquée sur ce billet de blog, mais, rapidement, la raison vient de l'attribut optionnel elementFormDefault. En effet, cet attribut de schema vaut, par défaut, unqualified. Cela signifie que les éléments définis de manière imbriquée sont définis dans le namespace par défaut !

Alternativement, si l'attribut elementFormDefault avait été spécifié avec une valeur de qualified, alors arg0 aurait bien été dans le namespace http://hello/ !

Parfois, le XML, ça me fatigue....

- page 1 de 5