All files / src/custom-nodes/string-array-nodes StringArrayCallsWrapper.ts

100% Statements 36/36
100% Branches 4/4
100% Functions 1/1
100% Lines 33/33
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 1261x 1x   1x         1x   1x   1x   1x 1x 1x 1x 1x 1x   1x 1x     1x         1x           1x           1x               530x                         530x 530x 530x             527x 527x   527x 1x               1x           1x     2x             2x     527x             527x   527x                          
import { injectable, inject } from 'inversify';
import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
import * as format from 'string-template';
 
import { IOptions } from '../../interfaces/options/IOptions';
import { IStorage } from '../../interfaces/storages/IStorage';
 
import { StringArrayEncoding } from '../../enums/StringArrayEncoding';
 
import { initializable } from '../../decorators/Initializable';
 
import { NO_CUSTOM_NODES_PRESET } from '../../options/presets/NoCustomNodes';
 
import { AtobTemplate } from '../../templates/custom-nodes/AtobTemplate';
import { Rc4Template } from '../../templates/custom-nodes/Rc4Template';
import { SelfDefendingTemplate } from '../../templates/custom-nodes/string-array-nodes/string-array-calls-wrapper/SelfDefendingTemplate';
import { StringArrayBase64DecodeNodeTemplate } from '../../templates/custom-nodes/string-array-nodes/string-array-calls-wrapper/StringArrayBase64DecodeNodeTemplate';
import { StringArrayCallsWrapperTemplate } from '../../templates/custom-nodes/string-array-nodes/string-array-calls-wrapper/StringArrayCallsWrapperTemplate';
import { StringArrayRc4DecodeNodeTemplate } from '../../templates/custom-nodes/string-array-nodes/string-array-calls-wrapper/StringArrayRC4DecodeNodeTemplate';
 
import { AbstractCustomNode } from '../AbstractCustomNode';
import { JavaScriptObfuscator } from '../../JavaScriptObfuscator';
 
@injectable()
export class StringArrayCallsWrapper extends AbstractCustomNode {
    /**
     * @type {IStorage <string>}
     */
    @initializable()
    private stringArrayStorage: IStorage <string>;
 
    /**
     * @type {string}
     */
    @initializable()
    private stringArrayName: string;
 
    /**
     * @type {string}
     */
    @initializable()
    private stringArrayCallsWrapperName: string;
 
    /**
     * @param options
     */
    constructor (
        @inject(ServiceIdentifiers.IOptions) options: IOptions
    ) {
        super(options);
    }
 
    /**
     * @param stringArrayStorage
     * @param stringArrayName
     * @param stringArrayCallsWrapperName
     */
    public initialize (
        stringArrayStorage: IStorage <string>,
        stringArrayName: string,
        stringArrayCallsWrapperName: string
    ): void {
        this.stringArrayStorage = stringArrayStorage;
        this.stringArrayName = stringArrayName;
        this.stringArrayCallsWrapperName = stringArrayCallsWrapperName;
    }
 
    /**
     * @returns {string}
     */
    private getDecodeStringArrayTemplate (): string {
        let decodeStringArrayTemplate: string = '',
            selfDefendingCode: string = '';
 
        if (this.options.selfDefending) {
            selfDefendingCode = format(SelfDefendingTemplate(), {
                stringArrayCallsWrapperName: this.stringArrayCallsWrapperName,
                stringArrayName: this.stringArrayName
            });
        }
 
        switch (this.options.stringArrayEncoding) {
            case StringArrayEncoding.base64:
                decodeStringArrayTemplate = format(StringArrayBase64DecodeNodeTemplate(), {
                    atobPolyfill: AtobTemplate(),
                    selfDefendingCode,
                    stringArrayCallsWrapperName: this.stringArrayCallsWrapperName
                });
 
                break;
 
            case StringArrayEncoding.rc4:
                decodeStringArrayTemplate = format(StringArrayRc4DecodeNodeTemplate(), {
                    atobPolyfill: AtobTemplate(),
                    rc4Polyfill: Rc4Template(),
                    selfDefendingCode,
                    stringArrayCallsWrapperName: this.stringArrayCallsWrapperName
                });
 
                break;
        }
 
        return decodeStringArrayTemplate;
    }
 
    /**
     * @returns {string}
     */
    protected getTemplate (): string {
        const decodeNodeTemplate: string = this.getDecodeStringArrayTemplate();
 
        return JavaScriptObfuscator.obfuscate(
            format(StringArrayCallsWrapperTemplate(), {
                decodeNodeTemplate,
                stringArrayCallsWrapperName: this.stringArrayCallsWrapperName,
                stringArrayName: this.stringArrayName
            }),
            {
                ...NO_CUSTOM_NODES_PRESET,
                seed: this.options.seed
            }
        ).getObfuscatedCode();
    }
}