فهرست منبع

Disabled generation of identifiers that matching with values of `reservedNames` option.

sanex3339 7 سال پیش
والد
کامیت
37a36429a9

+ 1 - 0
CHANGELOG.md

@@ -4,6 +4,7 @@ v0.15.0
 ---
 ---
 * **Breaking change:** dropped `node@4` and `node@5` support.
 * **Breaking change:** dropped `node@4` and `node@5` support.
 * **Breaking change:** renamed `extension` value of `target` option on `browser-no-eval`.
 * **Breaking change:** renamed `extension` value of `target` option on `browser-no-eval`.
+* **Breaking change:** disabled generation of identifiers that matching with values of `reservedNames` option. Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/216
 * **New CLI option:** `exclude` allows to exclude specific files or directories from obfuscation.
 * **New CLI option:** `exclude` allows to exclude specific files or directories from obfuscation.
 * Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/217
 * Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/217
 * Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/210
 * Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/210

+ 1 - 1
README.md

@@ -603,7 +603,7 @@ Enables obfuscation of global variable and function names **with declaration**.
 ### `reservedNames`
 ### `reservedNames`
 Type: `string[]` Default: `[]`
 Type: `string[]` Default: `[]`
 
 
-Disables the obfuscation of variables names, function names and function parameters that match the Regular Expression used.
+Disables the obfuscation and generation of identifiers that matching the Regular Expression used.
 
 
 Example:
 Example:
 ```ts
 ```ts

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/index.js


+ 5 - 5
package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "javascript-obfuscator",
   "name": "javascript-obfuscator",
-  "version": "0.15.0-dev.4",
+  "version": "0.15.0-dev.5",
   "description": "JavaScript obfuscator",
   "description": "JavaScript obfuscator",
   "keywords": [
   "keywords": [
     "obfuscator",
     "obfuscator",
@@ -23,7 +23,7 @@
     "chalk": "2.3.2",
     "chalk": "2.3.2",
     "chance": "1.0.13",
     "chance": "1.0.13",
     "class-validator": "0.8.4",
     "class-validator": "0.8.4",
-    "commander": "2.15.0",
+    "commander": "2.15.1",
     "escodegen-wallaby": "1.6.18",
     "escodegen-wallaby": "1.6.18",
     "esprima": "4.0.0",
     "esprima": "4.0.0",
     "estraverse": "4.2.0",
     "estraverse": "4.2.0",
@@ -67,15 +67,15 @@
     "mocha": "5.0.4",
     "mocha": "5.0.4",
     "pre-commit": "1.2.2",
     "pre-commit": "1.2.2",
     "rimraf": "2.6.2",
     "rimraf": "2.6.2",
-    "sinon": "4.4.6",
+    "sinon": "4.4.8",
     "threads": "0.10.1",
     "threads": "0.10.1",
     "ts-node": "5.0.1",
     "ts-node": "5.0.1",
     "tslint": "5.9.1",
     "tslint": "5.9.1",
     "tslint-eslint-rules": "5.1.0",
     "tslint-eslint-rules": "5.1.0",
     "tslint-language-service": "0.9.8",
     "tslint-language-service": "0.9.8",
-    "tslint-webpack-plugin": "1.2.0",
+    "tslint-webpack-plugin": "1.2.2",
     "typescript": "2.8.0-rc",
     "typescript": "2.8.0-rc",
-    "webpack": "4.1.1",
+    "webpack": "4.2.0",
     "webpack-cli": "2.0.12",
     "webpack-cli": "2.0.12",
     "webpack-node-externals": "1.6.0"
     "webpack-node-externals": "1.6.0"
   },
   },

+ 1 - 1
src/cli/JavaScriptObfuscatorCLI.ts

@@ -257,7 +257,7 @@ export class JavaScriptObfuscatorCLI implements IInitializable {
             )
             )
             .option(
             .option(
                 '--reserved-names <list> (comma separated, without whitespaces)',
                 '--reserved-names <list> (comma separated, without whitespaces)',
-                'Disable obfuscation of variable names, function names and names of function parameters that match the passed RegExp patterns (comma separated)',
+                'Disable obfuscation and generation of identifiers that matching the passed RegExp patterns (comma separated)',
                 ArraySanitizer
                 ArraySanitizer
             )
             )
             .option(
             .option(

+ 13 - 0
src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts

@@ -38,4 +38,17 @@ export abstract class AbstractIdentifierNamesGenerator implements IIdentifierNam
      * @returns {string}
      * @returns {string}
      */
      */
     public abstract generateWithPrefix (): string;
     public abstract generateWithPrefix (): string;
+
+    /**
+     * @param {string} identifierName
+     * @returns {boolean}
+     */
+    public isValidIdentifierName (identifierName: string): boolean {
+        return this.options.reservedNames.length
+            ? !this.options.reservedNames.some((reservedName: string) =>
+                new RegExp(reservedName, 'g').exec(identifierName) !== null
+            )
+            : true;
+
+    }
 }
 }

