@mostajs/pdf-sign-ui 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,40 @@
4
4
 
5
5
  Le format suit [Keep a Changelog](https://keepachangelog.com/fr/) ; versionnage [SemVer](https://semver.org/lang/fr/).
6
6
 
7
+ ## [0.3.2] — 2026-10-06
8
+
9
+ ### Corrigé — les identifiants de l'horodateur passent
10
+ - `buildSignRequest` transmet désormais `timestampHeaders`, `timestampAuth` et `timestampTimeout`
11
+ (`@mostajs/pdf-sign` ≥ 0.4.0). Son jeu de clés étant fermé, il les **perdait** : un horodateur
12
+ qualifié qui authentifie son client (clé d'API dans `X-API-KEY`) répondait 401 à chaque
13
+ scellement, alors que l'appelant avait fourni la clé. L'avertissement « PERDUE » le signalait,
14
+ sans l'empêcher.
15
+ - Relevé le 06/10/2026 en branchant l'horodateur d'Evidency dans mdseal.
16
+
17
+ ## [0.3.1] — 2026-09-29
18
+
19
+ ### Corrigé — « valide » exige intact ET valid ÉTABLIS
20
+ - `buildVerifyViewModel` tenait une signature pour valide dès que `intact` et `valid` n'étaient
21
+ **pas false**. `undefined` passait donc — or c'est ce que rend la détection du moteur Node :
22
+ une signature **présente**, rien de **vérifié**. Un document non vérifié s'affichait
23
+ « Signature(s) valide(s) ». Il faut désormais `intact === true` **et** `valid === true`.
24
+ - `statusLabel` affichait « Valide et de confiance » dès que `trusted` était vrai, **avant** de
25
+ regarder l'intégrité. La confiance ne se lit plus qu'après elle.
26
+ - Aucun libellé nouveau : les quatre existants suffisent, rien à traduire.
27
+
28
+ Relevé le 29/09/2026 en vérifiant `@mostajs/pdf-sign` 0.4.1, qui cesse de son côté de retomber
29
+ en silence sur la détection Node. Les deux corrections se complètent : l'une ne produit plus le
30
+ cas, l'autre ne le prend plus pour un succès s'il arrive.
31
+
32
+ ### Essais
33
+ - V-UI-1 à 5 : détection Node, document altéré (`valid:true, intact:false`), confiance sans
34
+ intégrité, valide sans confiance, une signature non vérifiée parmi deux valides. Contre-épreuve :
35
+ l'ancienne règle fait échouer V-UI-1, 3 et 5.
36
+
37
+ ### Modifié
38
+ - `peerDependencies["@mostajs/pdf-sign"]` : `^0.3.0` → `^0.3.0 || ^0.4.0` (en 0.x, `^0.3.0`
39
+ refusait la 0.4).
40
+
7
41
  ## [0.3.0] — 2026-09-26
8
42
 
9
43
  ### Ajouté
@@ -18,6 +52,11 @@ Le format suit [Keep a Changelog](https://keepachangelog.com/fr/) ; versionnage
18
52
  On avertit sans lever : lever casserait un appelant passant une clé supplémentaire inoffensive,
19
53
  alors que le but est seulement que la perte cesse d'être invisible.
20
54
 
55
+ ### Essais
56
+ - Quatre essais tiennent désormais ce que les commentaires ne retenaient pas : `timestampUrl`
57
+ transmis, vide écarté, clé inconnue **nommée** dans l'avertissement, et silence sur un
58
+ formulaire normal — un avertissement qui se déclenche toujours ne se lit plus.
59
+
21
60
  ### Modifié
22
61
  - `peerDependencies["@mostajs/pdf-sign"]` : `^0.2.0` → `^0.3.0`.
23
62
 
package/llms.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  # @mostajs/pdf-sign-ui — fiche LLM
2
2
  > Couche de PRÉSENTATION de @mostajs/pdf-sign : logique HEADLESS (validation du formulaire de signature, préréglages de documents officiels/SIH, view-models moteur & vérification, contrôleur orchestrant un `service` injecté). Framework-agnostique, zéro dépendance, testable sans navigateur. IMPLÉMENTÉ 0.2.0.
3
3
 
4
- - Version: 0.2.0 · Licence: AGPL-3.0-or-later · Auteur: Dr Hamid MADANI <drmdh@msn.com>
4
+ - Version: 0.3.2 · Licence: AGPL-3.0-or-later · Auteur: Dr Hamid MADANI <drmdh@msn.com>
5
5
  - Chemin: mostajs/mosta-pdf-sign-stack/mosta-pdf-sign-ui · Moteur: ../mosta-pdf-sign
6
6
 
7
7
  ## RÔLE
@@ -49,3 +49,8 @@ Composants en React.createElement (pas de JSX à transpiler ; bundler pour les .
49
49
  NOMME (et non celui des permissions).
50
50
  - buildEngineViewModel expose `canLock`.
51
51
  - peerDependency @mostajs/pdf-sign passe à ^0.2.0 (l'option n'existe pas avant).
52
+ - buildVerifyViewModel (0.3.1) : « valide » EXIGE intact===true ET valid===true. undefined (détection
53
+ Node : présente, non vérifiée) ⇒ « Présente (non validée) ». valid:true + intact:false = ALTÉRÉ ⇒ « Invalide ».
54
+ - buildSignRequest (0.3.2) : transmet timestampUrl ET les identifiants de l horodateur — timestampHeaders
55
+ (ex. { "X-API-KEY": cle }), timestampAuth { user, password }, timestampTimeout (s). Jeu de clés FERMÉ :
56
+ toute option absente est PERDUE (avertissement), d où leur ajout explicite.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mostajs/pdf-sign-ui",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Couche de présentation de @mostajs/pdf-sign — logique headless (validation du formulaire de signature, préréglages de documents officiels/SIH, view-models de vérification, contrôleur). Framework-agnostique, zéro dépendance.",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "author": "Dr Hamid MADANI <drmdh@msn.com>",
@@ -22,7 +22,7 @@
22
22
  "example": "node examples/verify-viewmodel.mjs"
23
23
  },
24
24
  "peerDependencies": {
25
- "@mostajs/pdf-sign": "^0.3.0",
25
+ "@mostajs/pdf-sign": "^0.3.0 || ^0.4.0",
26
26
  "react": ">=18"
27
27
  },
28
28
  "peerDependenciesMeta": {
package/src/headless.js CHANGED
@@ -84,7 +84,7 @@ const CLES_CONNUES = new Set([
84
84
  'input', 'output', 'p12', 'passphrase', 'passphraseFile', 'engine',
85
85
  'reason', 'name', 'location', 'contact', 'preset',
86
86
  'page', 'box', 'stampImage', 'permissions', 'restrict',
87
- 'openPassword', 'timestampUrl',
87
+ 'openPassword', 'timestampUrl', 'timestampHeaders', 'timestampAuth', 'timestampTimeout',
88
88
  ]);
89
89
 
90
90
  function signalerClesPerdues(data) {
@@ -130,6 +130,11 @@ export function buildSignRequest(data = {}) {
130
130
  // PAdES-T. Perdu ici en silence lors de sa première intégration — exactement comme
131
131
  // `openPassword` avant lui. D'où l'avertissement ci-dessous.
132
132
  timestampUrl: data.timestampUrl || undefined,
133
+ // 0.3.2 (06/10/2026) — les IDENTIFIANTS de l'horodateur (`@mostajs/pdf-sign` 0.4.0). Un horodateur
134
+ // qualifié authentifie son client : perdus ici, la clé d'API n'arrivait jamais (401 à chaque scellement).
135
+ timestampHeaders: data.timestampHeaders && Object.keys(data.timestampHeaders).length ? data.timestampHeaders : undefined,
136
+ timestampAuth: data.timestampAuth || undefined,
137
+ timestampTimeout: numOrUndef(data.timestampTimeout),
133
138
  };
134
139
  signalerClesPerdues(data);
135
140
  return prune(req);
@@ -183,7 +188,14 @@ export function buildVerifyViewModel(result, opts = {}) {
183
188
  signer: s.signer,
184
189
  status: statusLabel(s, t),
185
190
  }));
186
- const allValid = rows.length > 0 && rows.every((r) => r.valid !== false && r.intact !== false);
191
+ // ⚠️ « Valide » exige que les DEUX soient établis — `intact === true` ET `valid === true`.
192
+ //
193
+ // Jusqu'en 0.3.0, on lisait « pas false » : `undefined` passait pour valide. Or c'est exactement
194
+ // ce que rend la détection du moteur Node (`intact` et `valid` indéfinis : une signature est
195
+ // PRÉSENTE, rien n'a été VÉRIFIÉ) — et un document non vérifié s'affichait « Signature(s)
196
+ // valide(s) ». `valid` seul ne suffit pas non plus : sur un document ALTÉRÉ, pyhanko rend
197
+ // `valid: true` et `intact: false`.
198
+ const allValid = rows.length > 0 && rows.every((r) => r.valid === true && r.intact === true);
187
199
  return {
188
200
  signed: true,
189
201
  engine: result.engine,
@@ -194,8 +206,11 @@ export function buildVerifyViewModel(result, opts = {}) {
194
206
 
195
207
  function statusLabel(s, t) {
196
208
  if (s.valid === false || s.intact === false) return t("Invalide");
197
- if (s.trusted) return t("Valide et de confiance");
198
- if (s.valid || s.intact) return t("Valide (confiance non établie)");
209
+ // La confiance ne se lit qu'APRÈS l'intégrité : un certificat reconnu sur un document dont on
210
+ // ne sait pas s'il a changé ne rend pas ce document « valide et de confiance ».
211
+ if (s.valid === true && s.intact === true) {
212
+ return s.trusted ? t("Valide et de confiance") : t("Valide (confiance non établie)");
213
+ }
199
214
  return t("Présente (non validée)");
200
215
  }
201
216