Deblan blog

La toile

Installer un serveur Sync (Firefox) à la maison

Dans ma conquête vers auto-suffisance et pour écarter encore plus mes données persos des USA, j'ai décidé d'installer mon propre serveur de synchronisation pour Firefox.

Pour rappel, Firefox permet de synchroniser vos terminaux par le biais d'une fonction "Sync". Ainsi vous concervez les mêmes marque-pages, historique, modules complémentaires, etc. entre les différents terminaux que vous manipulez.

Par défaut, ce sont sur des serveurs à Mozilla où les données sont enregistrées. Elles sont évidément chiffrées mais stockées on ne sait pas trop où....enfin si, aux USA. Certains diront que tant que c'est chiffré, on s'en fiche vers où elles partent et c'est à moitié vraie. Cependant, le jour où l'ago de chiffrement sera cassé, ces données aujourd'hui indéchiffrables le deviendront et je préfère les savoir chez moi.

Comment installer son propre serveur Sync ? C'est très simple et voici les étapes de configuration.

Voici mes contraintes :

  • Un domaine dédié (sync.deblan.org)
  • Transactions HTTP chiffrées (HTTPS)

Pour rappel, je travail sur Debian et j'ai déjà un serveur web Apache installé.

Étape 1 : installation des paquets nécessaires
$ su - 
# aptitude update
# aptitude install python-dev mercurial sqlite3 python-virtualenv libssl-dev libapache2-mod-wsgi
# aptitude clean
# a2enmod wsgi
# service apache2 restart
Étape 2 : installation de Sync server

Dans ma procédure de création de vhost pour Apache, je génère systématiquement un nouvel utiliseur unix. Dans le cas de Sync, il s'appel "websync". Son répertoire personnel est chez moi : "/services/web/www/sync.deblan.org".

# su - websync
$ mkdir public_html logs databases
$ chmod 700 logs databases
$ hg clone https://hg.mozilla.org/services/server-full
$ cd server-full
$ make build
Étape 3 : configuration de Sync server

Dans le répertoire server-full/" se trouve un fichier "development.ini". Éditez-le et ajoutez ces informations. Ici je vais conserver SQLite pour enregistrer les données.

# De base, Sync server permet à n'importe qui de s'inscrire pour synchroniser ses données.
# Vous pouvez activez un Captcha pour bloquer les bots
# Passez simplement use à true
[captcha]
use = false
public_key = 6Le8OLwSAAAAAK-wkjNPBtHD4Iv50moNFANIalJL
private_key = 6Le8OLwSAAAAAEKoqfc-DmoF4HNswD7RNdGwxRij
use_ssl = true

[storage]
backend = syncstorage.storage.sql.SQLStorage
# À modifier selon vos répertoires
sqluri = sqlite:////services/web/www/sync.deblan.org/databases/storage.db
standard_collections = false
use_quota = true
# Un quota de 25Mo : par défaut à 5Mo
quota_size = 25120
pool_size = 100
pool_recycle = 3600
reset_on_return = true
display_config = true
create_tables = true

[auth]
backend = services.user.sql.SQLUser
# À modifier selon vos répertoires
sqluri = sqlite:////services/web/www/sync.deblan.org/databases/auth.db
create_tables = true
pool_size = 100
pool_recycle = 3600
create_tables = true
# Décommentez la ligne suivante pour ne pas autoriser d'inscription.
# Note : il est nécessaire des les autoriser le temps d'ajouter votre compte
# allow_new_users = false

[nodes]
# Nécessaire pour que ça puisse fonctionner...
fallback_node = https://sync.deblan.org/

[smtp]
host = localhost
port = 25
sender = no-reply@deblan.fr

[cef]
use = true
file = syslog
vendor = mozilla
version = 0
device_version = 1.3
product = weave

[reset_codes]
backend = services.resetcodes.rc_sql.ResetCodeSQL
# À modifier selon vos répertoires
sqluri = sqlite:////services/web/www/sync.deblan.org/databases/reset.db
create_tables = True
Étape 4 : configuration d'Apache

Dans ce Vhost, j'utilise le module WSGI (pour jouer avec Python) mais également Suexec pour ma politique de sécurité. J'ai également des certificats SSL qui ne sont pas ceux par défaut. Il ne faut donc pas faire un "bête" copié/collé car ça ne va pas fonctionner.

