From 19bfbd451425d27267606c0462e53ed728c38589 Mon Sep 17 00:00:00 2001 From: sanex3339 Date: Mon, 19 Sep 2016 23:52:54 +0300 Subject: [PATCH] DomainLockNodeTemplate spec --- dist/index.js | 2 +- .../domain-lock-nodes/DomainLockNode.ts | 4 +- .../DomainLockNodeTemplate.ts | 4 +- .../domain-lock-nodes/DomainLockNode.spec.ts | 74 +++++++++++++++++++ test/index.spec.ts | 1 + 5 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 test/functional-tests/templates/custom-nodes/domain-lock-nodes/DomainLockNode.spec.ts diff --git a/dist/index.js b/dist/index.js index 3bb89c81..f29082d7 100644 --- a/dist/index.js +++ b/dist/index.js @@ -3538,7 +3538,7 @@ exports.DebugProtectionFunctionTemplate = DebugProtectionFunctionTemplate; "use strict"; function DomainLockNodeTemplate() { - return "\n (function () {\n var regExp = new RegExp(\"[{diff}]\", \"g\");\n var domains = \"{domains}\".replace(regExp, \"\").split(\";\");\n var eval = [][\"forEach\"][\"constructor\"];\n var window = eval(\"return this\")();\n \n for (var d in window) {\n if (d.length == 8 && d.charCodeAt(7) == 116 && d.charCodeAt(5) == 101 && d.charCodeAt(3) == 117 && d.charCodeAt(0) == 100) {\n break;\n }\n }\n \n for (var d1 in window[d]) {\n if (d1.length == 6 && d1.charCodeAt(5) == 110 && d1.charCodeAt(0) == 100) {\n break;\n }\n }\n \n var currentDomain = window[d][d1];\n \n if (!currentDomain) {\n return;\n }\n \n var ok = false;\n \n for (var i = 0; i < domains.length; i++) {\n var domain = domains[i];\n var position = currentDomain.length - domain.length;\n var lastIndex = currentDomain.indexOf(domain, position);\n var endsWith = lastIndex !== -1 && lastIndex === position;\n \n if (endsWith) {\n if (currentDomain.length == domain.length || domain.indexOf(\".\") === 0) {\n ok = true;\n }\n \n break;\n }\n }\n \n if (!ok) {\n eval('throw new Error()')();\n }\n })();\n "; + return "\n (function () {\n var regExp = new RegExp(\"[{diff}]\", \"g\");\n var domains = \"{domains}\".replace(regExp, \"\").split(\";\");\n var eval = [][\"forEach\"][\"constructor\"];\n var window = eval(\"return this\")();\n \n for (var d in window) {\n if (d.length == 8 && d.charCodeAt(7) == 116 && d.charCodeAt(5) == 101 && d.charCodeAt(3) == 117 && d.charCodeAt(0) == 100) {\n break;\n }\n }\n\n for (var d1 in window[d]) {\n if (d1.length == 6 && d1.charCodeAt(5) == 110 && d1.charCodeAt(0) == 100) {\n break;\n }\n }\n\n var currentDomain = window[d][d1];\n \n if (!currentDomain) {\n return;\n }\n \n var ok = false;\n \n for (var i = 0; i < domains.length; i++) {\n var domain = domains[i];\n var position = currentDomain.length - domain.length;\n var lastIndex = currentDomain.indexOf(domain, position);\n var endsWith = lastIndex !== -1 && lastIndex === position;\n \n if (endsWith) {\n if (currentDomain.length == domain.length || domain.indexOf(\".\") === 0) {\n ok = true;\n }\n \n break;\n }\n }\n \n if (!ok) {\n eval('throw new Error()')();\n }\n })();\n "; } exports.DomainLockNodeTemplate = DomainLockNodeTemplate; diff --git a/src/custom-nodes/domain-lock-nodes/DomainLockNode.ts b/src/custom-nodes/domain-lock-nodes/DomainLockNode.ts index 350c2095..92c76cc9 100644 --- a/src/custom-nodes/domain-lock-nodes/DomainLockNode.ts +++ b/src/custom-nodes/domain-lock-nodes/DomainLockNode.ts @@ -29,8 +29,8 @@ export class DomainLockNode extends AbstractCustomNode { * @returns {ESTree.Node} */ protected getNodeStructure (): ESTree.Node { - let domainsString = this.options.domainLock.join(';'), - [hiddenDomainsString, diff] = Utils.hideString(domainsString, domainsString.length * 3); + let domainsString: string = this.options.domainLock.join(';'), + [hiddenDomainsString, diff]: string[] = Utils.hideString(domainsString, domainsString.length * 3); return NodeUtils.convertCodeToStructure( DomainLockNodeTemplate().formatUnicorn({ diff --git a/src/templates/custom-nodes/domain-lock-nodes/domain-lock-node/DomainLockNodeTemplate.ts b/src/templates/custom-nodes/domain-lock-nodes/domain-lock-node/DomainLockNodeTemplate.ts index bfefde85..90c291ce 100644 --- a/src/templates/custom-nodes/domain-lock-nodes/domain-lock-node/DomainLockNodeTemplate.ts +++ b/src/templates/custom-nodes/domain-lock-nodes/domain-lock-node/DomainLockNodeTemplate.ts @@ -14,13 +14,13 @@ export function DomainLockNodeTemplate (): string { break; } } - + for (var d1 in window[d]) { if (d1.length == 6 && d1.charCodeAt(5) == 110 && d1.charCodeAt(0) == 100) { break; } } - + var currentDomain = window[d][d1]; if (!currentDomain) { diff --git a/test/functional-tests/templates/custom-nodes/domain-lock-nodes/DomainLockNode.spec.ts b/test/functional-tests/templates/custom-nodes/domain-lock-nodes/DomainLockNode.spec.ts new file mode 100644 index 00000000..bace8a86 --- /dev/null +++ b/test/functional-tests/templates/custom-nodes/domain-lock-nodes/DomainLockNode.spec.ts @@ -0,0 +1,74 @@ +import 'format-unicorn'; + +import { DomainLockNodeTemplate } from "../../../../../src/templates/custom-nodes/domain-lock-nodes/domain-lock-node/DomainLockNodeTemplate"; + +import { Utils } from "../../../../../src/Utils"; + + +const assert: Chai.AssertStatic = require('chai').assert; + +/** + * @param templateData + * @param currentDomain + * @returns {Function} + */ +function getFunctionFromTemplate (templateData: any, currentDomain: string) { + let domainLockTemplate: string = DomainLockNodeTemplate().formatUnicorn(templateData); + + return Function(` + document = { + domain: '${currentDomain}' + }; + + ${domainLockTemplate} + `)(); +} + +describe('DomainLockNodeTemplate (): string', () => { + let domainsString: string, + currentDomain: string, + hiddenDomainsString: string, + diff: string; + + it('should correctly runs code inside template if current domain matches with `domainsString`', () => { + domainsString = ['www.example.com'].join(';'); + currentDomain = 'www.example.com'; + [ + hiddenDomainsString, + diff + ] = Utils.hideString(domainsString, domainsString.length * 3); + + assert.doesNotThrow(() => getFunctionFromTemplate({ + diff: diff, + domains: hiddenDomainsString + }, currentDomain)); + }); + + it('should correctly runs code inside template if current domain matches with base domain of `domainsString` item', () => { + domainsString = ['www.test.com', '.example.com'].join(';'); + currentDomain = 'subdomain.example.com'; + [ + hiddenDomainsString, + diff + ] = Utils.hideString(domainsString, domainsString.length * 3); + + assert.doesNotThrow(() => getFunctionFromTemplate({ + diff: diff, + domains: hiddenDomainsString + }, currentDomain)); + }); + + it('should throw an error if current domain doesn\'t match with `domainsString`', () => { + domainsString = ['www.example.com'].join(';'); + currentDomain = 'www.test.com'; + [ + hiddenDomainsString, + diff + ] = Utils.hideString(domainsString, domainsString.length * 3); + + assert.throws(() => getFunctionFromTemplate({ + diff: diff, + domains: hiddenDomainsString + }, currentDomain)); + }); +}); diff --git a/test/index.spec.ts b/test/index.spec.ts index 4bf2d57a..cbdf2166 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -34,3 +34,4 @@ import './functional-tests/node-obfuscators/MemberExpressionObfuscator.spec'; import './functional-tests/node-obfuscators/MethodDefinitionObfuscator.spec'; import './functional-tests/node-obfuscators/ObjectExpressionObfuscator.spec'; import './functional-tests/node-obfuscators/VariableDeclarationObfuscator.spec'; +import './functional-tests/templates/custom-nodes/domain-lock-nodes/DomainLockNode.spec';