Les deux sociétés, crées avec 1 mois d'écart en 1998 et toutes deux localisées à Mountain view (Californie), ne se quittent plus.
En 2006 Google avait payé 57 Millions de dollars pour que Mozilla fasse de Google le moteur de recherche par défaut de Firefox. (Ce qui représente tout de même 85% des revenues de la fondation Mozilla).
Ce contrat courrait jusqu'en 2008. Bonne nouvelle (financière) pour les deux parties il vient d'être prolongé jusqu'en 2011, pour nous elle est l'assurance que Mozilla va pouvoir continuer à developper sereinement firefox, thunderbird...
![]()
Billet original de StephZ.
Votez pour cet article sur le Planet Libre.
Un rapide billet pour annoncer la préparation du débat/conférence sur « La Biennale de Paris et la Licence Art Libre », qui se déroulera le mercredi 24 septembre 2008 de 14h30- 16h30 lors de l'événement Paris Capitale du Libre.
La Biennale de Paris a décidé en juin 2008 de mettre ses contenus sous Licence Art Libre. Lors de ce débat seront abordées des pratiques artistiques qui excèdent le seul champ de l'art. Il s'agira d'interroger le statut de l'auteur et de l'objet d'art.
Présentation : Antoine Moreau http://artlibre.org
Intervenants : Ghislain Mollet-Viéville, agent d'art.
Exemples d'oeuvres proto ou para copyleft (Alan Kaprow, George Brecht, Lawrence Weiner) qui rejoignent le principe copyleft de la Licence Art Libre.
Alexandre Gurita, Directeur de la Biennale de Paris.
Mise au point sur les pratiques artistiques défendues par la Biennale de Paris en phase avec la Licence Art Libre.
Jean-Baptiste Farkas, Président de l'Amicale de la Biennale de Paris et créateur d'IKHÉA©SERVICES, un exemple de pratique artistique présentant quelques similitudes avec le copyleft.
http://biennaledeparis.org/amicales
Comme annoncé en accroche, je n'ai pas beaucoup de commentaires à ajouter à cette annonce : cette réunion entre Art Libre et Art Contemporain est pour moi lourde de sens et d'espoir pour les années à venir.
Pour ceux qui ne connaissent pas la Biennale de Paris ou le collectif copyleft attitude, je vous invite tout simplement à aller visiter leur site :
La Biennale de ParisVoir la présentation.
La Biennale de Paris, loin du ronronnement des grandes manifestations internationales, s’attache à découvrir et à défendre un art exigeant, en phase avec notre contemporanéité, avec ses évolutions politiques, économiques et sociales. Un art qui ne se contente plus de produire des objets à l’usage d’un marché, d’une mode ou d’une élite culturelle. Un art qui se définit comme une façon de penser l’art et de l’activer plutôt qu’un ensemble de produits artistiques. Un art qui ne cherche plus le spectaculaire mais qui interroge, qui essaie et qui opère. La Biennale de Paris est le dispositif où se manifeste une pensée qui ne peut trouver place dans les institutions traditionnelles, trop lourdes, trop lentes, trop timides. La Biennale de Paris n’a pas de contour. Elle est incontournable.
Copyleft AttitudeVoir la présentation.
Copyleft Attitude a pour objectif de faire connaitre et promouvoir la notion de copyleft dans le domaine de l'art et au delà. Prendre modèle sur les pratiques liées aux logiciels libres pour s'en inspirer et les appliquer pour la création hors logiciels. C'est la raison pour laquelle nous avons mis au point la Licence Art Libre.
Là-dessus, j'invite toute personne sensible à l'Art à venir s'y frotter ^_^.
P.-S. : je vous conseille aussi une parution récente d'Antoine sur le Net Art. Cette vision gagne véritablement à être découverte et partagée.
![]()
Billet original de Mben.
Votez pour cet article sur le Planet Libre.
Hier, en m'interrogeant sur la liberté des paquets installés sur mon système, je suis tombé sur un petit programme fort intéressant: VRMS.
VRMS ou Virtual Richard M. Stallman, est un petit programme Perl qui va regarder les paquets installés sur votre système et lister ceux qui ne sont pas entièrement libres. Pour certains de ces paquets (malheureusement pas tous), il va également afficher la raison de cette "non-liberté".
InstallationPour l'installer, sous ubuntu comme sous debian, un simple aptitude fonctionnera puisque le paquet se trouve dans les dépôts.
sudo aptitude install vrms
Utilisationpour l'utiliser, rien de plus simple, il suffit de lancer dans un terminal un
emerzh@robert$ vrms
cette commande devrait vous donner une liste de vos paquets non libres installés dans votre système. Il se peut que certains paquets listés ne soient plus installés sur votre système mais n'ayant pas été purgés, ils sont toujours listé par VRMS. Un petit "( dei)" apparaît alors à côté du nom du paquet.
Pour récupérer uniquement la liste des paquets et non les éventuelles raison de la "non-liberté", lancez juste la commande avec :
emerzh@robert$ vrms -s
RésultatsPersonnellement, sur le système du boulot, j'ai 17 paquets "non-free" sur 2735 soit environs 0.6% de mon système. Ces paquets sont entre autres java, rar, unrar,tango et les linux-restricted-modules....
Il me reste plus maintenant qu'à tenter de supprimer un maximum de ces paquets pour être le plus libre possible et pouvoir enfin voir la phrase :
No non-free packages installed on robert! rms would be proud
![]()
Billet original de eMerzh.
Votez pour cet article sur le Planet Libre.
J’ai fait une petite enquête sur les lobbies, domaine que je ne connais pas tellement je l’avoue. Mon dernier billet à propos du lobby du libre m’a d’ailleurs valu ce commentaire :
“Un lobby n’est pas nécessairement mauvais, malgré le préjugé négatif que tu semble avoir envers ça.” — Pierre-Luc
Ce n’est pas moi qui donne le ton péjoratif, mais bien le texte de Bruno Guglielminetti.
Sur Wiktionary :
Il y a aussi une section fort intéressante sur wikipédia à propos du lobbyisme au Québec spécifiquement où j’ai trouvé ce registre des lobbyistes. Étrangement, je ne trouve pas Microsoft et une seule action pour Oracle. Rien non plus en cherchant Linux. Par contre, on voit pas mal d’activité avec Novel. Au total, 451 éléments sont inscrits dans le domaine d’intérêt de la Technologies de l’information et 142 si on cherche “logiciel”. Ça c’est uniquement au Québec.
Il existe aussi un registre des lobbyistes canadien. Rien pour Novel, mais une dizaine de lobbyistes inscrits pour Microsoft et Oracle chacun. Aux États-Unis, je découvre le Open Source And Industry Alliance, un lobby qui prône trois principes d’achat de logiciel.
Enfin, un article qui date de novembre 2006 sur ZDNet.fr intitulé Les défenseurs des logiciels libres proie des SSII, ou lobby en quête de financement? qui fait réfléchir avec son titre provocateur mais c’est la première fois que je lisais à propos de cette histoire avec l’April, qui comptait 440 membres à l’époque.
![]()
Billet original de Robin Millette.
Votez pour cet article sur le Planet Libre.
Hier, en m'interrogeant sur la liberté des paquets installés sur mon système, je suis tombé sur un petit programme fort intéressant: VRMS.
VRMS ou Virtual Richard M. Stallman, est un petit programme Perl qui va regarder les paquets installés sur votre système et lister ceux qui ne sont pas entièrement libres. Pour certains de ces paquets (malheureusement pas tous), il va également afficher la raison de cette "non-liberté".
InstallationPour l'installer, sous ubuntu comme sous debian, un simple aptitude fonctionnera puisque le paquet se trouve dans les dépôts.
sudo aptitude install vrms
Utilisationpour l'utiliser, rien de plus simple, il suffit de lancer dans un terminal un
emerzh@robert$ vrms
cette commande devrait vous donner une liste de vos paquets non libres installés dans votre système. Il se peut que certains paquets listés ne soient plus installés sur votre système mais n'ayant pas été purgés, ils sont toujours listé par VRMS. Un petit "( dei)" apparaît alors à côté du nom du paquet.
Pour récupérer uniquement la liste des paquets et non les éventuelles raison de la "non-liberté", lancez juste la commande avec :
emerzh@robert$ vrms -s
RésultatsPersonnellement, sur le système du boulot, j'ai 17 paquets "non-free" sur 2735 soit environs 0.6% de mon système. Ces paquets sont entre autres java, rar, unrar,tango et les linux-restricted-modules....
Il me reste plus maintenant qu'à tenter de supprimer un maximum de ces paquets pour être le plus libre possible et pouvoir enfin voir la phrase :
No non-free packages installed on robert! rms would be proud
L'autre jour dans une discussion, un ami me racontait l'histoire d'une de ses collègues qui ne pouvait s'empêcher de tenir la souris à l'envers... fil vers là bas donc.
Forcément, elle clique avec le petit doigt et trouve la situation relativement inconfortable...
Mon ami lui a alors installé sous windows un driver qui permettait d'inverser les axes de la souris afin de pouvoir tenir l'appareil correctement mais, surtout de pouvoir cliquer avec l'index et le majeur....
C'est alors que je me suis demandé comment faire si cette personne était sous Gnu/Linux...Simple curiosité 
Il vous "suffira" d'ajouter deux lignes dans votre xorg.conf
gksudo gedit /etc/X11/xorg.conf
et dans la section Section "InputDevice" de votre souris, ajoutez :
Option "InvX" "true"
et
Option "InvY" "true"
Puis, redémarrez votre Xorg..... par exemple
gksudo /etc/init.d/gdm restart
On ne sait jamais que quelqu'un d'autre soit dans le cas :D
![]()
Billet original de eMerzh.
Votez pour cet article sur le Planet Libre.
Bruno Guglielminetti a publié un article sur l’affaire de FACIL vs le Gouvernement québécois : Le lobby du logiciel libre poursuit Québec
J’ai laissé un commentaire mais il ne sera probablement pas approuvé avant demain alors je le reproduis ici.
Je trouve un peu fantaisiste de parler d’un lobby quand il s’agit d’une association dont je suis membre depuis les premiers jours (2003?) et qui compte quelques entreprises dans ses membres mais surtout des utilisateurs comme vous et moi. On parle ici d’une association d’une 50aine de membre qui a le cran d’agir quand notre gouvernement nous laisse tomber.
Un lobby, c’est constitué d’entreprises qui peuvent éponger des amendes de 800 millions d’Euro sans plier l’échine.
FACIL accepte les dons et les nouveaux membres. SVP rejoingez nous dans cette bataille de longue haleine.
![]()
Billet original de Robin Millette.
Votez pour cet article sur le Planet Libre.
Cocktail scandinave est un magasin de meuble, spécialisé dans le meuble en pin (de Scandinavie bien sûr).
Alors pourquoi vous parler d'ameublement sur un blog informatique ?
Et bien j'ai reçu le catalogue de ce magasin, et à ma grande surprise, sur toutes les pages du magazine, dés qu'il y avait un meuble où pouvait se placer un livre, il y avait le fameux livre "linux in a nuttshell" La bible linux, (on m'a offert ce livre pour mon anniversaire il y a 7 ans, je le lis encore régulièrement).
Sur les bibliothèques, meubles informatique, étagère.... linux partout je vous dis...
Bref un petit extrait photo du catalogue :
![]()
Billet original de StephZ.
Votez pour cet article sur le Planet Libre.
Terminator est film bien connu, mais c'est également une console, multi-fenêtre dont je ne peut plus me passer :
Comme vous pouvez le voir, on peut facilement (avec le clic droit) diviser le terminal en plusieurs sections. Konsole sous KDE ou gnome-terminal sous gnome permettent d'avoir des onglets mais on a pas tout sous les yeux, avec ce Terminator on peut facilement naviguer dans les répertoires, avoir une commande top lancé....
![]()
Billet original de StephZ.
Votez pour cet article sur le Planet Libre.
Il vous est probablement déjà arrivé, sous GNU/Linux, d'avoir besoin de lancer un de vos programmes ayant une interface graphique, comme Firefox, ou un programme louche que vous venez de télécharger, avec un autre utilisateur, sous votre session X actuelle, sans pour autant en ouvrir une autre.
Il y a plusieurs façons de faire cela. Par exemple se connecter avec ssh en localhost, avec l'option -X ou -Y, ou utiliser xhost. Le souci, c'est que le premier est un peu lent (par exemple, pour lancer un jeu vidéo). Quand au deuxième, il n'est pas terrible du côté de la sécurité (ah les souvenirs... Polluer les displays des autres
).
Une des solutions les plus intéressantes est d'exporter votre clé avec xauth, pour l'importer ensuite dans l'utilisateur qui vous intéresse ! Comme il faut entrer deux ou trois commandes pour faire cela manuellement, j'ai développé le programme sendxauth.py, permettant d'automatiser cela grâce à cette commande simple à mémoriser.
Un petit exemple pour clarifier les chosesSi mon explication n'a pas été claire, laisser moi vous donner un petit exemple.
Supposons que vous avez un programme louche sous la main, que vous devez tester à tout prix. Comme il risque de faire ce qu'il veut dans le répertoire de votre utilisateur principal, par exemple vous voler vos informations confidentielles (les fichiers de configuration de votre navigateur web, qui contiennent peut-être vos mots de passes, ou vos courriels personnels ou confidentiels archivés), il peut-être intéressant de lancer ce programme avec un utilisateur limité. Donc, au lieu de le lancer avec votre utilisateur principal, vous allez utiliser l'utilisateur hyper limité « cobaye », qui n'a le droit de rien faire dans votre système, à part toucher à ses fichiers.
Le souci c'est que, si vous vous loguez dans votre utilisateur hyper limité :
su -l cobayeEt que vous lancez un programme graphique comme xterm (toujours en tant que « cobaye ») :
xtermVous aurez l'erreur :
xterm Xt error: Can't open display:C'est un peu normal car l'utilisateur n'a le droit de rien faire dans votre display (sécurité).
Pour lui donner ce droit, vous devez utiliser sendxauth.py (le script de ce tutoriel, voir plus bas) qui va s'occuper de tout faire à note place :
sendxauth.py cobayeUne fois que vous vous reloguerez sur « cobaye » :
su -l cobayeEt que vous aurez déclaré les deux variables recommandées par sendxauth.py :
export DISPLAY=":0.0"xterm se lancera sans aucun souci, en tant que « cobaye » !
Télécharger le scriptVous pouvez télécharger le script sendxauth.py ou le copier coller depuis :
#!/usr/bin/env pythonimport sys
import os
import re
import pwd
from getopt import gnu_getopt, GetoptError
VERSION = '0.1'
SOURCE_USER = ''
DESTINATION_USER = ''
DISPLAY = ':0.0'
VERBOSE = False
DEV_NULL = ' >/dev/null 2>&1'
def vprint(string):
"""Print 'string' if --verbose is defined.
"""
if VERBOSE != False:
print string
def check_environment():
"""Check if all required environment variables are available.
"""
display = os.getenv('DISPLAY')
if display == None:
print 'DISPLAY environment variable is not declared.'
sys.exit(1)
else:
globals()["DISPLAY"] = display
def user_exists(user):
"""Return True if the user exists.
"""
try:
pwd.getpwnam(user)
except KeyError:
return False
else:
return True
def handle_arguments():
"""Handle options in the arguments (argv).
"""
try:
args = sys.argv[1:]
optlist = gnu_getopt(args, 'vh', ['help', 'verbose'])
except GetoptError:
print 'Error when parsing arguments.'
print "--help for more informations."
sys.exit(1)
if len(sys.argv) < 2:
print 'What\'s the destination user ?'
print "--help for more informations."
sys.exit(1)
for user in optlist[1]:
if not user_exists(user):
print "The user '%s' doesn't exists." % user
sys.exit(1)
else:
globals()["DESTINATION_USER"] = user
break
for option, value in optlist[0]:
if option in ['-v', '--verbose']:
globals()['VERBOSE'] = True
globals()['DEV_NULL'] = ''
elif option in ['-h', '--help']:
print __doc__[0:-2]
print
print 'Usage: %s [OPTIONS] destination_user ' \
% os.path.basename(sys.argv[0])
print
print "OPTIONS :"
print " -h, --help Show this help"
print " -v, --verbose Verbose mode"
print
sys.exit(0)
def commands_required(*cmd_list):
"""This function tests if all programs in
the arguments are available in the environment
variable 'PATH'.
"""
path = os.getenv('PATH')
if path != None:
path_list = path.split(os.pathsep)
else:
print "The environment variable PATH is not defined."
sys.exit(1)
for command in cmd_list:
error = True
for path in path_list:
command_path = os.path.join(path, command)
if os.access(command_path, os.X_OK):
error = False
break
if error:
print 'The command \'%s\' is not found.' % command
sys.exit(1)
def su_command_generator(command, user=''):
"""Convert a command to : su -c 'command' user and return that.
"""
command = re.sub(r"(['\\])", r"\\\1", command)
command = 'su -c \'' + command + '\''
if user != '':
command += ' ' + user
return command
def send_xauth(destination_user, source_user=''):
"""Send the authentication to the destination user
If source_user is '', the source user is the actual user (automatically
detected).
"""
if source_user != '':
sys.stdout.write(source_user + '\'s ')
print 'xauth key will be sent to', destination_user + '...'
print
auth_tmpfile = '/tmp/sendxauth' + str(os.getpid())
try:
# extract
command = 'xauth extract ' + auth_tmpfile + ' ' + DISPLAY
if source_user != '':
sys.stdout.write('You must enter ' + source_user + ' password : ')
command = su_command_generator(command)
vprint(command)
result = os.system(command + DEV_NULL)
if source_user != '':
print
if result != 0:
print 'Errors when extracting xauth key.'
sys.exit(1)
# chmod auth key
os.chmod(auth_tmpfile, 0777)
# merge
sys.stderr.write('You must enter ' + destination_user + ' password : ')
destination_home = pwd.getpwnam(destination_user)[5]
authfile = os.path.join(destination_home, '.Xauthority')
# masquer les ' et \ dans authfile
command = su_command_generator('xauth merge ' + auth_tmpfile,
destination_user)
command = 'XAUTHORITY=\'' + authfile + '\' ' + command
vprint(command)
result = os.system(command + DEV_NULL)
if DEV_NULL != '':
print
if result != 0:
print 'Error when merging xauth key by ' + destination_user + '.'
sys.exit(1)
else:
print "xauthority is sent to %s !" % destination_user
print
print "You maybe must declare these shell variables before " + \
"running a graphical program :"
print "export DISPLAY=\"%s\"" % DISPLAY
print "export XAUTHORITY=\"%s/.Xauthority\"" % \
pwd.getpwnam(destination_user)[5]
finally:
try:
os.remove(auth_tmpfile)
except OSError:
print 'Warning: Cannot remove ' + auth_tmpfile + '...'
else:
vprint('Notice: ' + auth_tmpfile + ' deleted ;)')
if __name__ == '__main__':
try:
commands_required('xauth', 'su')
check_environment()
handle_arguments()
send_xauth(DESTINATION_USER, SOURCE_USER)
except KeyboardInterrupt:
print "Interrupted."
# vim:ai:et:sw=4:ts=4:sts=4:tw=78:fenc=utf-8
![]()
Billet original de Asher256.
Votez pour cet article sur le Planet Libre.
Oui c’est un gros billet avec pleins de phrases compliquées. Pour ceux qui veulent lire en travers sautez à la partie Principe de fonctionnement directement
Avertissements
Tout le système que je vais décrire par après c’est de la bidouille. Si vous voulez faire fonctionner ça sur votre machine il vous faudra forcément trifouiller dans le code (surtout si vous voulez un truc qui soit sécurisé vu que les exécutables ont tous le même ‘mot de passe’). De plus ce système n’est peut-être pas inviolable (on ne peut pas penser à tout ;)), mais en tout cas (à mon avis) c’est quand même sûr.
Faire les manipulations décrites dans ce billet peut donc ouvrir des failles de sécurité, causer divers problèmes sur votre pc, donc suivez les instructions / jouez avec les programmes que si vous savez ce que vous faites ! Vous êtes prévenus. Na.
Tout le système ainsi que le billet n’est pas vraiment user-firendly. Je sais mais c’est un peu dur de faire simple ;).
Le système marche sous linux, n’importe quelle distribution. Les paquets requis sont au moins disponibles sous ubuntu, au pire vous pouvez installer les dépendances à la main, sans utiliser votre gestionnaire de paquets.
S’authentifier sur son pc
Il existe pleins de manières différentes de s’authentifier sur son pc, notamment la plus basique, le mot de passe. Mais ce n’est pas très rigolo ! J’ai donc cherché un moyen plus sympa de m’authentifier sur mon pc.
Déjà, il y a la solution que l’on trouve sur bon nombre de portable, le lecteur d’empreintes digitales. Mais j’en ai pas sur le mien (de lecteur).
On peut aussi s’authentifier avec une clé usb (pam_usb). Mais bon je ne trouve pas ça super sécurisé, sachant qu’il suffit de pas beaucoup de temps pour juste lire les données de la clé et savoir quelles sont les informations à fournir pour faire une ‘fausse clé’. Surtout que c’est fait pour aller se brancher partout ces bébêtes et on n’est pas toujours sûr du pc sur lequel on va se brancher…
Il y a aussi l’authentification par bluetooth (pam_blue). Alors, non seulement ce système utilise inutilement de la batterie (faut bien laisser le bluetooth allumé sur le périphérique qui sert à s’authentifier), mais ensuite c’est aussi sécurisé que d’avoir son mot de passe avec un postit à côté de l’écran (et écrit en gros caractères). Tout ce qui est radio c’est le mal, c’est interceptable aussi facilement que bonjour !
Il y a toutes les techniques d’identification avec la voix et la reconnaissance du visage. Le problème c’est que c’est très dépendant de l’environnement (des gens qui hurlent autour de vous / un fond pas normal et hop ça ne marche plus) et je n’ai pas envie de sourire à ma webcam pendant 15 minutes ou hurler une phrase aléatoire à mon pc pendant le même laps de temps.
Il y a aussi la technique de l’interrupteur à clé dans une boite de biscuit que je vous avais déjà présenté. Malheureusement j’ai plus de port imprimante sur mon pc et c’est aussi sécurisé qu’un mot de passe à une lettre (suffit de cour-circuiter les fils…).
Toutes ces techniques ont un élément commun : on essaie d’authentifier quelque chose d’unique et de personnel dont on remarque généralement vite la perte (un périphérique bluetooth (généralement un téléphone portable), une clé usb, un doigt ou encore son cerveau qui connais le mot de passe). Le truc serait d’arriver à un système permettant d’identifier à coup sûr un objet sans pouvoir le falsifier.
J’ai une webcam sur mon pc. Il existe un moyen de transiter des informations par l’image, les qrcodes. J’ai donc eu l’idée de m’en servir pour faire ‘transiter’ une information unique, permettant à coup sur d’identifier mon téléphone portable :]
Les qrcodes
Déjà un qrcode c’est quoi ? La wikipedia nous dit ceci :
Le code QR ou QR Code (en anglais) est un code-barres en 2 dimensions (code matrice) pouvant stocker jusqu’à 7089 caractères numériques, 4296 caractères alphanumériques (contrairement au code-barre “traditionnel” qui lui ne peut stocker que de 10 à 13 caractères) ou 2953 octets . Il a l’avantage de pouvoir stocker beaucoup d’informations tout en étant petit et rapide à scanner. Ainsi, le sigle « QR » dérive de « Quick Response » car le contenu peut être décodé rapidement.
Le code QR a été crée par l’entreprise japonaise Denso-Wave en 1994. Le code QR est très utilisé au Japon ; c’est actuellement le code à deux dimensions le plus populaire au Japon.
Le standard japonais pour les codes QR, JIS X 0510, a été publié en 1999, et la norme ISO correspondante, ISO/IEC 18004, a été approuvée en juin 2000.
Un article sympa sur Clubic aussi si ça vous intéresse de voir comment les gens s’en servent : Live Japon : du QR Code aux publicités subliminales.
Si vous aussi vous avez envie de les lires avec votre portable je vous conseille ce lecteur (en plus c’est une société suisse alors bon ^^).
Principe de fonctionnement
Le but est de se servir de qrcodes pour faire passer un mot de passe unique, généré par un objet que l’on garde généralement toujours sur soi, un téléphone portable dans notre cas. Le téléphone affiche le qrcode et le pc prend une photo à l’aide de sa webcam. Il décode le qrcode et si celui-ci est valide il déverrouille le pc.
Évidemment, il ne faut pas que les données transitées par le qrcode soient toujours les mêmes, parque sinon il suffirait d’obtenir une fois les données (qui serait une simple chaine de texte) pour s’authentifier sur votre pc…
J’ai donc utilisé une technique consistant à obtenir un code d’authentification qui varie avec le temps. De cette manière, obtenir les données du qrcode à un instant T ne permet pas de se logger à un instant T+1, ce qui augmente le niveau de sécurité.
Le code d’authentification est créé ainsi :
Exemple : Il est minuit 28, le 30 aout 2008 et ma chaine commue est mysupersecrectstring. On crée le code d’authentification comme suit : 200808292228mysupersecrectstring (notez que l’on recule de deux heures pour être à l’heure GMT (deux car c’est l’heure d’été)) et on calcule le md5 de cette chaine qui est bd76299ff48d23743b8c4a7cb85a2c74. C’est notre code d’identification, une sorte de mot de passe qui change toutes les minutes et qu’on n’a pas besoin de retenir.
Il est impossible (normalement) de revenir à la chaine commune depuis le md5, même en sachant l’heure qu’il est !
Du côté du pc, il faut lire le code et regarder qu’il corresponde. Mais il y a un problème : il faudrait que le téléphone portable et le pc soient synchronisés à la seconde près, de plus se trouver aux alentours de 00:00:59 quand on génère le code et à 00:01:12 quand on lit le code pose un problème, car la minute aura changé et donc le code d’authentification aura changé. Pour résoudre ces problèmes, le pc va accepter 5 codes d’authentification : celui pour la minute en cours, ceux des deux minutes précédentes et deux des deux minutes suivantes. Ainsi, même avec une minute de décalage entre le téléphone portable et le pc, on parviendra toujours à s’identifier !
Réalisation pratique
Il y avait trois choses à faire fonctionner : Capturer une image de ma webcam en ligne de commande (figurez vous que c’est compliqué…), être capable de lire un éventuel qrcode dans cette image et savoir générer un qrcode sur mon téléphone portable.
Déjà pour capturer une image c’est très compliqué. Il existe bon nombre de programmes avec une interface graphique qui savent le faire, mais là le but était de faire ça de manière automatique. Après de longues recherches, j’ai fini par trouvé uvccapture qui parvenait enfin à faire ce que je voulais. Je me suis servi de son code source et je l’ai modifié de manière à être capable de prendre une image quand mon téléphone portable est visible, mais pas encore surexposé (uvccapture est normalement capable de demander à la webcam une exposition particulière, mais avec la mienne ça ne marche pas, elle se règle toute seule…), après un temps X (dépendant aussi de l’initialisation de la webcam, etc.). J’ai fait le ménage dans le code pour garder que le nécessaire et on a notre exécutable qui prend une photo et la sauve sous 2snap.jpg (et aussi une image plus sombre sous 1snap.jpg, mais pour l’instant je ne l’utilise pas).
Ensuite, décoder un qrcode dans cette image. Le problème a été de trouver une libraire avec une licence libre et facilement réutilisable. La seule que j’ai fini par trouver est PyQrCodec, qui fait appel à une autre en C qui utilise OpenCV (cf les liens plus bas). Le truc plante de temps en temps au décodage et n’est pas capable de reconnaitre tous les qrcodes, mais ce n’est pas un problème vu que l’on va s’occuper aussi de la génération du dit qrcode il suffira de faire quelque chose de compatible.
J’ai implémenté toute la logique du système (génération des md5, déverrouillage de l’écran de veille) dans le script en python (vu que c’est le plus facilement modifiable).
Enfin il faut générer un qrcode. Ça à l’aire vachement sympa ces images en noir et blanc avec des carrés partout, mais en fait c’est super compliqué à faire (c’est pleins de maths compliqués). Après beaucoup de recherche j’ai fini par tomber sur une source en php capable d’en générer et qui sont lisibles par le décodeur (voir dans les liens plus bas). J’ai donc profité de cette source pour la réadapter en java (meilleure manière faire tourner quelque chose sur un téléphone portable à mon avis), ça prend du temps et j’ai sauté quelques parties mais ça a fini par fonctionner (en tout cas je n’ai pas rencontré de problèmes jusqu’à maintenant…). Le programme est un peut lent (~5 pour se lancer) (hors java) et il faudrait peut-être faire un peu d’optimisation (je n’ai pas tout récrit à la manière java et certaines parties ne sont pas très intelligentes, par exemple bosser avec des strings au lieu de faire tout avec des tableaux d’int (chose que j’ai faite quand j’étais obligé)) mais ça marche.
Et donc on a trois programmes qui font ce qu’ils doivent faire (c’est quand même sympa tous ces langages, du C, du python, du php et du java pour 3 programme pour ce système…) et il faut juste les mettre ensemble !
Et ça marche ?
Oui. (Ba tiens x]) Il faut en moyenne 5s pour que le code soit lu et reconnu si je tiens mon téléphone portable à 15cm de la webcam. Qu’il fasse nuit ou jour cela fonctionne, le système n’est donc pas perturbé par l’environnement !
Il faut encore que je trouve un moyen de le lancer automatiquement avant que l’écran de veille s’active (parce qu’à l’heure actuelle il désactive l’écran de veille) en évitant de changer toutes les entrées dans mes raccourcis :p
Les sources & exécutables
Bon, il y a pleins de langages différents et de licences différentes vu que j’ai récupéré du code de pleins d’endroits différentes, mais c’est normal. J’ai gardé les licences d’où le code provenais, j’ai mit la partie en java que j’ai réécrite en MPL/GPL/LGPL.
Alors oui ce n’est pas du très beau code et ce n’est pas commenté, mais c’est juste pour faire mumuse, si j’ai le temps je ferais quelque chose de clean.
Les exécutables (le mot de passe utilisé est : mysupersecrectstring )
Notez qu’il vous faudra PyQrCodec (voir les liens) d’installé pour le décodeur. Suivez les instructions sur le site dans les liens, toutes les dépendances requises sont dans les dépôts d’ubuntu.
Pour le programme de capture de la webcam aussi, il vous faudra v4l2 d’installé, mais normalement c’est le cas.
Les sources :
À l’heure actuelle (programme et source), cela ne devrait fonctionner que si vous avez un matériel parfaitement compatible (taille de la webcam, même taille d’écran pour le téléphone portable (il faut une ’surface utile’ de 235×235 au moins)), mais rien de vous empêche de jouer avec le code source
Pour lancer le programme mettez captureimage dans le même dossier. Faites un touch data.tmp et lancez python QrAuth.py. PyQrcodec doit être dans le path (si il est installé correctement normalement c’est bon, au pire copiez son dossier dans le dossier avec QrAuth.py (après compilation bien évidemment)). Attention ! Pour arrêter le programme il faut soit arriver à vous authentifier, soit appuyer sur ctrl-c jusqu’à ce qu’il s’arrête (ce qu’il ne fait pas tout le temps..). Ou fermer le terminal. Effectivement faudrait faire quelque chose de plus mieux bien sur ce point mais bon ;). Normalement ça marche. Normalement.
Si vous avez une webcam qui fonctionne autrement vous pouvez modifier le code python pour capturer une image autrement et faire fonctionner le système quand même !
Les choses qu’il faudrait améliorer
L’ensemble n’est évidemment pas parfait et terminé, ça reste de la bidouille. Il faudrait exemple faire un peu de ménage dans le programme qui génère des qrcodes, il y a beaucoup de fichiers de définition qui ne servent probablement à rien. De plus, il serait beaucoup plus pratique d’arriver à prendre et analyser la présence d’un qrcode devant la webcam en permanence, mais pour cela il faudrait résoudre le problème de la luminosité. Notez aussi que le décodeur sur le pc est en deux parties et les informations entre les deux scripts sont échangés à l’aide d’un fichier… Ce n’est pas très intelligent, mais le problème est que la demande de décodage d’un qrcode fait de temps en temps planter le programme python qui s’arrête, d’où la séparation entre les deux programmes. Et l’information est passé à l’aide d’un fichier parque je n’avais pas envie de m’embêter à récupérer la sortie standard du deuxième processus, mais normalement il faudrait faire comme ça.
Un autre point serait aussi de pouvoir utiliser des fichiers de configuration ou des paramètres pour éviter par exemple de devoir recompiler le programme lorsque la webcam change de ‘fichier’ (c’est pas un fichier mais c’est comme tel) /dev, ou lorsque l’on veut changer le mot de passe.
De plus il faudrait arriver à utiliser la librairie qui décode les qrcode non pas en python, mais directement en c, lors de la capture de la webcam, pour éviter d’avoir à utiliser un langage de plus, malheureusement je n’ai pas réussi à compiler la dite libraire directement en C.
Liens
Sinon pour conclure une image qui n’a rien à voir, mais que j’aime vachement bien et que je peux m’empêcher de vous monter : C’est par ici.
Tags:arch, authentification, bidouille, bricollage, linux, pam, programmation, qrcode, Ubuntu, webcam![]()
Billet original de TheGlu.
Votez pour cet article sur le Planet Libre.
Mandriva vient de rendre disponible un miroir de téléchargement des versions plus supportées de ses distributions.
* http://archives.mandriva.com/
![]()
Billet original de Aurélien Ohan.
Votez pour cet article sur le Planet Libre.
Cliquer sur les icônes, c'est bien.
Mais pourquoi ne pas être plus rapide que la souris ?
Par curiosité, appuyez sur les touches ALT et F2 du clavier, vous devriez voir apparaître ceci :
Supposons que vous souhaitiez voir vos photos:
Faîtes ALT et F2 puis tapez digikam (ou le nom de votre gestionnaire de photo) et la touche ENTREE
L'ordinateur obéit à vos ordres, et lance Digikam.
Vous pouvez tester avec n'importe quelle application.(vlc, firefox, kcalc..)
L'intérêt me direz vous?Il est multiple : vous gagnez du temps (on ne se rend pas compte le temps perdu à déplacer un curseur) et deuxièmement, on évite les clics faits par erreur (qui n'a jamais lancé un programme parcequ'il avait cliqué sur l'icône d'à côté?). Bref, vous maîtrisez ce que vous faîtes.
Encore plus rapide : vous voulez consulter midiblogs directement => ALT+F2 et tapez directement midiblogs.com votre navigateur lancera alors directement le site en question.
Autre astuce, vous avez besoin de faire un calcul rapide, lancer votre ALT+F2 et faîtes vos additions, soustractions en tapant par exemple :
1+1 et la touche ENTREE et l'ordinateur vous répond 2...
Parfait !
![]()
Billet original de StephZ.
Votez pour cet article sur le Planet Libre.
Il vous est probablement déjà arrivé, sous GNU/Linux, d'avoir besoin de lancer un de vos programmes ayant une interface graphique, comme Firefox, ou un programme louche que vous venez de télécharger, avec un autre utilisateur, sous votre session X actuelle, sans pour autant en ouvrir une autre.
Il y a plusieurs façons de faire cela. Par exemple se connecter avec ssh en localhost, avec l'option -X ou -Y, ou utiliser xhost. Le souci, c'est que le premier est un peu lent (par exemple, pour lancer un jeu vidéo). Quand au deuxième, il n'est pas terrible du côté de la sécurité (ah les souvenirs... Polluer les displays des autres
).
Une des solutions les plus intéressantes est d'exporter votre clé avec xauth, pour l'importer ensuite dans l'utilisateur qui vous intéresse ! Comme il faut entrer deux ou trois commandes pour faire cela manuellement, j'ai développé le programme sendxauth.py, permettant d'automatiser cela grâce à cette commande simple à mémoriser.
Un petit exemple pour clarifier les chosesSi mon explication n'a pas été claire, laisser moi vous donner un petit exemple.
Supposons que vous avez un programme louche sous la main, que vous devez tester à tout prix. Comme il risque de faire ce qu'il veut dans le répertoire de votre utilisateur principal, par exemple vous voler vos informations confidentielles (les fichiers de configuration de votre navigateur web, qui contiennent peut-être vos mots de passes, ou vos courriels personnels ou confidentiels archivés), il peut-être intéressant de lancer ce programme avec un utilisateur limité. Donc, au lieu de le lancer avec votre utilisateur principal, vous allez utiliser l'utilisateur hyper limité « cobaye », qui n'a le droit de rien faire dans votre système, à part toucher à ses fichiers.
Le souci c'est que, si vous vous loguez dans votre utilisateur hyper limité :
su -l cobayeEt que vous lancez un programme graphique comme xterm (toujours en tant que « cobaye ») :
xtermVous aurez l'erreur :
xterm Xt error: Can't open display:C'est un peu normal car l'utilisateur n'a le droit de rien faire dans votre display (sécurité).
Pour lui donner ce droit, vous devez utiliser sendxauth.py (le script de ce tutoriel, voir plus bas) qui va s'occuper de tout faire à note place :
sendxauth.py cobayeUne fois que vous vous reloguerez sur « cobaye » :
su -l cobayeEt que vous aurez déclaré les deux variables recommandées par sendxauth.py :
export DISPLAY=":0.0"xterm se lancera sans aucun souci, en tant que « cobaye » !
Télécharger le scriptVous pouvez télécharger le script sendxauth.py ou le copier coller depuis :
#!/usr/bin/env pythonimport sys
import os
import re
import pwd
from getopt import gnu_getopt, GetoptError
VERSION = '0.1'
SOURCE_USER = ''
DESTINATION_USER = ''
DISPLAY = ':0.0'
VERBOSE = False
DEV_NULL = ' >/dev/null 2>&1'
def vprint(string):
"""Print 'string' if --verbose is defined.
"""
if VERBOSE != False:
print string
def check_environment():
"""Check if all required environment variables are available.
"""
display = os.getenv('DISPLAY')
if display == None:
print 'DISPLAY environment variable is not declared.'
sys.exit(1)
else:
globals()["DISPLAY"] = display
def user_exists(user):
"""Return True if the user exists.
"""
try:
pwd.getpwnam(user)
except KeyError:
return False
else:
return True
def handle_arguments():
"""Handle options in the arguments (argv).
"""
try:
args = sys.argv[1:]
optlist = gnu_getopt(args, 'vh', ['help', 'verbose'])
except GetoptError:
print 'Error when parsing arguments.'
print "--help for more informations."
sys.exit(1)
if len(sys.argv) < 2:
print 'What\'s the destination user ?'
print "--help for more informations."
sys.exit(1)
for user in optlist[1]:
if not user_exists(user):
print "The user '%s' doesn't exists." % user
sys.exit(1)
else:
globals()["DESTINATION_USER"] = user
break
for option, value in optlist[0]:
if option in ['-v', '--verbose']:
globals()['VERBOSE'] = True
globals()['DEV_NULL'] = ''
elif option in ['-h', '--help']:
print __doc__[0:-2]
print
print 'Usage: %s [OPTIONS] destination_user ' \
% os.path.basename(sys.argv[0])
print
print "OPTIONS :"
print " -h, --help Show this help"
print " -v, --verbose Verbose mode"
print
sys.exit(0)
def commands_required(*cmd_list):
"""This function tests if all programs in
the arguments are available in the environment
variable 'PATH'.
"""
path = os.getenv('PATH')
if path != None:
path_list = path.split(os.pathsep)
else:
print "The environment variable PATH is not defined."
sys.exit(1)
for command in cmd_list:
error = True
for path in path_list:
command_path = os.path.join(path, command)
if os.access(command_path, os.X_OK):
error = False
break
if error:
print 'The command \'%s\' is not found.' % command
sys.exit(1)
def su_command_generator(command, user=''):
"""Convert a command to : su -c 'command' user and return that.
"""
command = re.sub(r"(['\\])", r"\\\1", command)
command = 'su -c \'' + command + '\''
if user != '':
command += ' ' + user
return command
def send_xauth(destination_user, source_user=''):
"""Send the authentication to the destination user
If source_user is '', the source user is the actual user (automatically
detected).
"""
if source_user != '':
sys.stdout.write(source_user + '\'s ')
print 'xauth key will be sent to', destination_user + '...'
print
auth_tmpfile = '/tmp/sendxauth' + str(os.getpid())
try:
# extract
command = 'xauth extract ' + auth_tmpfile + ' ' + DISPLAY
if source_user != '':
sys.stdout.write('You must enter ' + source_user + ' password : ')
command = su_command_generator(command)
vprint(command)
result = os.system(command + DEV_NULL)
if source_user != '':
print
if result != 0:
print 'Errors when extracting xauth key.'
sys.exit(1)
# chmod auth key
os.chmod(auth_tmpfile, 0777)
# merge
sys.stderr.write('You must enter ' + destination_user + ' password : ')
destination_home = pwd.getpwnam(destination_user)[5]
authfile = os.path.join(destination_home, '.Xauthority')
# masquer les ' et \ dans authfile
command = su_command_generator('xauth merge ' + auth_tmpfile,
destination_user)
command = 'XAUTHORITY=\'' + authfile + '\' ' + command
vprint(command)
result = os.system(command + DEV_NULL)
if DEV_NULL != '':
print
if result != 0:
print 'Error when merging xauth key by ' + destination_user + '.'
sys.exit(1)
else:
print "xauthority is sent to %s !" % destination_user
print
print "You maybe must declare these shell variables before " + \
"running a graphical program :"
print "export DISPLAY=\"%s\"" % DISPLAY
print "export XAUTHORITY=\"%s/.Xauthority\"" % \
pwd.getpwnam(destination_user)[5]
finally:
try:
os.remove(auth_tmpfile)
except OSError:
print 'Warning: Cannot remove ' + auth_tmpfile + '...'
else:
vprint('Notice: ' + auth_tmpfile + ' deleted ;)')
if __name__ == '__main__':
try:
commands_required('xauth', 'su')
check_environment()
handle_arguments()
send_xauth(DESTINATION_USER, SOURCE_USER)
except KeyboardInterrupt:
print "Interrupted."
# vim:ai:et:sw=4:ts=4:sts=4:tw=78:fenc=utf-8
Oui c’est un gros billet avec pleins de phrases compliquées. Pour ceux qui veulent lire en travers sautez à la partie Principe de fonctionnement directement
Avertissements
Tout le système que je vais décrire par après c’est de la bidouille. Si vous voulez faire fonctionner ça sur votre machine il vous faudra forcément trifouiller dans le code (surtout si vous voulez un truc qui soit sécurisé vu que les exécutables ont tous le même ‘mot de passe’). De plus ce système n’est peut-être pas inviolable (on ne peut pas penser à tout ;)), mais en tout cas (à mon avis) c’est quand même sûr.
Faire les manipulations décrites dans ce billet peut donc ouvrir des failles de sécurité, causer divers problèmes sur votre pc, donc suivez les instructions / jouez avec les programmes que si vous savez ce que vous faites ! Vous êtes prévenus. Na.
Tout le système ainsi que le billet n’est pas vraiment user-firendly. Je sais mais c’est un peu dur de faire simple ;).
Le système marche sous linux, n’importe quelle distribution. Les paquets requis sont au moins disponibles sous ubuntu, au pire vous pouvez installer les dépendances à la main, sans utiliser votre gestionnaire de paquets.
S’authentifier sur son pc
Il existe pleins de manières différentes de s’authentifier sur son pc, notamment la plus basique, le mot de passe. Mais ce n’est pas très rigolo ! J’ai donc cherché un moyen plus sympa de m’authentifier sur mon pc.
Déjà, il y a la solution que l’on trouve sur bon nombre de portable, le lecteur d’empreintes digitales. Mais j’en ai pas sur le mien (de lecteur).
On peut aussi s’authentifier avec une clé usb (pam_usb). Mais bon je ne trouve pas ça super sécurisé, sachant qu’il suffit de pas beaucoup de temps pour juste lire les données de la clé et savoir quelles sont les informations à fournir pour faire une ‘fausse clé’. Surtout que c’est fait pour aller se brancher partout ces bébêtes et on n’est pas toujours sûr du pc sur lequel on va se brancher…
Il y a aussi l’authentification par bluetooth (pam_blue). Alors, non seulement ce système utilise inutilement de la batterie (faut bien laisser le bluetooth allumé sur le périphérique qui sert à s’authentifier), mais ensuite c’est aussi sécurisé que d’avoir son mot de passe avec un postit à côté de l’écran (et écrit en gros caractères). Tout ce qui est radio c’est le mal, c’est interceptable aussi facilement que bonjour !
Il y a toutes les techniques d’identification avec la voix et la reconnaissance du visage. Le problème c’est que c’est très dépendant de l’environnement (des gens qui hurlent autour de vous / un fond pas normal et hop ça ne marche plus) et je n’ai pas envie de sourire à ma webcam pendant 15 minutes ou hurler une phrase aléatoire à mon pc pendant le même laps de temps.
Il y a aussi la technique de l’interrupteur à clé dans une boite de biscuit que je vous avais déjà présenté. Malheureusement j’ai plus de port imprimante sur mon pc et c’est aussi sécurisé qu’un mot de passe à une lettre (suffit de cour-circuiter les fils…).
Toutes ces techniques ont un élément commun : on essaie d’authentifier quelque chose d’unique et de personnel dont on remarque généralement vite la perte (un périphérique bluetooth (généralement un téléphone portable), une clé usb, un doigt ou encore son cerveau qui connais le mot de passe). Le truc serait d’arriver à un système permettant d’identifier à coup sûr un objet sans pouvoir le falsifier.
J’ai une webcam sur mon pc. Il existe un moyen de transiter des informations par l’image, les qrcodes. J’ai donc eu l’idée de m’en servir pour faire ‘transiter’ une information unique, permettant à coup sur d’identifier mon téléphone portable :]
Les qrcodes
Déjà un qrcode c’est quoi ? La wikipedia nous dit ceci :
Le code QR ou QR Code (en anglais) est un code-barres en 2 dimensions (code matrice) pouvant stocker jusqu’à 7089 caractères numériques, 4296 caractères alphanumériques (contrairement au code-barre “traditionnel” qui lui ne peut stocker que de 10 à 13 caractères) ou 2953 octets . Il a l’avantage de pouvoir stocker beaucoup d’informations tout en étant petit et rapide à scanner. Ainsi, le sigle « QR » dérive de « Quick Response » car le contenu peut être décodé rapidement.
Le code QR a été crée par l’entreprise japonaise Denso-Wave en 1994. Le code QR est très utilisé au Japon ; c’est actuellement le code à deux dimensions le plus populaire au Japon.
Le standard japonais pour les codes QR, JIS X 0510, a été publié en 1999, et la norme ISO correspondante, ISO/IEC 18004, a été approuvée en juin 2000.
Un article sympa sur Clubic aussi si ça vous intéresse de voir comment les gens s’en servent : Live Japon : du QR Code aux publicités subliminales.
Si vous aussi vous avez envie de les lires avec votre portable je vous conseille ce lecteur (en plus c’est une société suisse alors bon ^^).
Principe de fonctionnement
Le but est de se servir de qrcodes pour faire passer un mot de passe unique, généré par un objet que l’on garde généralement toujours sur soi, un téléphone portable dans notre cas. Le téléphone affiche le qrcode et le pc prend une photo à l’aide de sa webcam. Il décode le qrcode et si celui-ci est valide il déverrouille le pc.
Évidemment, il ne faut pas que les données transitées par le qrcode soient toujours les mêmes, parque sinon il suffirait d’obtenir une fois les données (qui serait une simple chaine de texte) pour s’authentifier sur votre pc…
J’ai donc utilisé une technique consistant à obtenir un code d’authentification qui varie avec le temps. De cette manière, obtenir les données du qrcode à un instant T ne permet pas de se logger à un instant T+1, ce qui augmente le niveau de sécurité.
Le code d’authentification est créé ainsi :
Exemple : Il est minuit 28, le 30 aout 2008 et ma chaine commue est mysupersecrectstring. On crée le code d’authentification comme suit : 200808292228mysupersecrectstring (notez que l’on recule de deux heures pour être à l’heure GMT (deux car c’est l’heure d’été)) et on calcule le md5 de cette chaine qui est bd76299ff48d23743b8c4a7cb85a2c74. C’est notre code d’identification, une sorte de mot de passe qui change toutes les minutes et qu’on n’a pas besoin de retenir.
Il est impossible (normalement) de revenir à la chaine commune depuis le md5, même en sachant l’heure qu’il est !
Du côté du pc, il faut lire le code et regarder qu’il corresponde. Mais il y a un problème : il faudrait que le téléphone portable et le pc soient synchronisés à la seconde près, de plus se trouver aux alentours de 00:00:59 quand on génère le code et à 00:01:12 quand on lit le code pose un problème, car la minute aura changé et donc le code d’authentification aura changé. Pour résoudre ces problèmes, le pc va accepter 5 codes d’authentification : celui pour la minute en cours, ceux des deux minutes précédentes et deux des deux minutes suivantes. Ainsi, même avec une minute de décalage entre le téléphone portable et le pc, on parviendra toujours à s’identifier !
Réalisation pratique
Il y avait trois choses à faire fonctionner : Capturer une image de ma webcam en ligne de commande (figurez vous que c’est compliqué…), être capable de lire un éventuel qrcode dans cette image et savoir générer un qrcode sur mon téléphone portable.
Déjà pour capturer une image c’est très compliqué. Il existe bon nombre de programmes avec une interface graphique qui savent le faire, mais là le but était de faire ça de manière automatique. Après de longues recherches, j’ai fini par trouvé uvccapture qui parvenait enfin à faire ce que je voulais. Je me suis servi de son code source et je l’ai modifié de manière à être capable de prendre une image quand mon téléphone portable est visible, mais pas encore surexposé (uvccapture est normalement capable de demander à la webcam une exposition particulière, mais avec la mienne ça ne marche pas, elle se règle toute seule…), après un temps X (dépendant aussi de l’initialisation de la webcam, etc.). J’ai fait le ménage dans le code pour garder que le nécessaire et on a notre exécutable qui prend une photo et la sauve sous 2snap.jpg (et aussi une image plus sombre sous 1snap.jpg, mais pour l’instant je ne l’utilise pas).
Ensuite, décoder un qrcode dans cette image. Le problème a été de trouver une libraire avec une licence libre et facilement réutilisable. La seule que j’ai fini par trouver est PyQrCodec, qui fait appel à une autre en C qui utilise OpenCV (cf les liens plus bas). Le truc plante de temps en temps au décodage et n’est pas capable de reconnaitre tous les qrcodes, mais ce n’est pas un problème vu que l’on va s’occuper aussi de la génération du dit qrcode il suffira de faire quelque chose de compatible.
J’ai implémenté toute la logique du système (génération des md5, déverrouillage de l’écran de veille) dans le script en python (vu que c’est le plus facilement modifiable).
Enfin il faut générer un qrcode. Ça à l’aire vachement sympa ces images en noir et blanc avec des carrés partout, mais en fait c’est super compliqué à faire (c’est pleins de maths compliqués). Après beaucoup de recherche j’ai fini par tomber sur une source en php capable d’en générer et qui sont lisibles par le décodeur (voir dans les liens plus bas). J’ai donc profité de cette source pour la réadapter en java (meilleure manière faire tourner quelque chose sur un téléphone portable à mon avis), ça prend du temps et j’ai sauté quelques parties mais ça a fini par fonctionner (en tout cas je n’ai pas rencontré de problèmes jusqu’à maintenant…). Le programme est un peut lent (~5 pour se lancer) (hors java) et il faudrait peut-être faire un peu d’optimisation (je n’ai pas tout récrit à la manière java et certaines parties ne sont pas très intelligentes, par exemple bosser avec des strings au lieu de faire tout avec des tableaux d’int (chose que j’ai faite quand j’étais obligé)) mais ça marche.
Et donc on a trois programmes qui font ce qu’ils doivent faire (c’est quand même sympa tous ces langages, du C, du python, du php et du java pour 3 programme pour ce système…) et il faut juste les mettre ensemble !
Et ça marche ?
Oui. (Ba tiens x]) Il faut en moyenne 5s pour que le code soit lu et reconnu si je tiens mon téléphone portable à 15cm de la webcam. Qu’il fasse nuit ou jour cela fonctionne, le système n’est donc pas perturbé par l’environnement !
Il faut encore que je trouve un moyen de le lancer automatiquement avant que l’écran de veille s’active (parce qu’à l’heure actuelle il désactive l’écran de veille) en évitant de changer toutes les entrées dans mes raccourcis :p
Les sources & exécutables
Bon, il y a pleins de langages différents et de licences différentes vu que j’ai récupéré du code de pleins d’endroits différentes, mais c’est normal. J’ai gardé les licences d’où le code provenais, j’ai mit la partie en java que j’ai réécrite en MPL/GPL/LGPL.
Alors oui ce n’est pas du très beau code et ce n’est pas commenté, mais c’est juste pour faire mumuse, si j’ai le temps je ferais quelque chose de clean.
Les exécutables (le mot de passe utilisé est : mysupersecrectstring )
Notez qu’il vous faudra PyQrCodec (voir les liens) d’installé pour le décodeur. Suivez les instructions sur le site dans les liens, toutes les dépendances requises sont dans les dépôts d’ubuntu.
Pour le programme de capture de la webcam aussi, il vous faudra v4l2 d’installé, mais normalement c’est le cas.
Les sources :
À l’heure actuelle (programme et source), cela ne devrait fonctionner que si vous avez un matériel parfaitement compatible (taille de la webcam, même taille d’écran pour le téléphone portable (il faut une ’surface utile’ de 235×235 au moins)), mais rien de vous empêche de jouer avec le code source
Pour lancer le programme mettez captureimage dans le même dossier. Faites un touch data.tmp et lancez python QrAuth.py. PyQrcodec doit être dans le path (si il est installé correctement normalement c’est bon, au pire copiez son dossier dans le dossier avec QrAuth.py (après compilation bien évidemment)). Attention ! Pour arrêter le programme il faut soit arriver à vous authentifier, soit appuyer sur ctrl-c jusqu’à ce qu’il s’arrête (ce qu’il ne fait pas tout le temps..). Ou fermer le terminal. Effectivement faudrait faire quelque chose de plus mieux bien sur ce point mais bon ;). Normalement ça marche. Normalement.
Si vous avez une webcam qui fonctionne autrement vous pouvez modifier le code python pour capturer une image autrement et faire fonctionner le système quand même !
Les choses qu’il faudrait améliorer
L’ensemble n’est évidemment pas parfait et terminé, ça reste de la bidouille. Il faudrait exemple faire un peu de ménage dans le programme qui génère des qrcodes, il y a beaucoup de fichiers de définition qui ne servent probablement à rien. De plus, il serait beaucoup plus pratique d’arriver à prendre et analyser la présence d’un qrcode devant la webcam en permanence, mais pour cela il faudrait résoudre le problème de la luminosité. Notez aussi que le décodeur sur le pc est en deux parties et les informations entre les deux scripts sont échangés à l’aide d’un fichier… Ce n’est pas très intelligent, mais le problème est que la demande de décodage d’un qrcode fait de temps en temps planter le programme python qui s’arrête, d’où la séparation entre les deux programmes. Et l’information est passé à l’aide d’un fichier parque je n’avais pas envie de m’embêter à récupérer la sortie standard du deuxième processus, mais normalement il faudrait faire comme ça.
Un autre point serait aussi de pouvoir utiliser des fichiers de configuration ou des paramètres pour éviter par exemple de devoir recompiler le programme lorsque la webcam change de ‘fichier’ (c’est pas un fichier mais c’est comme tel) /dev, ou lorsque l’on veut changer le mot de passe.
De plus il faudrait arriver à utiliser la librairie qui décode les qrcode non pas en python, mais directement en c, lors de la capture de la webcam, pour éviter d’avoir à utiliser un langage de plus, malheureusement je n’ai pas réussi à compiler la dite libraire directement en C.
Liens
Sinon pour conclure une image qui n’a rien à voir, mais que j’aime vachement bien et que je peux m’empêcher de vous monter : C’est par ici.
Tags:arch, authentification, bidouille, bricollage, linux, pam, programmation, qrcode, Ubuntu, webcamEn vrac, quelques news autour de Ubuntu qui valent le coup d'être lues :
![]()
Billet original de Taltan.
Votez pour cet article sur le Planet Libre.
J’avais essayé sans succès avec Ubuntu 7.10 d’installer ma tablette graphique Genius MousePen 8X6 (WP 8060U).

