Aller au contenu

# Mettre à jour xapian

## Pourquoi Xapian

Xapian permet de faire de la recherche fulltext. C'est une librairie écrite en C++ avec des bindings Python qu'on utilise avec la dépendance `django-haystack` via `xapian-haystack`.

Elle a les avantages suivants:

- C'est très rapide et ça correspond très bien à notre échelle
- C'est performant
- Pas besoin de service supplémentaire, c'est une librairie qui utilise des fichiers, comme sqlite

Mais elle a un défaut majeur: on ne peut pas « juste » la `pip install`, il faut installer une librairie système et des bindings et ça a toujours été l'étape la plus frustrante et buggée de notre process d'installation. C'est aussi la seule raison qui fait que le projet n'es pas compatible windows.

## Mettre à jour Xapian

Pour installer xapian le plus simplement possible, on le compile depuis les sources via la commande `./manage.py install_xapian` comme indiqué dans la documentation d'installation.

La version de xapian est contrôlée par le `pyproject.toml` dans la section `[tool.xapian]`.

Cette section ressemble à ceci:

    [tool.xapian]
    version = "x.y.z"
    core-sha256 = "abcdefghijklmnopqrstuvwyz0123456789"
    bindings-sha256 = "abcdefghijklmnopqrstuvwyz0123456789"

Comme on peut le voir, il y a 3 variables différentes, une variable de version, qui sert à choisir la version à télécharger, et deux variables sha256.

Ces variables sha256 permettent de protéger des attaques par supply chain, un peu comme uv et npm font avec leurs respectifs `uv.lock` et `package-lock.json` . Elles permettent de vérifier que les fichiers téléchargés n'ont pas été altérés entre la configuration du fichier et l'installation par l'utilisateur et/ou le déploiement.

L'installation de xapian passe par deux fichiers, `xapian-core` et `xapian-bindings` disponibles sur https://xapian.org/download.

Lorsque le script d'installation télécharge les fichiers, il vérifie leur signature sha256 contre celles contenues dans ces deux variables. Si la signature n'est pas la même, une erreur est levée, protégant l'utilisateur d'une potentielle attaque.

Pour mettre à jour, il faut donc changer la version ET modifier la signature !

Pour récupérer ces signatures, il suffit de télécharger soi-même les archives du logiciel sur ce site, utiliser la commande `sha256sum` dessus et, enfin, reporter la valeur sortie par cette commande.

Pour ce qui est de la correspondance, `core-sha256` correspond à la signature de `xapian-core` et `bindings-sha256` de `xapian-bindings`.

Voici un bout de script qui peut faciliter une mise à jour:

    VERSION="x.y.z" # À modifier avec la bonne version
    curl -O "https://oligarchy.co.uk/xapian/${VERSION}/xapian-core-${VERSION}.tar.xz"
    sha256sum xapian-core-${VERSION}.tar.xz # Affiche la signature pour `core-sha256`
    rm -f xapian-core-${VERSION}

    curl -O "https://oligarchy.co.uk/xapian/${VERSION}/xapian-bindings-${VERSION}.tar.xz"
    sha256sum xapian-bindings-${VERSION}.tar.xz # Affiche la signature pour `bindingse-sha256`
    rm -f xapian-bindings-${VERSION}.tar.xz