Added more restrictions for object keys transformations

Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/516
This commit is contained in:
sanex3339
2020-01-24 18:42:37 +03:00
parent 3bc9678f8c
commit 7b231fe308
13 changed files with 197 additions and 13 deletions
@@ -89,6 +89,50 @@ export abstract class AbstractPropertiesExtractor implements IPropertiesExtracto
|| NodeGuards.isRestElementNode(node);
}
/**
* @param {ObjectExpression} objectExpressionNode
* @param {Statement} hostStatement
* @returns {boolean}
*/
protected static isProhibitedHostStatement (
objectExpressionNode: ESTree.ObjectExpression,
hostStatement: ESTree.Statement
): boolean {
if (AbstractPropertiesExtractor.isProhibitedVariableDeclarationHostStatement(objectExpressionNode, hostStatement)) {
return true;
}
return false;
}
/**
* Fix of https://github.com/javascript-obfuscator/javascript-obfuscator/issues/516
* If object expression is placed inside any expression inside variable declaration with 2+ declarators
* - should mark host node as prohibited
*
* @param {ObjectExpression} objectExpressionNode
* @param {Statement} hostStatement
* @returns {boolean}
*/
protected static isProhibitedVariableDeclarationHostStatement (
objectExpressionNode: ESTree.ObjectExpression,
hostStatement: ESTree.Statement
): boolean {
if (!NodeGuards.isVariableDeclarationNode(hostStatement)) {
return false;
}
if (objectExpressionNode.parentNode && NodeGuards.isVariableDeclaratorNode(objectExpressionNode.parentNode)) {
return false;
}
if (hostStatement.declarations.length <= 1) {
return false;
}
return true;
}
/**
* @param {ObjectExpression} objectExpressionNode
* @param {Node} hostNode
@@ -182,11 +226,16 @@ export abstract class AbstractPropertiesExtractor implements IPropertiesExtracto
objectExpressionNode: ESTree.ObjectExpression,
memberExpressionHostNode: ESTree.Expression
): ESTree.Node {
const hostStatement: ESTree.Statement = this.getHostStatement(objectExpressionNode);
if (AbstractPropertiesExtractor.isProhibitedHostStatement(objectExpressionNode, hostStatement)) {
return objectExpressionNode;
}
const properties: ESTree.Property[] = objectExpressionNode.properties;
const [expressionStatements, removablePropertyIds]: [ESTree.ExpressionStatement[], number[]] = this
.extractPropertiesToExpressionStatements(properties, memberExpressionHostNode);
const hostStatement: ESTree.Statement = this.getHostStatement(objectExpressionNode);
const hostNodeWithStatements: TNodeWithStatements = this.getHostNodeWithStatements(
objectExpressionNode,
hostStatement
@@ -67,6 +67,12 @@ export class BasePropertiesExtractor extends AbstractPropertiesExtractor {
objectExpressionNode: ESTree.ObjectExpression,
parentNode: ESTree.Node
): ESTree.Node {
const hostStatement: ESTree.Statement = this.getHostStatement(objectExpressionNode);
if (AbstractPropertiesExtractor.isProhibitedHostStatement(objectExpressionNode, hostStatement)) {
return objectExpressionNode;
}
const newObjectExpressionHostNode: ESTree.VariableDeclaration = this.getObjectExpressionHostNode();
const newObjectExpressionIdentifier: ESTree.Identifier = this.getObjectExpressionIdentifierNode(newObjectExpressionHostNode);
@@ -79,7 +85,6 @@ export class BasePropertiesExtractor extends AbstractPropertiesExtractor {
...expressionStatements
];
const hostStatement: ESTree.Statement = this.getHostStatement(objectExpressionNode);
const hostNodeWithStatements: TNodeWithStatements = this.getHostNodeWithStatements(
objectExpressionNode,
hostStatement