@mostajs/archive-box
v0.2.0
Published
Une archive : un zip, un manifeste, des empreintes SHA-256 par fichier, une signature Ed25519 facultative. Générique — le module ignore ce qu'il y a DANS les fichiers. Extrait du noyau d'@mostajs/ixarchive, débarrassé de son domaine « projets ».
Maintainers
Readme
@mostajs/archive-box
Auteur : Dr Hamid MADANI [email protected] · Licence : AGPL-3.0-or-later
Niveau : N0 · Dépendances : jszip + @mostajs/crypto-box
Une archive : un zip, un manifeste, des empreintes — et, si vous voulez, une signature. Rien de métier.
Pourquoi ce module existe
@mostajs/ixarchive avait les bonnes mécaniques (manifeste versionné, SHA-256, zip, fichiers
hors base, import validé) — mais prisonnières d'un domaine : arbres de projets
(collectProjectTree, rootProjectSlug), pierres tombales, pseudonymisation, compteurs de
répondants et de réponses gravés dans le format lui-même. Impossible d'archiver autre chose
qu'un projet d'enquête.
Extrait ici, le noyau redevient réutilisable — ixarchive retrouve son domaine, @mostajs/backup
obtient son artefact.
Une archive n'est pas « des fichiers zippés »
C'est un artefact daté, autodescriptif et vérifiable :
| | Ce que ça prouve | |---|---| | SHA-256 par fichier | l'archive n'a pas été corrompue par accident | | Signature Ed25519 (facultative) | l'archive a été produite par nous |
La différence n'est pas rhétorique. Un attaquant qui modifie un fichier et recalcule son empreinte dans le manifeste passe le contrôle d'intégrité : tout est « cohérent ». Seule la signature du manifeste le trahit.
Et il y a plus subtil : une archive parfaitement valide, signée par quelqu'un d'autre.
Empreintes bonnes, signature authentique — et pourtant ce n'est pas la vôtre. D'où
expectedPublicKey : sans elle, on restaure une base fabriquée par un tiers.
Usage
import { buildArchive, openArchive } from '@mostajs/archive-box';
import { generateSigningKeyPair } from '@mostajs/crypto-box';
const cle = generateSigningKeyPair();
const { buffer } = await buildArchive({
name: 'sauvegarde-yalidine',
kind: 'backup', // étiquette libre — le module ne l'interprète pas
files: [
{ path: 'entities/Ticket.json', content: json },
{ path: 'config.json', content: config },
{ path: 'files/logo.png', content: octets },
],
extra: { siteId: 'yalidine-01', entites: 12480 }, // le DOMAINE range ce qu'il veut ici
signingKey: cle.privateKey,
signingPublicKey: cle.publicKey,
});
// Restauration — strict par défaut : LÈVE si l'intégrité ou la signature est en défaut.
const { manifest, files, integrity, signature } = await openArchive(buffer, {
expectedPublicKey: cle.publicKey,
});strict: false permet d'inspecter une archive suspecte sans la refuser d'emblée.
Ce que le module ignore
Ce qu'il y a dans les fichiers. Des entités ORM, une configuration, une licence, des images :
il ne le sait pas et n'a pas à le savoir. C'est ce qui le rend réutilisable — et c'est exactement
ce qui manquait à ixarchive.
Tests
npm test # 14 tests mjs-unitUne archive se juge sur ce qu'elle refuse : corruption d'un fichier, fichier manquant, manifeste falsifié (intégrité bernée, signature non), et signataire inattendu.
