@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 +39 -0
- package/llms.txt +6 -1
- package/package.json +2 -2
- package/src/headless.js +19 -4
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
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
198
|
-
|
|
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
|
|