Là, avec Ubuntu 8.04.1, je me suis que j’aurais plus de chance que cela fonctionne ou que de nouveaux pilotes seraient sortis et ce fut le cas.
Donc je me suis basée principalement sur ce tutoriel :
https://help.ubuntu.com/community/TabletSetupWizardpen
1) J’ai installé les paquets suivants :
sudo apt-get install xutils libx11-dev libxext-dev x-dev build-essential xautomation xinput xserver-xorg-dev
2) J’ai ensuite lu sur le forum ubuntu-fr (Jywa #26) qu’il existait une nouvelle version du pilote winzardpen la version 0.6.0.2 (pour Hardy) qui se télécharge ici : http://specificcrap.arbitrarycrap.com/wizardpen-0.6.0.2.tar.gz
J’ai donc décompressé puis compiler winzardpen (c’est au moment de faire compile que je me suis rendue compte de la nécessité du paquet xserver-xorg-dev que j’avais omis d’installer dans un premier temps
bref )
J’en ai profité aussi pour suivre le conseil de christophe_d #30 et taper cette commande :
cp /usr/local/lib/xorg/modules/input/wizardpen_drv.* /usr/lib/xorg/modules/input/
3) Je reprends mon tuto de référence, connecte le câble usb de la tablette et tape les commandes indiquées dans la section “Setting up udev (If the tablet is USB)”
Pour trouver le nom de ma tablette :
cat /sys/bus/usb/devices/*/product
Ce qui me donne WP8060U.
4) On ajoute dans les périphériques usb la tablette, ce qui donne pour ma tablette :
sudo bash
puis
echo 'BUS=="usb", KERNEL=="event*", SYSFS{product}=="Tablet WP8060U", NAME="input/%k", SYMLINK+="tablet-event", MODE="0666"' >> /etc/udev/rules.d/010_local.rules
enfin
exit
5) On redémarre udev :
sudo /etc/init.d/udev restart
et on vérifie que notre tablette est bien prise en compte par
ls -la /dev/tablet-event
Dans mon cas une ligne s’affiche donc ça a fonctionné :

6) Dans la partie Calibration du tuto de référence je n’ai pas réussi dans le dossier calibrate de mon pilote wizardpen à faire make (un problème avec BUILD ?)
Bon j’ai passé outre et ai directement tapé la commande suivante :
sudo ./wizardpen-calibrate /dev/tablet-event
qui demande avec le stylet de pointer un angle de la tablette puis l’angle opposé pour déterminer les coordonnées de la zone de travail !
Copier les derniers lignes en retrait à la fin de cette étape elles vont seront utiles juste après. A défaut vous pouvez utiliser celles proposées par le tuto de référence si votre modèle de tablette y est.
Moi j’ai donc :
Section “InputDevice”
Identifier “WizardPen Tablet”
Option “SendCoreEvents” “true”
Driver “wizardpen”
Option “Device” “/dev/tablet-event”
Option “TopX” “0″
Option “TopY” “19″
Option “BottomX” “32449″
Option “BottomY” “31848″
Option “MaxX” “32449″
Option “MaxY” “31848″
EndSection
7) Ensuite on fait une sauvegarde du fichier xorg avec
sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.backup
Puis on édite le fichier /etc/X11/xorg.conf
Je l’ai fait avec gedit donc j’ai tapé :
sudo gedit /etc/X11/xorg.conf
Là, juste en -dessous de votre souris générique, collez les lignes que vous avez copiées dans l’étape 6 de mon tuto.
A la fin de votre fichier xorg dans la section serverLayout, à la fin, ajoutez également cette ligne :
InputDevice "WizardPen Tablet" "AlwaysCore"
Cliquez sur Enregistrer puis fermer l’éditeur de texte gedit.
8 ) Comme le pilote wizardpen ne supporte pas le branchement à chaud, on va ajouter un script qui permettra de détecter au démarrage si la tablette est branchée ou non.
Donc on ouvre /etc/rc.local:
sudo gedit /etc/rc.local
On ajoute juste avant “exit0″ les lignes suivantes :
XORG_CONF=/etc/X11/xorg.conf
if [ -e /dev/tablet-event ]; then
sed -ie 's/^\(\s*\)\#\(\s*InputDevice\s\s*\"WizardPen\ Tablet\"\s\s*\"AlwaysCore\"\)\s*$/\1\2/' "$XORG_CONF"
echo "Udev created /dev/tablet-event = Tablet present! - Tablet-driver enabled"
else
sed -ie 's/\(^\s*InputDevice\s\s*\"WizardPen\ Tablet\"\s\s*\"AlwaysCore\"\)\s*$/\#&/' "$XORG_CONF"
echo "Udev did NOT create /dev/tablet-event = tablet NOT present! - Tablet-driver disabled"
fi
On enregistre et on ferme.
En tapant cette commande :
sudo /etc/init.d/rc.local start
on voit si le branchement ou non de la tablette est bien détecté.
Enfin il faut redémarrer le serveur X donc j’ai appuyé simultanément sur les touches Ctrl + Alt + Backspace et impec ! Ouf je n’ai rien cassé !
———————
Bon à ce moment là seule la souris de la tablette fonctionnait mais pas le stylet, enfin très peu à peine de quoi faire un point ! (N’oubliez pas de changer les piles dans le stylet et la souris aussi en cas de souci
)
Je suis donc allée à la section “Everything seems to work, except pressure sensitivity” de mon tuto de référence.
# Le lien vers TheGimp n’est plus valide. Il faut aller dans le menu Fichier->Préferences->Périphériques d’entrée. Cliquez sur Configurer les périphériques d’entrée étendus et dans Périphériques choisissez WizardPen Tablet et dans Mode Ecran est la meilleure solution il paraît.

# Le lien pour Inkscape est valide.
Allez dans le menu Fichier->Périphériques de saisie et même choix que pour TheGimp ! Si vous voulez régler la pression comme dans le lien appuyez sur les touches Ctrl et F6 simultanément et vous pourrez choisir les mêmes réglages que ce proposé dans la capture d’écran du lien précédent.
———————
Conclusion : ça fonctionne mais wow je ne suis pas du tout habituée à cette gestion donc pas facile !
Ma première oeuvre (de la copie
) avec TheGimp.

Oui les lignes de commande parfois déborde mais comme je n’ai fait que traduire le tuto de référence dans les grandes j’ai seulement changé d’éditeur (gedit au lieu de vim
) donc allez voir le tuto de réference au besoin !
NB : il existe aussi ce tuto rapide en anglais pour Genius WizardPen avec Ubuntu Hardy mais attention pensez à faire une sauvegarde de votre fichier xorg.conf avant de l’éditer !
![]()
Billet original de Daria.
Votez pour cet article sur le Planet Libre.
En vrac, quelques news autour de Ubuntu qui valent le coup d'être lues :

Si vous vous connectez à votre ADSL Menara de Maroc Telecom, avec un modem routeur wifi Sagem F@st 3304, et qu'il vous arrive d'avoir besoin de redémarrer votre routeur automatiquement, grâce à un cron + script shell, pour une des diverses raisons valables (par exemple, une connexion super lente, mystérieusement constatée après plusieurs heures de connexion suivies), le petit script de cet article risque de vous intéresser.
Pour les curieux, pour faire ce script, j'ai extrait du code HTML de l'interface web du Sagem Fast 3304 l'URL qui est activée quand vous cliquez sur le bouton « redémarrage de votre routeur » dans la section « Maintenance ».
Pour faire marcher le script, vous aurez besoin d'installer curl. Dans une distribution comme Debian ou Ubuntu :
sudo apt-get install curlC'est à peu près similaire dans les autres distributions.
N'oubliez pas de modifier les variables USER, PASSWORD et IP pour le personnaliser !
#!/bin/sh# Variables à modifier pour faire fonctionner votre script
IP="192.168.1.1"
USER="Menara"
PASSWORD="Menara"
# Début du script
if ! which curl >/dev/null 2>&1; then
echo "Vous devez installer curl !" >&2
exit 1
fi
tput setaf 1; echo "Redémarrage du routeur..."; tput sgr0
curl -u $USER:$PASSWORD http://$IP/SubmitMaintREBOOT -d '' >/dev/null 2>&1
if [ "$?" -ne "0" ]; then
echo "Erreur lors de la communication avec le routeur." >&2
exit 1
fi
sleep 3
tput setaf 1; echo "Attente de connexion..."; tput sgr0
i="0"
while true; do
ping -c1 212.217.0.1 >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
break
fi
i="`expr $i + 1`"
if [ "$i" -gt "60" ]; then
echo "Nombre de tentatives de connexion dépassées..." >&2
exit 1
fi
sleep 1
done
# Décommenter les deux lignes suivantes si vous utiliser ddclient
# pour mettre à jour automatiquement votre dyndns.org
#tput setaf 1; echo "Mise à jour ddclient..."; tput sgr0
#ddclient
exit 0
![]()
Billet original de Asher256.
Votez pour cet article sur le Planet Libre.

Si vous vous connectez à votre ADSL Menara de Maroc Telecom, avec un modem routeur wifi Sagem F@st 3304, et qu'il vous arrive d'avoir besoin de redémarrer votre routeur automatiquement, grâce à un cron + script shell, pour une des diverses raisons valables (par exemple, une connexion super lente, mystérieusement constatée après plusieurs heures de connexion suivies), le petit script de cet article risque de vous intéresser.
Pour les curieux, pour faire ce script, j'ai extrait du code HTML de l'interface web du Sagem Fast 3304 l'URL qui est activée quand vous cliquez sur le bouton « redémarrage de votre routeur » dans la section « Maintenance ».
Pour faire marcher le script, vous aurez besoin d'installer curl. Dans une distribution comme Debian ou Ubuntu :
sudo apt-get install curlC'est à peu près similaire dans les autres distributions.
N'oubliez pas de modifier les variables USER, PASSWORD et IP pour le personnaliser !
#!/bin/sh# Variables à modifier pour faire fonctionner votre script
IP="192.168.1.1"
USER="Menara"
PASSWORD="Menara"
# Début du script
if ! which curl >/dev/null 2>&1; then
echo "Vous devez installer curl !" >&2
exit 1
fi
tput setaf 1; echo "Redémarrage du routeur..."; tput sgr0
curl -u $USER:$PASSWORD http://$IP/SubmitMaintREBOOT -d '' >/dev/null 2>&1
if [ "$?" -ne "0" ]; then
echo "Erreur lors de la communication avec le routeur." >&2
exit 1
fi
sleep 3
tput setaf 1; echo "Attente de connexion..."; tput sgr0
i="0"
while true; do
ping -c1 212.217.0.1 >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
break
fi
i="`expr $i + 1`"
if [ "$i" -gt "60" ]; then
echo "Nombre de tentatives de connexion dépassées..." >&2
exit 1
fi
sleep 1
done
# Décommenter les deux lignes suivantes si vous utiliser ddclient
# pour mettre à jour automatiquement votre dyndns.org
#tput setaf 1; echo "Mise à jour ddclient..."; tput sgr0
#ddclient
exit 0