Table des matières

Installer un pont Signal - Matrix

Matrix est capable d'échanger avec d'autres protocoles grâce à des ponts.

Les étapes pour installer un pont sont plus ou moins les mêmes quel que soit le pont. On va voir comment installer un pont entre Signal et Matrix, matruix-signal, qui vous permettra de recevoir/envoyer des messages de ou vers vos contacts Signal.

Prérequis

Il vous faut un serveur Matrix, Synapse par exemple, et PostgreSQL. Je pars du principe que vous avez suivi le tuto sur comment Installer Matrix et que vous avez déjà ces deux logiciels d'installés.

Python3

Installez Python3 ainsi que pip et virtualenv

sudo aptitude install python3 virtualenv python3-pip git

Installez le module shared-secret-authenticator :

sudo pip install git+https://github.com/devture/matrix-synapse-shared-secret-auth

Signald

Il va nous falloir également installer Signald, un logiciel qui permet d'interagir avec Signal (comme la version desktop de Signal).

On va récupérer le dépôt officiel en commençant par récupérer les clés de signature :

sudo wget -O /usr/share/keyrings/signald.gpg https://signald.org/signald.gpg

Créez le fichier

/etc/apt/sources.list.d/signald.list

Ajoutez les lignes suivante puis enregistrez

deb [signed-by=/usr/share/keyrings/signald.gpg] https://updates.signald.org unstable main

Mettez à jours les paquets

sudo aptitude update

Installez Signald

sudo aptitude install signald

Libolm et bibliothèques dev

Lancez la commande suivante pour installer Libolm, nécessaire au chiffrement :

sudo aptitude install libolm-dev python3-dev build-essential

Matruix-signal

Installation

Créez un répertoire et accédez-y

mkdir mautrix-signal && cd mautrix-signal

Créez l'environnement Python

virtualenv -p /usr/bin/python3 .

Activez-le

source ./bin/activate

Installez le pont

pip install --upgrade mautrix-signal[all]

L'installation est finie, on peut passer à la configuration

Configuration

Créez une copie du fichier example-config.yaml

cp example-config.yaml config.yaml

Ouvrez le fichier config.yaml. Si votre serveur Matrix tourne sur la même machine que le pont, remplacez la ligne

address: https://example.com

par

address: http://localhost:8008

Si le serveur Matrix tourne sur une autre machine, indiquez l'url du serveur Matrix.

Dans la ligne

domain: example.com

remplacez example.com par le domaine servant à accéder à votre serveur Matrix

Remplacer la ligne

database: postgres://username:password@hostname/db

par

database: postgres://signalbridge:motdepasse@localhost:5432/signalbridge

Mettez le mot de passe de votre choix, on créera la base de données plus tard.

Dans la partie “permissions”, adaptez les lignes à votre cas. Dans mon cas, je n'ai qu'un seul utilisateur qui est admin. J'ai donc que la ligne

'@fate:matrix.nomdedomaine.fr': admin

Remplacez “fate” par votre nom d'utilisateur ainsi que “nomdedomaine.fr” par l'url d'accès à votre serveur Matrix.

Dans la partie “encryption”, passez les options “allow” et “default” à true pour activer le chiffrement entre le pont et le serveur Matrix

Pour que le pont puisse accéder à Signald, il a besoin d'avoir accès au fichier socket (remplacez “pi” par l'utilisateur qui exécutera le pont)

sudo chown signald:pi /var/run/signald/