+ 35 - 34
src/generators/identifier-names-generators/MangledIdentifierNamesGenerator.ts

@@ -45,11 +45,43 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene
         super(randomGenerator, options);
         super(randomGenerator, options);
     }
     }
 
 
+    /**
+     * @returns {string}
+     */
+    public generate (): string {
+        const identifierName: string = this.generateNewMangledName(this.previousMangledName);
+
+        this.previousMangledName = identifierName;
+
+        return identifierName;
+    }
+
+    /**
+     * @returns {string}
+     */
+    public generateWithPrefix (): string {
+        const prefix: string = this.options.identifiersPrefix ?
+            `${this.options.identifiersPrefix}_`
+            : '';
+        const identifierName: string = this.generate();
+
+        return `${prefix}${identifierName}`;
+    }
+
+    /**
+     * @param {string} mangledName
+     * @returns {boolean}
+     */
+    public isValidIdentifierName (mangledName: string): boolean {
+        return super.isValidIdentifierName(mangledName)
+            && !MangledIdentifierNamesGenerator.reservedNames.includes(mangledName);
+    }
+
     /**
     /**
      * @param {string} previousMangledName
      * @param {string} previousMangledName
      * @returns {string}
      * @returns {string}
      */
      */
-    private static generateNewMangledName (previousMangledName: string): string {
+    private generateNewMangledName (previousMangledName: string): string {
         const generateNewMangledName: (name: string) => string = (name: string): string => {
         const generateNewMangledName: (name: string) => string = (name: string): string => {
             const nameSequence: string[] = MangledIdentifierNamesGenerator.nameSequence;
             const nameSequence: string[] = MangledIdentifierNamesGenerator.nameSequence;
             const nameLength: number = name.length;
             const nameLength: number = name.length;
@@ -82,41 +114,10 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene
 
 
         let newMangledName: string = generateNewMangledName(previousMangledName);
         let newMangledName: string = generateNewMangledName(previousMangledName);
 
 
-        if (!MangledIdentifierNamesGenerator.validateMangledName(newMangledName)) {
-            newMangledName = MangledIdentifierNamesGenerator.generateNewMangledName(newMangledName);
+        if (!this.isValidIdentifierName(newMangledName)) {
+            newMangledName = this.generateNewMangledName(newMangledName);
         }
         }
 
 
         return newMangledName;
         return newMangledName;
     }
     }
-
-    /**
-     * @param {string} mangledName
-     * @returns {boolean}
-     */
-    private static validateMangledName (mangledName: string): boolean {
-        return !MangledIdentifierNamesGenerator.reservedNames.includes(mangledName);
-    }
-
-    /**
-     * @returns {string}
-     */
-    public generate (): string {
-        const identifierName: string = MangledIdentifierNamesGenerator.generateNewMangledName(this.previousMangledName);
-
-        this.previousMangledName = identifierName;
-
-        return identifierName;
-    }
-
-    /**
-     * @returns {string}
-     */
-    public generateWithPrefix (): string {
-        const prefix: string = this.options.identifiersPrefix ?
-            `${this.options.identifiersPrefix}_`
-            : '';
-        const identifierName: string = this.generate();
-
-        return `${prefix}${identifierName}`;
-    }
 }
 }

+ 6 - 0
src/interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator.d.ts

@@ -8,4 +8,10 @@ export interface IIdentifierNamesGenerator {
      * @returns {string}
      * @returns {string}
      */
      */
     generateWithPrefix (): string;
     generateWithPrefix (): string;
+
+    /**
+     * @param {string} identifierName
+     * @returns {boolean}
+     */
+    isValidIdentifierName (identifierName: string): boolean;
 }
 }

+ 64 - 0
test/unit-tests/generators/identifier-names-generators/MangledlIdentifierNamesGenerator.spec.ts

@@ -169,4 +169,68 @@ describe('MangledIdentifierNamesGenerator', () => {
             });
             });
         });
         });
     });
     });