# cat /etc/apache2/sites-available/sync.deblan.org.443 
<IfModule mod_ssl.c>
<VirtualHost *:443>
	# À modifier
	ServerName sync.deblan.org
	# À modifier (public_html est un répertoire vide)
	# /var/www/service-web/www/ == /services/web/www/ (contraintes php-fastcgi)
	# @see https://www.deblan.io/post/407/Serveur-web-Debian-Apache2-et-FastCGI
	DocumentRoot /var/www/service-web/www/sync.deblan.org/public_html
	SuexecUserGroup websync webgroup
	ErrorLog /services/web/logs/sync.deblan.org.log
	CustomLog /services/web/logs/sync.deblan.org.log combined
	CustomLog /services/web/logs/sync.deblan.org.log trafic

	WSGIProcessGroup sync
	# Modifier "websync" selon le user créé pour l'occasion
	WSGIDaemonProcess sync user=websync group=websync processes=2 threads=25
	WSGIPassAuthorization On
	# À modifier selon vos répertoires
	WSGIScriptAlias / /services/web/www/sync.deblan.org/server-full/sync.wsgi

	# À modifier selon vos répertoires
	<Directory /var/www/service-web/www/sync.deblan.org>
		Options -Indexes SymLinksIfOwnerMatch MultiViews
		AllowOverride All
		Order allow,deny
		allow from all
		Options +ExecCGI
	</Directory>

	# Ne fonctionnera pas tel quel chez vous
	SSLEngine on
	SSLCertificateFile    /etc/apache2/ssl/deblan/org/deblanorg.crt
	SSLCertificateKeyFile /etc/apache2/ssl/deblan/org/deblanorg.key
	SSLCACertificateFile  /etc/apache2/ssl/deblan/org/GandiStandardSSLCA.pem

	BrowserMatch MSIE [2-6] \
		nokeepalive ssl-unclean-shutdown \
		downgrade-1.0 force-response-1.0
	BrowserMatch MSIE [17-9] ssl-unclean-shutdown
</VirtualHost>
</IfModule>
# a2ensite sync.deblan.org.443
# service apache2 reload

Il ne reste plus qu'à supprimer et recréer un compte Sync en spécifiant que vous utilisez un serveur personnel. Si tout se passe bien, les bases de données SQLite vont être générées. En cas de problème, il "suffira" de regarder ce que les logs racontent coté serveur et de regarder ceux présents chez vous via : about:sync-log.


« Ce soir ou jamais » parle de la NSA

Vendredi dernier (25 octobre), France 2 diffusait l'émission « Ce soir ou jamais ». Le sujet traitait de la NSA et de la grande question de l'espionnage sur Internet. Un débat très intéressant où intervenait, entre autres, Jérémie Zimmermann le fondateur de la Quadrature du Net.

Beaucoup de questions ont été soulevées et des idées très interessantes ont été proposées. Je ne vais pas faire un résumé de l'émission puisqu'il me paraît important de la regarder.

Ce soir ou jamais

Cependant, je regrette deux choses qui auraient du être traitées plus sérieusement. Commençons par la plus importante : le logociel libre. Évoqué succintement et très mal défini, c'est une première vraie réponse à cette grande problèmatique de l'espionnage informatique au sens large. Avoir la capacité de savoir comment un logiciel fonctionne, que ce soit une application lourde ou pas, et savoir comment il fonctionne (le code source) me paraît essentiel.
La notion de décentralisation des services n'est pas clairement évoquée. On sait que la NSA pioche des infos chez Microsoft, Apple, Google et encores bien d'autres boites, pourquoi continuer à utiliser leurs services ? Pour la NSA, c'est du pain bénit : tout est au même endroit, ils sont une véritable mine d'or et personne n'a parlé du fait que si les gens avaient leurs services stockés ailleurs, alors la NSA aurait beaucoup plus de difficultés à les pister. Le constat est bien présent mais cette décentralisation de l'information n'est pas du tout développée.


Uzbl - Importer ses bookmarks Firefox

Si vous avez une masse importante de bookmarks et que vous aimeriez les retrouver dans Uzbl alors je vous propose ce script d'importation. Il se repose sur les bookmarks de la "Barre personnelle" uniquement, et configure les bookmarks avec des tags (cf le précédent article).

Pour que le script fonctionne, vous devez posséder php et vous aurez besoin de faire un export (au format json) à la racine de votre répertoire personnelle.

Il suffira de lancer le script et tout se fera automatiquement :)

#!/usr/bin/php5
<?php

$bookmarks_file = array_pop(glob(getenv('HOME').'/bookmarks-*.json'));

if (empty($bookmarks_file)) {
    echo sprintf("No bookmarks found in \"%s\"/\n", getenv('HOME'));
    exit(0);
}

$datas = json_decode(file_get_contents($bookmarks_file));

