Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ Change Log
v5.4.0
---
* Add support for `import attributes`. Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1256
* Add `renameProperties` support for private class fields and methods (`#foo`, `#bar()`). Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1220
* Fixed `reservedNames` not preserving class method and property names when `stringArray` or `deadCodeInjection` is enabled. Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1279
* Replaced `mkdirp` dependency with native `fs.mkdirSync({ recursive: true })`. Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1275. Thank you https://github.com/roli-lpci!
* Replaced `conf` dependency with custom implementation using `env-paths` and native `fs`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ export interface IRenamePropertiesReplacer {
excludePropertyName(propertyName: string): void;

/**
* @param {ESTree.Identifier | ESTree.Literal} node
* @returns {ESTree.Identifier | ESTree.Literal}
* @param {ESTree.Identifier | ESTree.Literal | ESTree.PrivateIdentifier} node
* @returns {ESTree.Identifier | ESTree.Literal | ESTree.PrivateIdentifier}
*/
replace(node: ESTree.Identifier | ESTree.Literal): ESTree.Identifier | ESTree.Literal;
replace(node: ESTree.Identifier | ESTree.Literal | ESTree.PrivateIdentifier): ESTree.Identifier | ESTree.Literal | ESTree.PrivateIdentifier;
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export class RenamePropertiesTransformer extends AbstractNodeTransformer {
>(
propertyNode: TNode,
propertyKeyNode: ESTree.Expression | ESTree.PrivateIdentifier
): propertyKeyNode is ESTree.Identifier | ESTree.Literal {
): propertyKeyNode is ESTree.Identifier | ESTree.Literal | ESTree.PrivateIdentifier {
if (NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
return false;
}
Expand Down Expand Up @@ -111,8 +111,13 @@ export class RenamePropertiesTransformer extends AbstractNodeTransformer {
* @param {NodeGuards} parentNode
* @returns {Node}
*/
// eslint-disable-next-line complexity
public transformNode(node: ESTree.Node, parentNode: ESTree.Node): ESTree.Node {
if (!NodeGuards.isIdentifierNode(node) && !NodeGuards.isLiteralNode(node)) {
if (
!NodeGuards.isIdentifierNode(node) &&
!NodeGuards.isLiteralNode(node) &&
!NodeGuards.isPrivateIdentifierNode(node)
) {
return node;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,14 @@ export class RenamePropertiesReplacer implements IRenamePropertiesReplacer {
}

/**
* @param {ESTree.Identifier | ESTree.Literal} node
* @returns {ESTree.Identifier | ESTree.Literal}
* @param {ESTree.Identifier | ESTree.Literal | ESTree.PrivateIdentifier} node
* @returns {ESTree.Identifier | ESTree.Literal | ESTree.PrivateIdentifier}
*/
public replace(node: ESTree.Identifier | ESTree.Literal): ESTree.Identifier | ESTree.Literal {
public replace(node: ESTree.Identifier | ESTree.Literal | ESTree.PrivateIdentifier): ESTree.Identifier | ESTree.Literal | ESTree.PrivateIdentifier {
if (NodeGuards.isPrivateIdentifierNode(node)) {
return NodeFactory.privateIdentifierNode(this.replacePropertyName(node.name));
}

if (NodeGuards.isIdentifierNode(node)) {
return NodeFactory.identifierNode(this.replacePropertyName(node.name));
}
Expand Down
12 changes: 12 additions & 0 deletions src/node/NodeFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,18 @@ export class NodeFactory {
};
}

/**
* @param {string} name
* @returns {PrivateIdentifier}
*/
public static privateIdentifierNode(name: string): ESTree.PrivateIdentifier {
return {
type: NodeType.PrivateIdentifier,
name,
metadata: { ignoredNode: false }
};
}

/**
* @param {(ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier)[]} specifiers
* @param {Literal} source
Expand Down
4 changes: 3 additions & 1 deletion src/node/NodeMetadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ export class NodeMetadata {
* @param {Identifier | Literal} node
* @returns {boolean}
*/
public static isPropertyKeyToRenameNode(node: ESTree.Identifier | ESTree.Literal): boolean {
public static isPropertyKeyToRenameNode(
node: ESTree.Identifier | ESTree.PrivateIdentifier | ESTree.Literal
): boolean {
return (
NodeMetadata.get<ESTree.IdentifierNodeMetadata | ESTree.LiteralNodeMetadata, 'propertyKeyToRenameNode'>(
node,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -910,9 +910,7 @@ describe('JavaScriptObfuscator', () => {
});

describe('Private identifiers support', () => {
const regExp: RegExp = new RegExp(
'class Foo *{ *' + '#bar *= *0x1; *' + "\\['method'] *\\(\\) *{ *" + 'this\.#bar *= *0x2;' + '} *' + '}'
);
const variableMatch: string = '_0x([a-f0-9]){4,6}';

let obfuscatedCode: string;

Expand All @@ -925,8 +923,20 @@ describe('JavaScriptObfuscator', () => {
}).getObfuscatedCode();
});

it('should support private identifiers', () => {
assert.match(obfuscatedCode, regExp);
it('should rename private field', () => {
assert.match(obfuscatedCode, new RegExp(`#${variableMatch} *= *0x1`));
});

it('should rename private field access', () => {
assert.match(obfuscatedCode, new RegExp(`this\\.#${variableMatch} *= *0x2`));
});

it('should rename private method declaration', () => {
assert.match(obfuscatedCode, new RegExp(`#${variableMatch}\\(\\) *\\{`));
});

it('should rename private method call', () => {
assert.match(obfuscatedCode, new RegExp(`this\\.#${variableMatch}\\(\\)`));
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,13 @@ class Foo {
method() {
this.#bar = 2;
}
}

#privateMethod() {
return this.#bar;
}

run() {
this.method();
return this.#privateMethod();
}
}
Loading