add Merge (without Fork). Add flowcontrol setter to Operation

This commit is contained in:
d98762625 2018-05-18 12:38:37 +01:00
parent 72d943aca2
commit bca73b496f
5 changed files with 353 additions and 298 deletions

View File

@ -274,6 +274,15 @@ class Operation {
return this._flowControl;
}
/**
* Set whether this Operation is a flowcontrol op.
*
* @param {boolean} value
*/
set flowControl(value) {
this._flowControl = !!value;
}
}
export default Operation;

View File

@ -0,0 +1,46 @@
/**
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2018
* @license Apache-2.0
*/
import Operation from "../Operation";
/**
* Merge operation
*/
class Merge extends Operation {
/**
* Merge constructor
*/
constructor() {
super();
this.name = "Merge";
this.flowControl = true;
this.module = "Default";
this.description = "Consolidate all branches back into a single trunk. The opposite of Fork.";
this.inputType = "string";
this.outputType = "string";
this.args = [];
}
/**
* Merge operation.
*
* @param {Object} state - The current state of the recipe.
* @param {number} state.progress - The current position in the recipe.
* @param {Dish} state.dish - The Dish being operated on.
* @param {Operation[]} state.opList - The list of operations in the recipe.
* @returns {Object} The updated state of the recipe.
*/
run(state) {
// No need to actually do anything here. The fork operation will
// merge when it sees this operation.
return state;
}
}
export default Merge;

View File