function get_firefox_bookmarks_for_uzbl($node, $prefix)
{
    $config = '';

    if (isset($node->children)) {
        foreach ($node->children as $child) {
            $config.= get_firefox_bookmarks_for_uzbl($child, $prefix.'/'.$node->title);
        }
    } else {
        if (isset($node->uri)) {
            $config.= str_replace(
                array(
                    '/Barre personnelle/',
                    '/Barre personnelle'
                ),
                array(
                    '/Barre personnelle',
                    '/'
                ),
                "$node->uri $prefix $node->title\n"
            );
        }
    }

    return $config;
}

file_put_contents(
    getenv('HOME').'/.local/share/uzbl/bookmarks',
    get_firefox_bookmarks_for_uzbl($datas->children[2], '')
);

Uzbl-tabbed, mon nouveau navigateur hors développement, scripts

J'utilise à présent Uzbl-tabbed comme navigateur (hormis quand je fais du développement web). Il fonctionne à merveille, sans compter l'incroyable facilité de personnalisation.

Voici quelques éléments de ma configuration :

Clique molette : ouverture dans un onglet
@bind  <Button2>  = sh 'if [ "$1" ]; then echo "event NEW_TAB $1" > "$UZBL_FIFO"; else echo "uri $(xclip -o | sed s/\\\@/%40/g)" > "$UZBL_FIFO"; fi' '\@SELECTED_URI'
Divers binds
@cbind <Ctrl>n = event REQ_NEW_WINDOW # nouvelle fenêtre
@cbind <Ctrl>r = reload # rechargement
@cbind <Ctrl>R = reload_ign_cache # rechargement sans cache
@cbind <Mod1>b = back # précédent
@cbind <Mod1>n = forward  suivant 
@cbind <Ctrl>w = exit # fermerture d'onglet/fenêtre

@on_event NEW_WINDOW  sh 'uzbl-tabbed "$1"' %r
@cbind  clone = event REQ_NEW_WINDOW \@uri # copie de fenêtre/fenêtre
Gestion de bookmarks avec des tags

Ce script est un hack de celui présent sur le site d'Uzbl.

  • Emplacement : @scripts_dir/bookmark_with_tags_for_folders.sh
  • Bind : @cbind <Ctrl>d = spawn @scripts_dir/bookmark_with_tags_for_folders.sh
#!/bin/bash
# @scripts_dir/bookmark_with_tags_for_folders.sh
#NOTE: it's the job of the script that inserts bookmarks to make sure there are no dupes.

file=${XDG_DATA_HOME:-$HOME/.local/share}/uzbl/bookmarks

[ -r "$file" ] || exit

DMENU_SCHEME="bookmarks"
DMENU_OPTIONS="xmms vertical resize"

. "$UZBL_UTIL_DIR/dmenu.sh"
. "$UZBL_UTIL_DIR/uzbl-dir.sh"

TAG=`cat $file | cut -d" " -f2 | sort -u | $DMENU -nb \#303030 -nf khaki -sb \#CCFFAA -sf \#303030`

goto=`grep $TAG $file | cut -d" " -f1,3- | while read url name; do [ -z "\$name" ] || name="\$name "; echo "\$name: $url"; done | $DMENU $COLORS | cut -d":" -f2-`

[ -n "$goto" ] && echo "uri $goto" > "$UZBL_FIFO"
Le contrôle+L de Firefox
  • Emplacement : @scripts_dir/prompt_url.sh
  • Bind : @cbind <Ctrl>l = spawn @scripts_dir/prompt_url.sh
#!/bin/sh

goto=$(zenity --entry --text "$UZBL_TITLE" --entry-text "$UZBL_URI" --title "$UZBL_TITLE")

if [ $? -eq 0 ]; then
	echo "uri $goto" > "$UZBL_FIFO"	
fi
Le contrôle+K de Firefox
  • Emplacement : @scripts_dir/prompt_search.sh
  • Bind : @cbind <Ctrl>k = spawn @scripts_dir/prompt_search.sh
#!/bin/sh

search=$(zenity --entry --text "Effectuer une recherche" --entry-text "" --title "UZBL : Effectuer une recherche")

if [ $? -eq 0 ]; then
	echo "uri http://www.google.fr/search?q=$(echo "$search" | sed 's/ /%20/g')" > "$UZBL_FIFO"	
fi
Gestion du zoom à la Firefox (contenu + conteneur)
Binds :
@cbind <Ctrl>i         = js (function() { var event = document.createEvent('HTMLEvents'); event.initEvent('uzbl_zoom_in', true, true); document.dispatchEvent(event); } )();
@cbind <Ctrl><Shift>I  = js (function() { var event = document.createEvent('HTMLEvents'); event.initEvent('uzbl_zoom_out', true, true); document.dispatchEvent(event); } )();
@cbind <Ctrl>à         = js (function() { var event = document.createEvent('HTMLEvents'); event.initEvent('uzbl_zoom_init', true, true); document.dispatchEvent(event); } )();

