@starterlib/cli 0.10.3 → 0.10.4
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starterlib/cli",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.4",
|
|
4
4
|
"description": "Chaine de verification et de construction des SPA du socle frontal starter : starter-web verify, construire, sprite, manifeste, precompresser. Jamais en dependance de production.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|
|
@@ -157,6 +157,9 @@ export function ecrireLeManifeste(projet) {
|
|
|
157
157
|
routes: source.routes,
|
|
158
158
|
i18n: { perimetres: source.i18n?.perimetres, catalogues },
|
|
159
159
|
sprite: `${prefixe}/icones/${sprite}`,
|
|
160
|
+
// Les politiques Trusted Types que le remote cree lui-meme (lot 270), comparees par le BFF a sa
|
|
161
|
+
// CSP : recopiees telles que declarees, absentes si le remote n'en cree aucune.
|
|
162
|
+
...(source.trustedTypes === undefined ? {} : { trustedTypes: source.trustedTypes }),
|
|
160
163
|
apiExigee: source.apiExigee,
|
|
161
164
|
};
|
|
162
165
|
writeFileSync(join(projet.sortie, 'manifest.json'), `${JSON.stringify(manifeste, null, 2)}\n`);
|
package/src/etapes/securite.mjs
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* Pour tout fichier livre, cadre compris :
|
|
7
7
|
* - eval, new Function, stockage du navigateur, lecture de cookie ;
|
|
8
8
|
* - politiques Trusted Types comparees a la liste EXACTE du BFF
|
|
9
|
-
* (`platform.web.headers.csp.trusted-types-policies`)
|
|
9
|
+
* (`platform.web.headers.csp.trusted-types-policies`), augmentee de celles que le remote
|
|
10
|
+
* declare (`trustedTypes` de `manifest.source.json`, lot 270) ;
|
|
10
11
|
* - cartes de source (et leurs variantes compressees), script dans un SVG ;
|
|
11
12
|
* - dans une page HTML : balise meta de politique de securite, script ou feuille EN LIGNE.
|
|
12
13
|
*
|
|
@@ -28,7 +29,7 @@ import { join } from 'node:path';
|
|
|
28
29
|
import { fichiers, lireJson, relatif } from '../commun.mjs';
|
|
29
30
|
import { natureDesFichiers } from '../livraison.mjs';
|
|
30
31
|
|
|
31
|
-
/** Les politiques que la CSP du BFF laisse creer (application.yml du BFF). */
|
|
32
|
+
/** Les politiques que la CSP du BFF laisse creer par defaut (application.yml du BFF). */
|
|
32
33
|
export const POLITIQUES_ADMISES = ['angular', 'angular#components', 'es-module-shims', 'nfo'];
|
|
33
34
|
|
|
34
35
|
const CREATION_DE_POLITIQUE = /trustedTypes\s*\.\s*createPolicy\(\s*['"]([^'"]*)['"]/g;
|
|
@@ -165,7 +166,11 @@ function jugerUnePage(nom, contenu) {
|
|
|
165
166
|
* Les defauts d'un fichier livre `nom` (relatif au dossier livre) de contenu `contenu`. `role` :
|
|
166
167
|
* `remote` ou `hote` ; `partage` : le fichier est du code du cadre, partage par la federation.
|
|
167
168
|
*/
|
|
168
|
-
export function jugerUnFichierLivre(
|
|
169
|
+
export function jugerUnFichierLivre(
|
|
170
|
+
nom,
|
|
171
|
+
contenu,
|
|
172
|
+
{ role = 'remote', partage = false, declarees = [] } = {},
|
|
173
|
+
) {
|
|
169
174
|
// Une carte, ou sa variante compressee : `/x.js.map.br` se servirait aussi bien que l'original.
|
|
170
175
|
if (/\.map(?:\.br|\.gz)?$/.test(nom)) {
|
|
171
176
|
return [`${nom} : carte de source livree (sourceMap doit rester false en production).`];
|
|
@@ -190,10 +195,11 @@ export function jugerUnFichierLivre(nom, contenu, { role = 'remote', partage = f
|
|
|
190
195
|
const duCadre = POLITIQUES_DU_CADRE.some(
|
|
191
196
|
(exception) => exception.fichier.test(nom) && exception.politique === politique,
|
|
192
197
|
);
|
|
193
|
-
if (!POLITIQUES_ADMISES.includes(politique) && !duCadre) {
|
|
198
|
+
if (!POLITIQUES_ADMISES.includes(politique) && !declarees.includes(politique) && !duCadre) {
|
|
194
199
|
defauts.push(
|
|
195
200
|
`${nom} : politique Trusted Types hors liste ("${politique}" ; admises : ` +
|
|
196
|
-
`${POLITIQUES_ADMISES.join(', ')}). La declarer
|
|
201
|
+
`${[...POLITIQUES_ADMISES, ...declarees].join(', ')}). La declarer dans ` +
|
|
202
|
+
'manifest.source.json (trustedTypes) et a la CSP du BFF avant livraison.',
|
|
197
203
|
);
|
|
198
204
|
}
|
|
199
205
|
}
|
|
@@ -223,16 +229,31 @@ export default {
|
|
|
223
229
|
};
|
|
224
230
|
}
|
|
225
231
|
const { partages } = natureDesFichiers(lireJson(join(projet.sortie, 'remoteEntry.json')));
|
|
232
|
+
// Les politiques que le remote declare (lot 270) ; le BFF retire celui qui en exige une que sa
|
|
233
|
+
// CSP n'admet pas : l'etape le dit des la construction.
|
|
234
|
+
const declarees = projet.role === 'remote' ? (projet.source?.trustedTypes ?? []) : [];
|
|
235
|
+
const avertissements = declarees
|
|
236
|
+
.filter((politique) => !POLITIQUES_ADMISES.includes(politique))
|
|
237
|
+
.map(
|
|
238
|
+
(politique) =>
|
|
239
|
+
`trustedTypes : "${politique}" absente de la liste par defaut du BFF ` +
|
|
240
|
+
'(PLATFORM_WEB_CSP_TRUSTED_TYPES) : le BFF retire le remote tant qu elle n y est pas.',
|
|
241
|
+
);
|
|
226
242
|
const defauts = [];
|
|
227
243
|
for (const chemin of livres) {
|
|
228
244
|
const nom = relatif(projet.sortie, chemin);
|
|
229
245
|
const contenu = /\.(?:m?js|html|svg|css)$/.test(nom) ? readFileSync(chemin, 'utf8') : '';
|
|
230
246
|
defauts.push(
|
|
231
|
-
...jugerUnFichierLivre(nom, contenu, {
|
|
247
|
+
...jugerUnFichierLivre(nom, contenu, {
|
|
248
|
+
role: projet.role,
|
|
249
|
+
partage: partages.has(nom),
|
|
250
|
+
declarees,
|
|
251
|
+
}),
|
|
232
252
|
);
|
|
233
253
|
}
|
|
234
254
|
return {
|
|
235
255
|
defauts,
|
|
256
|
+
avertissements,
|
|
236
257
|
resume: `${String(livres.length)} fichier(s) livre(s) dont ${String(partages.size)} du cadre partage, rien a signaler.`,
|
|
237
258
|
};
|
|
238
259
|
},
|