diff --git a/CHANGELOG.fr.md b/CHANGELOG.fr.md index 1990aedb4ac0b590adc550595fef211462f2d62e..cec15433ff8846a1e7d46891366227fcc88b844b 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 a15559e0717f660e3d54c1532b1b1e9fbe56d19b..29e580696b1315e776e699c6e0761d8de380bf47 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 233d9445b0a350a5eed882d09f6243196a376bda..2925dff93b467b3936fbe8b72950e788c9b2095e 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 cf308d501581d0b7f8c554fd776bf2b10e9c3638..ce00c23cb1d258369f535ca0abfe381af5f2b908 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 538f73bc67174335751534e7651f0ba8cd460c17..cb400616d4d1183fb11940ee88ade6bf0f1cb0f8 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 b9da3c96b6668b664f9be66c5f94ab32b283f4df..4e0eee0980579ca7d6cc3a92aaf835bd340573a6 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 027da3867300d6e5b4feca1caf2c9c4af3480fdf..924c5e9839ad22ee8c1ccd1bec8574069db92c0d 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);