@on_event   LOAD_COMMIT    script @scripts_dir/zoom.js

Dans @scripts_dir/zoom.js :

function get_cookie(name) {
	var dc = document.cookie;
	var prefix = name + '=';
	var begin = dc.indexOf('; ' + prefix);

	if (begin == -1) {
		begin = dc.indexOf(prefix);

		if (begin!= 0) {
			return null;
		}

	} 
	else {
		begin += 2;
	}

	var end = document.cookie.indexOf(';', begin);

	if (end == -1) {
		end = dc.length;
	}

	return unescape(dc.substring(begin + prefix.length, end));
}

var step = function()
{
	return 0.1;
}

var get_body = function()
{
	var body = document.getElementsByTagName('body');

	return body ? body[0] : null;
}

var get_body_zoom = function()
{
	return get_body().getAttribute('data-zoom') ? parseFloat(get_body().getAttribute('data-zoom')) : 1;
}

var set_body_zoom = function(zoom)
{
	get_body().setAttribute('data-zoom', zoom);
	get_body().style.zoom = zoom;
	document.cookie='uzbl_zoom='+zoom+';path=/;expires=Tue, 2 Jun 2020 00:00:00 UTC;'	
}

var zoom_in = function()
{
	set_body_zoom(get_body_zoom() + step());
}

var zoom_out = function()
{
	set_body_zoom(get_body_zoom() - step());
}

var zoom_init = function()
{
	set_body_zoom(1);
}

var zoom_retrieve = function()
{
	var zoom = get_cookie('uzbl_zoom');

	if (zoom) {
		set_body_zoom(zoom);
	}
}

document.addEventListener('uzbl_zoom_in', zoom_in, true);
document.addEventListener('uzbl_zoom_out', zoom_out, true);
document.addEventListener('uzbl_zoom_init', zoom_init, true);
document.addEventListener('DOMContentLoaded', zoom_retrieve, true);

J'espère que ça vous sera utile :)


Informations streaming, conférence Web3D++ avec Meza Lab !

Suite pour mon article sur le Web3D++, voici les services pour nous suivre en direct.

Si les places "physiques" en amphithéâtre sont complètes, il est possible d'y assister sous deux formes :

En Streaming vidéo

Le flux sera dispo sur http://www.youtube.com/watch?v=M1MHmvHoDRs&feature=plcp (problème ustream).

Via votre navigateur internet favori pour la partie application : http://www.ustream.tv/channel/deblan

En cas de panne de ustream ou pour voir l'amphi complet, vous devrez utiliser un lecteur type VLC et ouvrir le flux suivant : http://src-media.com:8000/src-web3d.ogg

En Web3D / Environnement Virtuel 3D

Remarque importante : Les réseaux d'entreprises ont souvent des blocages mis en oeuvre par les administrateurs. Ils empêchent l'usage d'outils considérés comme exotiques. Pour cela voyez avec les responsables, OU suivez nous en Vidéo.

Il vous faut télécharger et installer le Viewer/Navigateur Web3D :

Attention il se peut que l'installation vous demande d'avoir les pilotes de votre carte graphique a jour.


Il faut également vous inscrire sur l'une des plateformes utilisées : SecondLife.

Une fois votre inscription réalisée vous recevrez un email qui vous demandera de valider votre compte. Pensez à bien regarder dans votre compte mail, ainsi que par exemple dans le dossier "indésirable, Spam" ou d'un autre nom selon votre fournisseur.

Lors de votre première connexion sur votre compte SecondLife pour arriverez sur leur iles d'accueil.

Pour nous rejoindre il faut vous rendre à cette adresse : http://maps.secondlife.com/secondlife/MEZA/160/157/136. Vous pouvez la coller dans votre navigateur internet qui affichera une page vous proposant de vous téléporter à l'endroit indiqué. Vous pouvez également la copier dans le "chat près de chez moi" de votre viewer/navigateur 3D. Un lien s'affichera et en cliquant dessus une fenêtre apparaitra vous proposant de vous Téléporter à l'endroit indiqué.

Pour l'autre plateforme, les modalités de connexion avec le même viewer/navigateur 3D que pour Second Life, vous seront indiquées lors de la conférence et au préalable à l'occasion des deux séances d'initiations.

En cas de problème de connexion en Web3D, vous pouvez nous demander de l'aide par le biais de Skype en contactant : bonob0h.