Skip to content

Commit 8acfac1

Browse files
authored
Merge pull request javascript-obfuscator#954 from javascript-obfuscator/rename-properties-preserve-name
`renameProperties` option now won't generate duplicated property names in some cases
2 parents e429380 + 1dbfd24 commit 8acfac1

File tree

8 files changed

+71
-38
lines changed

8 files changed

+71
-38
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ v2.16.0
55
* `stringArrayWrappersType: 'function'` now generates different indexes between each wrapper inside the same lexical scope
66
* `stringArrayWrappersType: 'function'` now generates different parameters order between each wrapper inside the same lexical scope
77
* `stringArrayWrappersType: 'function'` now appends `FunctionDeclaration` functions instead of `FunctionExpression` functions. This allows to append these wrappers at random positions inside each scope
8+
* `renameProperties` option now won't generate duplicated property names in some cases
89

910
v2.15.6
1011
---

dist/index.browser.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.cli.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/node-transformers/rename-properties-transformers/replacer/RenamePropertiesReplacer.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ export class RenamePropertiesReplacer implements IRenamePropertiesReplacer {
106106
*/
107107
private replacePropertyName (propertyName: string): string {
108108
if (this.isReservedName(propertyName)) {
109+
this.identifierNamesGenerator.preserveName(propertyName);
110+
109111
return propertyName;
110112
}
111113

test/dev/dev.ts

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,43 +7,19 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
77

88
let obfuscationResult = JavaScriptObfuscator.obfuscate(
99
`
10-
function foo () {
11-
console.log('foo', 1);
12-
console.log('foo', 2);
13-
console.log('foo', 3);
14-
15-
function bar() {
16-
console.log('bar', 1);
17-
console.log('bar', 2);
18-
console.log('bar', 3);
19-
20-
function baz() {
21-
console.log('baz', 1);
22-
console.log('baz', 2);
23-
console.log('baz', 3);
24-
}
25-
26-
baz();
27-
}
28-
29-
bar();
30-
}
31-
32-
foo();
10+
var object = {
11+
b: 'field',
12+
bar: 'value'
13+
};
3314
`,
3415
{
3516
...NO_ADDITIONAL_NODES_PRESET,
36-
seed: 1,
3717
compact: false,
3818
simplify: false,
39-
stringArray: true,
40-
stringArrayThreshold: 1,
41-
stringArrayIndexShift: true,
42-
stringArrayWrappersChainedCalls: true,
43-
stringArrayWrappersCount: 3,
44-
stringArrayWrappersType: 'function',
45-
stringArrayWrappersParametersMaxCount: 5,
46-
identifierNamesGenerator: 'mangled'
19+
renameProperties: true,
20+
renamePropertiesMode: 'safe',
21+
identifierNamesGenerator: 'mangled',
22+
reservedNames: ['^a$']
4723
}
4824
);
4925

test/functional-tests/node-transformers/rename-properties-transformers/rename-properties-transformer/RenamePropertiesTransformer.spec.ts

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFac
1212
describe('RenamePropertiesTransformer', () => {
1313
describe('transformNode', () => {
1414
describe('Mode: `unsafe`', () => {
15-
describe('Hexadecimal identifier names generator', () => {
15+
describe('Variant #1: Hexadecimal identifier names generator', () => {
1616
describe('Variant #1: base properties rename', () => {
1717
const property1RegExp: RegExp = /'(_0x[a-f0-9]{4,6})': *0x1/;
1818
const property2RegExp: RegExp = /'(_0x[a-f0-9]{4,6})': *0x2/;
@@ -54,7 +54,7 @@ describe('RenamePropertiesTransformer', () => {
5454
});
5555
});
5656

57-
describe('Mangled identifier names generator', () => {
57+
describe('Variant #2: Mangled identifier names generator', () => {
5858
describe('Variant #1: base properties mangle', () => {
5959
const property1RegExp: RegExp = /'a': *0x1/;
6060
const property2RegExp: RegExp = /'b': *0x2/;
@@ -335,7 +335,7 @@ describe('RenamePropertiesTransformer', () => {
335335
});
336336
});
337337

338-
describe('Ignored literal node type', () => {
338+
describe('Variant #3: Ignored literal node type', () => {
339339
describe('Variant #1: boolean literal node', () => {
340340
const regExp: RegExp = /var obj *= *{}; *obj\[!!\[]] *= *0x1;/;
341341

@@ -359,6 +359,31 @@ describe('RenamePropertiesTransformer', () => {
359359
});
360360
});
361361
});
362+
363+
describe('Variant #4: Prevent generation of the property names that are equal to the existing object property names', () => {
364+
const regExp: RegExp = /var object *= *{'b': *'field', *'c': *'value'};/;
365+
366+
let obfuscatedCode: string;
367+
368+
before(() => {
369+
const code: string = readFileAsString(__dirname + '/fixtures/duplicated-generated-names-1.js');
370+
371+
obfuscatedCode = JavaScriptObfuscator.obfuscate(
372+
code,
373+
{
374+
...NO_ADDITIONAL_NODES_PRESET,
375+
renameProperties: true,
376+
renamePropertiesMode: RenamePropertiesMode.Unsafe,
377+
identifierNamesGenerator: 'mangled',
378+
reservedNames: ['^a$']
379+
}
380+
).getObfuscatedCode();
381+
});
382+
383+
it('Match #1: should skip literal property with invalid type', () => {
384+
assert.match(obfuscatedCode, regExp);
385+
});
386+
});
362387
});
363388

364389
describe('Mode: `safe`', () => {
@@ -406,6 +431,31 @@ describe('RenamePropertiesTransformer', () => {
406431
assert.match(obfuscatedCode, referencesRegExp);
407432
});
408433
});
434+
435+
describe('Variant #2: Prevent generation of the property names that are equal to the existing object property names', () => {
436+
const regExp: RegExp = /var object *= *{'b': *'field', *'c': *'value'};/;
437+
438+
let obfuscatedCode: string;
439+
440+
before(() => {
441+
const code: string = readFileAsString(__dirname + '/fixtures/duplicated-generated-names-1.js');
442+
443+
obfuscatedCode = JavaScriptObfuscator.obfuscate(
444+
code,
445+
{
446+
...NO_ADDITIONAL_NODES_PRESET,
447+
renameProperties: true,
448+
renamePropertiesMode: RenamePropertiesMode.Safe,
449+
identifierNamesGenerator: 'mangled',
450+
reservedNames: ['^a$']
451+
}
452+
).getObfuscatedCode();
453+
});
454+
455+
it('Match #1: should skip literal property with invalid type', () => {
456+
assert.match(obfuscatedCode, regExp);
457+
});
458+
});
409459
});
410460

411461
describe('Property identifier names from property identifier names cache', () => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
var object = {
2+
b: 'field',
3+
bar: 'value'
4+
};

0 commit comments

Comments
 (0)