@ -23,7 +23,7 @@ class Register extends Operation {
this.module = "Default";
this.description = "Extract data from the input and store it in registers which can then be passed into subsequent operations as arguments. Regular expression capture groups are used to select the data to extract.<br><br>To use registers in arguments, refer to them using the notation <code>$Rn</code> where n is the register number, starting at 0.<br><br>For example:<br>Input: <code>Test</code><br>Extractor: <code>(.*)</code><br>Argument: <code>$R0</code> becomes <code>Test</code><br><br>Registers can be escaped in arguments using a backslash. e.g. <code>\\$R0</code> would become <code>$R0</code> rather than <code>Test</code>.";
this.inputType = "string";
this.outputType = "string";g
this.outputType = "string";
this.args = [
{
"name": "Extractor",

View File

@ -38,7 +38,7 @@ import "./tests/operations/Checksum";
// import "./tests/operations/Compress";
// import "./tests/operations/Crypt";
// import "./tests/operations/DateTime";
// import "./tests/operations/FlowControl";
import "./tests/operations/FlowControl";
import "./tests/operations/Hash";
import "./tests/operations/Hexdump";
// import "./tests/operations/Image";

View File

@ -28,287 +28,287 @@ const ALL_BYTES = [
].join("");
TestRegister.addTests([
{
name: "Fork: nothing",
input: "",
expectedOutput: "",
recipeConfig: [
{
op: "Fork",
args: ["\n", "\n", false],
},
],
},
{
name: "Fork, Merge: nothing",
input: "",
expectedOutput: "",
recipeConfig: [
{
op: "Fork",
args: ["\n", "\n", false],
},
{
op: "Merge",
args: [],
},
],
},
{
name: "Fork, (expect) Error, Merge",
input: "1.1\n2.5\na\n3.4",
expectedError: true,
recipeConfig: [
{
op: "Fork",
args: ["\n", "\n", false],
},
{
op: "Object Identifier to Hex",
args: [],
},
{
op: "Merge",
args: [],
},
],
},
{
name: "Fork, Conditional Jump, Encodings",
input: "Some data with a 1 in it\nSome data with a 2 in it",
expectedOutput: "U29tZSBkYXRhIHdpdGggYSAxIGluIGl0\n53 6f 6d 65 20 64 61 74 61 20 77 69 74 68 20 61 20 32 20 69 6e 20 69 74\n",
recipeConfig: [
{"op": "Fork", "args": ["\\n", "\\n", false]},
{"op": "Conditional Jump", "args": ["1", false, "skipReturn", "10"]},
{"op": "To Hex", "args": ["Space"]},
{"op": "Return", "args": []},
{"op": "Label", "args": ["skipReturn"]},
{"op": "To Base64", "args": ["A-Za-z0-9+/="]}
]
},
{
name: "Jump: Empty Label",
input: [
"should be changed",
].join("\n"),
expectedOutput: [
"should be changed was changed",
].join("\n"),
recipeConfig: [
{
op: "Jump",
args: ["", 10],
},
{
op: "Find / Replace",
args: [
{
"option": "Regex",
"string": "should be changed"
},
"should be changed was changed",
true,
true,
true,
],
},
],
},
{
name: "Jump: skips 1",
input: [
"shouldnt be changed",
].join("\n"),
expectedOutput: [
"shouldnt be changed",
].join("\n"),
recipeConfig: [
{
op: "Jump",
args: ["skipReplace", 10],
},
{
op: "Find / Replace",
args: [
{
"option": "Regex",
"string": "shouldnt be changed"
},
"shouldnt be changed was changed",
true,
true,
true,
],
},
{
op: "Label",
args: ["skipReplace"]
},
],
},
{
name: "Conditional Jump: Skips 0",
input: [
"match",
"should be changed 1",
"should be changed 2",
].join("\n"),
expectedOutput: [
"match",
"should be changed 1 was changed",
"should be changed 2 was changed"
].join("\n"),
recipeConfig: [
{
op: "Conditional Jump",
args: ["match", false, "", 0],
},
{
op: "Find / Replace",
args: [
{
"option": "Regex",
"string": "should be changed 1"
},
"should be changed 1 was changed",
true,
true,
true,
],
},
{
op: "Find / Replace",
args: [
{
"option": "Regex",
"string": "should be changed 2"
},
"should be changed 2 was changed",
true,
true,
true,
],
},
],
},
{
name: "Comment: nothing",
input: "",
expectedOutput: "",
recipeConfig: [
{
"op": "Comment",
"args": [""]
}
]
},
{
name: "Fork, Comment, Base64",
input: "cat\nsat\nmat",
expectedOutput: "Y2F0\nc2F0\nbWF0\n",
recipeConfig: [
{
"op": "Fork",
"args": ["\\n", "\\n", false]
},
{
"op": "Comment",
"args": ["Testing 123"]
},
{
"op": "To Base64",
"args": ["A-Za-z0-9+/="]
}
]
},
{
name: "Conditional Jump: Skips 1",
input: [
"match",
"should not be changed",
"should be changed",
].join("\n"),
expectedOutput: [
"match",
"should not be changed",
"should be changed was changed"
].join("\n"),
recipeConfig: [
{
op: "Conditional Jump",
args: ["match", false, "skip match", 10],
},
{
op: "Find / Replace",
args: [
{
"option": "Regex",
"string": "should not be changed"
},
"should not be changed was changed",
true,
true,
true,
],
},
{
op: "Label", args: ["skip match"],
},
{
op: "Find / Replace",
args: [
{
"option": "Regex",
"string": "should be changed"
},
"should be changed was changed",
true,
true,
true,
],
},
],
},
{
name: "Conditional Jump: Skips backwards",
input: [
"match",
].join("\n"),
expectedOutput: [
"replaced",
].join("\n"),
recipeConfig: [
{
op: "Label",
args: ["back to the beginning"],
},
{
op: "Jump",
args: ["skip replace"],
},
{
op: "Find / Replace",
args: [
{
"option": "Regex",
"string": "match"
},
"replaced",
true,
true,
true,
],
},
{
op: "Label",
args: ["skip replace"],
},
{
op: "Conditional Jump",
args: ["match", false, "back to the beginning", 10],
},
],
},
// {
// name: "Fork: nothing",
// input: "",
// expectedOutput: "",
// recipeConfig: [
// {
// op: "Fork",
// args: ["\n", "\n", false],
// },
// ],
// },
// {
// name: "Fork, Merge: nothing",
// input: "",
// expectedOutput: "",
// recipeConfig: [
// {
// op: "Fork",
// args: ["\n", "\n", false],
// },
// {
// op: "Merge",
// args: [],
// },
// ],
// },
// {
// name: "Fork, (expect) Error, Merge",
// input: "1.1\n2.5\na\n3.4",
// expectedError: true,
// recipeConfig: [
// {
// op: "Fork",
// args: ["\n", "\n", false],
// },
// {
// op: "Object Identifier to Hex",
// args: [],
// },
// {
// op: "Merge",
// args: [],
// },
// ],
// },
// {
// name: "Fork, Conditional Jump, Encodings",
// input: "Some data with a 1 in it\nSome data with a 2 in it",
// expectedOutput: "U29tZSBkYXRhIHdpdGggYSAxIGluIGl0\n53 6f 6d 65 20 64 61 74 61 20 77 69 74 68 20 61 20 32 20 69 6e 20 69 74\n",
// recipeConfig: [
// {"op": "Fork", "args": ["\\n", "\\n", false]},
// {"op": "Conditional Jump", "args": ["1", false, "skipReturn", "10"]},
// {"op": "To Hex", "args": ["Space"]},
// {"op": "Return", "args": []},
// {"op": "Label", "args": ["skipReturn"]},
// {"op": "To Base64", "args": ["A-Za-z0-9+/="]}
// ]
// },
// {
// name: "Jump: Empty Label",
// input: [
// "should be changed",
// ].join("\n"),
// expectedOutput: [
// "should be changed was changed",
// ].join("\n"),
// recipeConfig: [
// {
// op: "Jump",
// args: ["", 10],
// },
// {
// op: "Find / Replace",
// args: [
// {
// "option": "Regex",
// "string": "should be changed"
// },
// "should be changed was changed",
// true,
// true,
// true,
// ],
// },
// ],
// },
// {
// name: "Jump: skips 1",
// input: [
// "shouldnt be changed",
// ].join("\n"),
// expectedOutput: [
// "shouldnt be changed",
// ].join("\n"),
// recipeConfig: [
// {
// op: "Jump",
// args: ["skipReplace", 10],
// },
// {
// op: "Find / Replace",
// args: [
// {
// "option": "Regex",
// "string": "shouldnt be changed"
// },
// "shouldnt be changed was changed",
// true,
// true,
// true,
// ],
// },
// {
// op: "Label",
// args: ["skipReplace"]
// },
// ],
// },
// {
// name: "Conditional Jump: Skips 0",
// input: [
// "match",
// "should be changed 1",
// "should be changed 2",
// ].join("\n"),
// expectedOutput: [
// "match",
// "should be changed 1 was changed",
// "should be changed 2 was changed"
// ].join("\n"),
// recipeConfig: [
// {
// op: "Conditional Jump",
// args: ["match", false, "", 0],
// },
// {
// op: "Find / Replace",
// args: [
// {
// "option": "Regex",
// "string": "should be changed 1"
// },
// "should be changed 1 was changed",
// true,
// true,
// true,
// ],
// },
// {
// op: "Find / Replace",
// args: [
// {
// "option": "Regex",
// "string": "should be changed 2"
// },
// "should be changed 2 was changed",
// true,
// true,
// true,
// ],
// },
// ],
// },
// {
// name: "Comment: nothing",
// input: "",
// expectedOutput: "",
// recipeConfig: [
// {
// "op": "Comment",
// "args": [""]
// }
// ]
// },
// {
// name: "Fork, Comment, Base64",
// input: "cat\nsat\nmat",
// expectedOutput: "Y2F0\nc2F0\nbWF0\n",
// recipeConfig: [
// {
// "op": "Fork",
// "args": ["\\n", "\\n", false]
// },
// {
// "op": "Comment",
// "args": ["Testing 123"]
// },
// {
// "op": "To Base64",
// "args": ["A-Za-z0-9+/="]
// }
// ]
// },
// {
// name: "Conditional Jump: Skips 1",
// input: [
// "match",
// "should not be changed",
// "should be changed",
// ].join("\n"),
// expectedOutput: [
// "match",
// "should not be changed",
// "should be changed was changed"
// ].join("\n"),
// recipeConfig: [
// {
// op: "Conditional Jump",
// args: ["match", false, "skip match", 10],
// },
// {
// op: "Find / Replace",
// args: [
// {
// "option": "Regex",
// "string": "should not be changed"
// },
// "should not be changed was changed",
// true,
// true,
// true,
// ],
// },
// {
// op: "Label", args: ["skip match"],
// },
// {
// op: "Find / Replace",
// args: [
// {
// "option": "Regex",
// "string": "should be changed"
// },
// "should be changed was changed",
// true,
// true,
// true,
// ],
// },
// ],
// },
// {
// name: "Conditional Jump: Skips backwards",
// input: [
// "match",
// ].join("\n"),
// expectedOutput: [
// "replaced",
// ].join("\n"),
// recipeConfig: [
// {
// op: "Label",
// args: ["back to the beginning"],
// },
// {
// op: "Jump",
// args: ["skip replace"],
// },
// {
// op: "Find / Replace",
// args: [
// {
// "option": "Regex",
// "string": "match"
// },
// "replaced",
// true,
// true,
// true,
// ],
// },
// {
// op: "Label",
// args: ["skip replace"],
// },
// {
// op: "Conditional Jump",
// args: ["match", false, "back to the beginning", 10],
// },
// ],
// },
{
name: "Register: RC4 key",
input: "http://malwarez.biz/beacon.php?key=0e932a5c&data=8db7d5ebe38663a54ecbb334e3db11",
@ -373,19 +373,19 @@ TestRegister.addTests([
}
]
},
{
name: "Label, Comment: Complex content",
input: ALL_BYTES,
expectedOutput: ALL_BYTES,
recipeConfig: [
{
op: "Label",
args: [""]
},
{
op: "Comment",
args: [""]
}
]
},
// {
// name: "Label, Comment: Complex content",
// input: ALL_BYTES,
// expectedOutput: ALL_BYTES,
// recipeConfig: [
// {
// op: "Label",
// args: [""]
// },
// {
// op: "Comment",
// args: [""]
// }
// ]
// },
]);