From 9b44e6bc4a9283e7bde9ecc31436dbf1fa607fdd Mon Sep 17 00:00:00 2001 From: "[1000i100] Millicent Billette" <git@1000i100.fr> Date: Fri, 16 Dec 2022 16:47:39 +0100 Subject: [PATCH] v3.5.3 Fix Dictionary escaping mechanics (rawSerialize + \ is special Char) --- CHANGELOG.fr.md | 28 +++++++++++++++++----------- npm/package.json | 2 +- src/dictionary-escaper.mjs | 3 ++- src/dictionary-escaper.test.mjs | 2 ++ src/dictionary-parser.mjs | 2 +- src/dictionary-tree.mjs | 13 ++++++++----- src/dictionary.test.mjs | 7 ++++++- 7 files changed, 37 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.fr.md b/CHANGELOG.fr.md index 1990aed..cec1543 100644 --- a/CHANGELOG.fr.md +++ b/CHANGELOG.fr.md @@ -14,6 +14,11 @@ et ce projet adhère au [versionnage sémantique](https://semver.org/spec/v2.0.0 ## [Non-publié/Non-Stabilisé] (par [1000i100]) +## [Version 3.5.3] - 2022-12-16 (par [1000i100]) +### Corrections +- '\' est désormais considéré comme un caractère spécial +- Les sérialisations internes (rawSerialize) de Dictionary ne reconvertissent plus les caractères spéciaux + ## [Version 3.5.2] - 2022-12-16 (par [1000i100]) ### Corrections - Dictionary échappe correctement les caractères spéciaux @@ -28,7 +33,7 @@ et ce projet adhère au [versionnage sémantique](https://semver.org/spec/v2.0.0 - dictionary intègre un mécanisme de cache pour détecter les doublons. Il est désactivable au-delà d'1_000_000 pour éviter les crashs et saturation de mémoire. - dictionary-parser gère toutes les syntaxes d'expression régulières qu'utilisaient gsper v2 + des situations plus complexes - dictionary-parser permet de distinguer identifiant secret et mot de passe via le séparateur `@@` -- dictionary-parser permet plusieurs types de déclinaisons : sans accents, accents optionnels, sans majuscule, majuscule optionnelle, tout en majuscule, et des déclinaison type leetSpeak. +- dictionary-parser permet plusieurs types de déclinaisons : sans accents, accents optionnels, sans majuscule, majuscule optionnelle, tout en majuscule, et des déclinaisons type leetSpeak. - dictionary-tree permet de savoir combien de combinaisons sont possibles et d'itérer dessus sans avoir besoin de les pré-générer. ### Corrections - Vérification à chaque build (et donc dans la CI) que les packets destinés à tourner dans le navigateur n'ont aucunes dépendances. @@ -36,7 +41,7 @@ et ce projet adhère au [versionnage sémantique](https://semver.org/spec/v2.0.0 ## [Version 3.4.2] - 2022-11-20 (par [1000i100]) ### Corrections -- checkKey ne complète plus automatiquement les clef trop courtes et envoi donc l'erreur attendue pour les clefs trops courtes. +- checkKey ne complète plus automatiquement les clefs trop courtes et envoi donc l'erreur attendue pour les clefs trop courtes. ## [Version 3.4.1] - 2022-11-20 (par [1000i100]) ### Corrections @@ -88,11 +93,11 @@ et ce projet adhère au [versionnage sémantique](https://semver.org/spec/v2.0.0 ## [Version 3.0.2] - 2020-12-10 (par [1000i100]) ### Ajouté - minification des modules g1lib -- publication automatisé sur npm à la publication de tag (sous réserve que la CI passe) +- publication automatisée sur npm à la publication de tag (sous réserve que la CI passe) ## [Version 3.0.1] - 2020-12-10 (par [1000i100]) ### Ajouté -- test unitaire exectué dans la CI +- test unitaire exécuté dans la CI - couverture de test - suivi de la maintenabilité / complexité - suivi de la duplication @@ -107,7 +112,7 @@ et ce projet adhère au [versionnage sémantique](https://semver.org/spec/v2.0.0 ## [Version 2.1.0] - 2018-06-27 (par [1000i100]) ### Ajouté -- syntaxe =référence> pour faire des références syncronisé et éviter de générer des variantes non souhaitées. +- syntaxe =référence> pour faire des références syncronisées et éviter de générer des variantes non souhaitées. ## [Version 2.0.0] - 2018-05-10 (par [1000i100]) @@ -116,12 +121,12 @@ et ce projet adhère au [versionnage sémantique](https://semver.org/spec/v2.0.0 ##### Générateur de variantes de mot de passe - Déclinaisons avec Majuscules - Désaccentuation -- Déclinaison avancées façon expression régulière +- Déclinaison avancée façon expression régulière ##### Documentation -- Rédaction d'une documentation des générateur de variante de mot de passe -##### Améliorations technique -- Ajout de test unitaire (meilleur fiabilité). -- Différentiation de la lib pour la partie crypto et de celle de génération de variantes (meilleur maintenabilité et évolutivité). +- Rédaction d'une documentation des générateurs de variante de mot de passe +##### Améliorations techniques +- Ajout de test unitaire (meilleure fiabilité). +- Différentiation de la lib pour la partie crypto et de celle de génération de variantes (meilleure maintenabilité et évolutivité). ## [Version 1.0.1 (Proof of Concept)] - 2018-04-18 (par [1000i100]) ### Ajouté @@ -130,8 +135,9 @@ et ce projet adhère au [versionnage sémantique](https://semver.org/spec/v2.0.0 - intégration des librairies de crypto nécessaires - calcul de la clef publique correspondant à chaque combinaison de secrets saisie, et comparaison à la clef publique de référence. -[Non-publié/Non-Stabilisé]: https://git.duniter.org/libs/g1lib.js/-/compare/v3.5.2...main +[Non-publié/Non-Stabilisé]: https://git.duniter.org/libs/g1lib.js/-/compare/v3.5.3...main +[Version 3.5.3]: https://git.duniter.org/libs/g1lib.js/-/compare/v3.5.2...v3.5.3 [Version 3.5.2]: https://git.duniter.org/libs/g1lib.js/-/compare/v3.5.1...v3.5.2 [Version 3.5.1]: https://git.duniter.org/libs/g1lib.js/-/compare/v3.5.0...v3.5.1 [Version 3.5.0]: https://git.duniter.org/libs/g1lib.js/-/compare/v3.4.2...v3.5.0 diff --git a/npm/package.json b/npm/package.json index a15559e..29e5806 100644 --- a/npm/package.json +++ b/npm/package.json @@ -1,6 +1,6 @@ { "name": "g1lib", - "version": "3.5.2", + "version": "3.5.3", "description": "An ubiquitous static javascript toolbox lib for Ǧ1 / Duniter ecosystem with reliability in mind.", "main": "nodejs/all.mjs", "browser": "browser/all.mjs", diff --git a/src/dictionary-escaper.mjs b/src/dictionary-escaper.mjs index 233d944..2925dff 100644 --- a/src/dictionary-escaper.mjs +++ b/src/dictionary-escaper.mjs @@ -12,7 +12,8 @@ const specialMap = { '>': String.fromCharCode(0x0b), ':': String.fromCharCode(0x0c), '=': String.fromCharCode(0x0d), - '@': String.fromCharCode(0x0e) + '@': String.fromCharCode(0x0e), + '\\': String.fromCharCode(0x0f), }; const revertSpecial = swapKeyValue(specialMap); function swapKeyValue(object) { diff --git a/src/dictionary-escaper.test.mjs b/src/dictionary-escaper.test.mjs index cf308d5..ce00c23 100644 --- a/src/dictionary-escaper.test.mjs +++ b/src/dictionary-escaper.test.mjs @@ -6,6 +6,8 @@ test('unescape special characters & re-escape them generate identical string', t const cases = [ 'plop:\\:ici', '[\\]*]', + '\\{\\}', + '\\\\', ] cases.forEach(c=>t.is(app.utfSpecial2escaped(app.escape2utfSpecial(c)), c)); }); diff --git a/src/dictionary-parser.mjs b/src/dictionary-parser.mjs index 538f73b..cb40061 100644 --- a/src/dictionary-parser.mjs +++ b/src/dictionary-parser.mjs @@ -154,7 +154,7 @@ function fromLeet(str){ }); } function flattenIt(regStr){ - return tree.serialize(tree.buildTreeStruct(regStr)); + return tree.rawSerialize(tree.buildTreeStruct(regStr)); } function resetCache() { cache(); diff --git a/src/dictionary-tree.mjs b/src/dictionary-tree.mjs index b9da3c9..4e0eee0 100644 --- a/src/dictionary-tree.mjs +++ b/src/dictionary-tree.mjs @@ -163,14 +163,17 @@ export function splitAround(pattern,treeStruct){ throw new Error(`Error: how to splitAround ${pattern} with ${JSON.stringify(treeStruct)} RAW: ${treeStruct}`); } const res = recSplitter(treeStruct); - if(res.matching) res.matching = serialize(buildTreeStruct(res.matching)); - if(res.notMatching) res.notMatching = serialize(buildTreeStruct(res.notMatching)); + if(res.matching) res.matching = rawSerialize(buildTreeStruct(res.matching)); + if(res.notMatching) res.notMatching = rawSerialize(buildTreeStruct(res.notMatching)); return res; } export function serialize(treeStruct) { - if (isString(treeStruct)) return utfSpecial2escaped(treeStruct.str); - if (isStep(treeStruct)) return treeStruct.step.map(serialize).join(''); - if (isAlt(treeStruct)) return `(${treeStruct.alt.map(serialize).join('|')})`; + return utfSpecial2escaped(rawSerialize(treeStruct)); +} +export function rawSerialize(treeStruct) { + if (isString(treeStruct)) return treeStruct.str; + if (isStep(treeStruct)) return treeStruct.step.map(rawSerialize).join(''); + if (isAlt(treeStruct)) return `(${treeStruct.alt.map(rawSerialize).join('|')})`; throw new Error(`Error: how to serialize ${JSON.stringify(treeStruct)} RAW: ${treeStruct}`); } diff --git a/src/dictionary.test.mjs b/src/dictionary.test.mjs index 027da38..924c5e9 100644 --- a/src/dictionary.test.mjs +++ b/src/dictionary.test.mjs @@ -45,7 +45,12 @@ test('_\\@\\@_@@_@\\@_ can be ambiguous with get, dryGet or not with rawGet, raw t.is(dico.splitDryGet(0)[0], '_'); t.is(dico.splitDryGet(0)[1], ')@@'); }); - +test('\\{\\} work fine', t => { + const dico = new app.Dictionary('\\{\\}'); + t.is(dico.length, 1); + t.is(dico.serialize(), '\\{\\}@@\\{\\}'); + t.is(dico.dryGet(0), '{}@@{}'); +}); test('get is time tracked', async t => { const dico = new app.Dictionary('(a|b|c)d(e|f|g)'); dico.get(1); -- GitLab