+
+    describe('isValidIdentifierName (identifierName: string): boolean', () => {
+        describe('Variant #1: reserved name as simple string', () => {
+            const expectedFirstIdentifier: string = 'a';
+            const expectedSecondIdentifier: string = 'd';
+            const reservedNames: string[] = ['b', 'c'];
+
+            let identifierNamesGenerator: IIdentifierNamesGenerator,
+                firstMangledIdentifierName: string,
+                secondMangledIdentifierName: string;
+
+            beforeEach(() => {
+                const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
+
+                inversifyContainerFacade.load('', { reservedNames });
+                identifierNamesGenerator = inversifyContainerFacade.getNamed<IIdentifierNamesGenerator>(
+                    ServiceIdentifiers.IIdentifierNamesGenerator,
+                    IdentifierNamesGenerator.MangledIdentifierNamesGenerator
+                );
+
+                firstMangledIdentifierName = identifierNamesGenerator.generate();
+                secondMangledIdentifierName = identifierNamesGenerator.generate();
+            });
+
+            it('should generate first identifier', () => {
+                assert.equal(firstMangledIdentifierName, expectedFirstIdentifier);
+            });
+
+            it('should generate second identifier', () => {
+                assert.equal(secondMangledIdentifierName, expectedSecondIdentifier);
+            });
+        });
+
+        describe('Variant #2: reserved name as string regexp', () => {
+            const expectedFirstIdentifier: string = 'a';
+            const expectedSecondIdentifier: string = 'g';
+            const reservedNames: string[] = ['[b|c|d|e|f]'];
+
+            let identifierNamesGenerator: IIdentifierNamesGenerator,
+                firstMangledIdentifierName: string,
+                secondMangledIdentifierName: string;
+
+            beforeEach(() => {
+                const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
+
+                inversifyContainerFacade.load('', { reservedNames });
+                identifierNamesGenerator = inversifyContainerFacade.getNamed<IIdentifierNamesGenerator>(
+                    ServiceIdentifiers.IIdentifierNamesGenerator,
+                    IdentifierNamesGenerator.MangledIdentifierNamesGenerator
+                );
+
+                firstMangledIdentifierName = identifierNamesGenerator.generate();
+                secondMangledIdentifierName = identifierNamesGenerator.generate();
+            });
+
+            it('should generate first identifier', () => {
+                assert.equal(firstMangledIdentifierName, expectedFirstIdentifier);
+            });
+
+            it('should generate second identifier', () => {
+                assert.equal(secondMangledIdentifierName, expectedSecondIdentifier);
+            });
+        });
+    });
 });
 });

+ 16 - 12
yarn.lock

@@ -2029,14 +2029,18 @@ [email protected]:
   version "2.11.0"
   version "2.11.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
 
 
[email protected].0, commander@^2.8.1:
-  version "2.15.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.0.tgz#ad2a23a1c3b036e392469b8012cec6b33b4c1322"
[email protected]:
+  version "2.15.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
 
 
 commander@^2.12.1, commander@~2.13.0:
 commander@^2.12.1, commander@~2.13.0:
   version "2.13.0"
   version "2.13.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
 
 
+commander@^2.8.1:
+  version "2.15.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.0.tgz#ad2a23a1c3b036e392469b8012cec6b33b4c1322"
+
 commondir@^1.0.1:
 commondir@^1.0.1:
   version "1.0.1"
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -5194,9 +5198,9 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
   version "3.0.2"
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
 
 
[email protected].6:
-  version "4.4.6"
-  resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.4.6.tgz#0b21ce56f1b11015749a82a3bbde2f46b78ec0e1"
[email protected].8:
+  version "4.4.8"
+  resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.4.8.tgz#0479e0ccb8caa0d737ce9773c8d53d57d38f2d84"
   dependencies:
   dependencies:
     "@sinonjs/formatio" "^2.0.0"
     "@sinonjs/formatio" "^2.0.0"
     diff "^3.1.0"
     diff "^3.1.0"
@@ -5689,9 +5693,9 @@ [email protected]:
   version "0.9.8"
   version "0.9.8"
   resolved "https://registry.yarnpkg.com/tslint-language-service/-/tslint-language-service-0.9.8.tgz#22a6f2f926b7c0a4cafed3ae1f65021e8008dc96"
   resolved "https://registry.yarnpkg.com/tslint-language-service/-/tslint-language-service-0.9.8.tgz#22a6f2f926b7c0a4cafed3ae1f65021e8008dc96"
 
 
[email protected].0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/tslint-webpack-plugin/-/tslint-webpack-plugin-1.2.0.tgz#b7ee325ca2fd020c621f1f123268ea674a49070e"
[email protected].2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/tslint-webpack-plugin/-/tslint-webpack-plugin-1.2.2.tgz#364369d2842d5fc8115815e9fe92f0d4dc39b9b7"
   dependencies:
   dependencies:
     chalk "^2.1.0"
     chalk "^2.1.0"
 
 
@@ -6026,9 +6030,9 @@ webpack-sources@^1.1.0:
     source-list-map "^2.0.0"
     source-list-map "^2.0.0"
     source-map "~0.6.1"
     source-map "~0.6.1"
 
 
-webpack@4.1.1:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.1.1.tgz#44e4d6a869dd36fdfc0b227f9bd865a4bccfd81c"
+webpack@4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.2.0.tgz#a4f80807651a0e611bb09609600dc266262efcc1"
   dependencies:
   dependencies:
     acorn "^5.0.0"
     acorn "^5.0.0"
     acorn-dynamic-import "^3.0.0"
     acorn-dynamic-import "^3.0.0"

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است