L'utilisateur qui exécute le pont a besoin d'être membre du groupe signald pour accéder au répertoire (sinon vous aurez des erreurs lors d'envoi de message avec des photos)

/var/lib/signald/

L'utilisateur qui exécute le pont chez moi est “pi”. Pour le rajouter au groupe signald, lancez la commande

sudo adduser pi signald

Passons à la base de données

Création de la base de données

Connectez-vous avec l'utilisateur postgres

sudo -i -u postgres

Lancez PostgreSQL

psql

Créez l'utilisateur

CREATE ROLE signalbridge LOGIN PASSWORD 'mot_de_passe';

Mettez le même mot de passe que celui que vous avez renseigné dans le fichier config.yaml

Créez la base de données

CREATE DATABASE signalbridge OWNER signalbridge;

Quittez PostgreSQL

exit

Déconnectez-vous de l'utilisateur postgres

exit

Registration.yaml

Les ponts ont besoin d'un fichier registration.yaml pour avoir certain droits sur votre serveur. Pour le créer, lancez la commande suivante

python -m mautrix_signal -g

Ensuite ouvrez le fichier homeserver.yaml de votre serveur et indiquez l'emplacement du fichier registration après la ligne “app_service_config_files:”

# A list of application service config file to use
app_service_config_files:
- "/home/pi/mautrix-signal/registration.yaml"

Relancez votre serveur Matrix

sudo systemctl restart matrix-synapse.service

Lancement du pont via Systemd

Créez le fichier

/etc/systemd/system/mautrix-signal.service

Copiez les lignes suivantes dedans

[Unit]
Description=mautrix-signal bridge
After=matrix-synapse.service postgresql.service

[Service]
# N.B. If you didn't create a user with the correct home directory, set this
#      to the directory where config.yaml is (e.g. /opt/mautrix-signal).
WorkingDirectory=/home/pi/mautrix-signal/
ExecStart=/home/pi/mautrix-signal/bin/python -m mautrix_signal
User=pi

[Install]
WantedBy=multi-user.target

Modifier les chemins et le nom de l'utilisateur si besoin.

Activez le service au démarrage

sudo systemctl enable mautrix-signal.service

Démarrez le service

sudo systemctl start mautrix-signal.service

Dans votre client Matrix (Element), ouvrez une discussion privée avec le bot @signalbot:votre.serveur

Dans la discussion, tapez

link signal-bridge

Ca va vous afficher un QR code que vous devrez scanner avec votre application Signal pour lier les deux appareils.

Activer le double puppeting

Le “double puppeting” permet que lorsque vous envoyez un message depuis l'application Signal, le message sera également présent dans Matrix et les messages marqués comme lu dans Matrix seront également marqués comme lus sur les autres appareils.

Créez un fichier doublepupetting.yaml dans le répertoire du pont et copiez les lignes suivantes :

# The ID doesn't really matter, put whatever you want.
id: doublepuppet
# The URL is intentionally left empty (null), as the homeserver shouldn't
# push events anywhere for this extra appservice. If you use a
# non-spec-compliant server, you may need to put some fake URL here.
url:
# Generate random strings for these three fields. Only the as_token really
# matters, hs_token is never used because there's no url, and the default
# user (sender_localpart) is never used either.
as_token: votre_token
hs_token: votre_token
sender_localpart: votre_token
# Bridges don't like ratelimiting. This should only apply when using the
# as_token, normal user tokens will still be ratelimited.
rate_limited: false
namespaces:
  users:
  # Replace your\.domain with your server name (escape dots for regex)
  - regex: '@.*:votre\.domaine\.fr'
    # This must be false so the appservice doesn't take over all users completely.
    exclusive: false

Vous pouvez générer un token avec la commande suivante (les 3 tokens doivent être différents) :

pwgen -s 128 1

Ouvrez le fichier homeserver.yaml de Synapse et ajoutez les lignes suivantes dans la section double_puppet:

# Shared secrets for automatic double puppeting.
    # See https://docs.mau.fi/bridges/general/double-puppeting.html for instructions.
    secrets:
        votre.domaine.fr: as_token:votre_token_as

Enfin, ouvrez le fichier de config de Matrix et ajoutez dans la section app_service_config_files le chemin vers votre fichier doublepupetting.yaml

Redémarrez Synapse et le pont Signal

sudo systemctl restart matrix-synapse.service
sudo systemctl restart mautrix-signal.service

Mise à jour

On va créer un script pour mettre à jour le pont. Créez le fichier update_signal_bridge.sh dans le même répertoire que le dossier mautrix-signal et ajoutez-y les lignes suivantes (remplacez votreadressemail par une adresse mail valide et modifiez le chemin vers le dossier mautrix-signal):

#!/bin/bash
errorFile="../mautrix-signalErrorUpdate"
versionFile="../mautrix-signalVersion"
adminMail="votreadressemail"
cd /chemin/vers/mautrix-signal
source ./bin/activate
# Si le fichier de version existe, on récupére la version
if [ -f $versionFile ]; then
                currentVersion=$(cat $versionFile)
#S'il n'existe pas, on force la version à 0
else
        currentVersion="0"
fi
# On récupère le numéro de la version présent sur le dépôt
repositoryVersion=$(yolk -V mautrix-signal | awk '{print $2}')
# Si la version présente sur le dépôt est plus récente, on lance la mise à jour
if [ $currentVersion != $repositoryVersion ]; then
        # On supprime l'ancien fichier d'erreur s'il existe
        if [ -f $errorFile ]; then
                rm -f $errorFile
        fi
        # On lance la mise à jour du paquet
        pip install --upgrade mautrix-signal[all] > /dev/null 2> $errorFile
        # Si le fichier d'erreur n'est pas vide, on envoie un mail d'erreur
        if [ -s $errorFile ]; then
                echo "Une erreur s'est produite lors de la mise à jour du pont Signal-Matrix (mautrix-signal). Le message d'erreur se trouve en pièce-jointe." | mutt -x -s "Erreur lors de la mise à jour du pont Signal-Matrix" -a $errorFile -- $adminMail
        # Si le fichier d'erreur est vide, on envoie un mail de mise à jour et on met à jour le fichier de version
        else
                echo "Le pont mautrix-matrix (mautrix-signal) a été mis à jour de la version $currentVersion vers la version $repositoryVersion" | mutt -x -s "Mise à jour du pont mautrix-Matrix" -- $adminMail
                echo "$repositoryVersion" > $versionFile
        fi
fi

Le script est commenté afin qu'il soit facile de comprendre chaque bloc. Pour que ce script fonctionne pleinement il faut que votre serveur soit capable d'envoyer des e-mails, sinon les mises à jours se lanceront mais vous ne serez pas averti lors des mises à jour ou des erreurs de mise à jour. Il vous faut également York pour récupérer les versions présentes sur les dépôts. Vous pouvez l'installer avec la commande suivante :

pip install yolk3k

On va créer une tâche cron afin que ce script se lance tous les jours. Ouvrez le fichier cron avec la commande

crontab -e

Ajoutez la ligne suivante (remplacez l'emplacement du répertoire) : <code bash>0 0 * * * /home/pi/matrix_bridges/update_signal_bridge.sh

Appuyez sur CTRL + O puis CTRL + X pour appliquer les modifications.

Tous les jours à minuit, le pont se mettra à jour si une nouvelle version est disponible.