mirror of
https://github.com/gchq/CyberChef
synced 2024-11-15 09:07:06 +00:00
Merge branch 'control' of https://github.com/bwhitn/CyberChef into bwhitn-control
This commit is contained in:
commit
b48e940f2d
5 changed files with 87 additions and 31 deletions
|
@ -170,18 +170,14 @@ const FlowControl = {
|
|||
*/
|
||||
runJump: function(state) {
|
||||
let ings = state.opList[state.progress].getIngValues(),
|
||||
jumpNum = ings[0],
|
||||
jmpIndex = FlowControl._getLabelIndex(ings[0], state),
|
||||
maxJumps = ings[1];
|
||||
|
||||
if (jumpNum < 0) {
|
||||
jumpNum--;
|
||||
}
|
||||
|
||||
if (state.numJumps >= maxJumps) {
|
||||
if (state.numJumps >= maxJumps || jmpIndex === -1) {
|
||||
return state;
|
||||
}
|
||||
|
||||
state.progress += jumpNum;
|
||||
state.progress = jmpIndex;
|
||||
state.numJumps++;
|
||||
return state;
|
||||
},
|
||||
|
@ -201,25 +197,48 @@ const FlowControl = {
|
|||
let ings = state.opList[state.progress].getIngValues(),
|
||||
dish = state.dish,
|
||||
regexStr = ings[0],
|
||||
jumpNum = ings[1],
|
||||
maxJumps = ings[2];
|
||||
invert = ings[1],
|
||||
jmpIndex = FlowControl._getLabelIndex(ings[2], state),
|
||||
maxJumps = ings[3];
|
||||
|
||||
if (jumpNum < 0) {
|
||||
jumpNum--;
|
||||
}
|
||||
|
||||
if (state.numJumps >= maxJumps) {
|
||||
if (state.numJumps >= maxJumps || jmpIndex === -1) {
|
||||
return state;
|
||||
}
|
||||
|
||||
if (regexStr !== "" && dish.get(Dish.STRING).search(regexStr) > -1) {
|
||||
state.progress += jumpNum;
|
||||
state.numJumps++;
|
||||
if (regexStr !== "") {
|
||||
let strMatch = dish.get(Dish.STRING).search(regexStr) > -1;
|
||||
if (!invert && strMatch || invert && !strMatch) {
|
||||
state.progress = jmpIndex;
|
||||
state.numJumps++;
|
||||
}
|
||||
}
|
||||
|
||||
return state;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the index of a label.
|
||||
*
|
||||
* @param {Object} state
|
||||
* @param {string} name
|
||||
* @returns {number}
|
||||
*/
|
||||
|
||||
_getLabelIndex: function(name, state) {
|
||||
let index = -1;
|
||||
for (let o = 0; o < state.opList.length; o++) {
|
||||
let operation = state.opList[o];
|
||||
if (operation.getConfig().op === "Label"){
|
||||
let ings = operation.getIngValues();
|
||||
if (name === ings[0]) {
|
||||
index = o;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return index;
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Return operation.
|
||||
|
|
|
@ -320,6 +320,7 @@ const Categories = [
|
|||
"Fork",
|
||||
"Merge",
|
||||
"Register",
|
||||
"Label",
|
||||
"Jump",
|
||||
"Conditional Jump",
|
||||
"Return",
|
||||
|
|
|
@ -143,9 +143,9 @@ const OperationConfig = {
|
|||
flowControl: true,
|
||||
args: [
|
||||
{
|
||||
name: "Number of operations to jump over",
|
||||
type: "number",
|
||||
value: 0
|
||||
name: "The Label to Jump to",
|
||||
type: "string",
|
||||
value: ""
|
||||
},
|
||||
{
|
||||
name: "Maximum jumps (if jumping backwards)",
|
||||
|
@ -167,9 +167,14 @@ const OperationConfig = {
|
|||
value: ""
|
||||
},
|
||||
{
|
||||
name: "Number of operations to jump over if match found",
|
||||
type: "number",
|
||||
value: 0
|
||||
name: "Negative match (logical NOT)",
|
||||
type: "boolean",
|
||||
value: false
|
||||
},
|
||||
{
|
||||
name: "The Label to Jump to",
|
||||
type: "string",
|
||||
value: ""
|
||||
},
|
||||
{
|
||||
name: "Maximum jumps (if jumping backwards)",
|
||||
|
@ -178,6 +183,20 @@ const OperationConfig = {
|
|||
}
|
||||
]
|
||||
},
|
||||
"Label": {
|
||||
module: "Default",
|
||||
description: "Provides a location for for conditional and fixed jumps to jump.",
|
||||
inputType: "string",
|
||||
outputType: "string",
|
||||
flowControl: true,
|
||||
args: [
|
||||
{
|
||||
name: "Jump Label",
|
||||
type: "string",
|
||||
value: ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"Return": {
|
||||
module: "Default",
|
||||
description: "End execution of operations at this point in the recipe.",
|
||||
|
|
|
@ -151,6 +151,7 @@ OpModules.Default = {
|
|||
"Fork": FlowControl.runFork,
|
||||
"Merge": FlowControl.runMerge,
|
||||
"Register": FlowControl.runRegister,
|
||||
"Label": FlowControl.runComment,
|
||||
"Jump": FlowControl.runJump,
|
||||
"Conditional Jump": FlowControl.runCondJump,
|
||||
"Return": FlowControl.runReturn,
|
||||
|
|
|
@ -60,14 +60,15 @@ TestRegister.addTests([
|
|||
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", "2", "10"]},
|
||||
{"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: skips 0",
|
||||
name: "Jump: Empty Label",
|
||||
input: [
|
||||
"should be changed",
|
||||
].join("\n"),
|
||||
|
@ -77,7 +78,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "Jump",
|
||||
args: [0, 10],
|
||||
args: ["", 10],
|
||||
},
|
||||
{
|
||||
op: "Find / Replace",
|
||||
|
@ -105,7 +106,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "Jump",
|
||||
args: [1, 10],
|
||||
args: ["skipReplace", 10],
|
||||
},
|
||||
{
|
||||
op: "Find / Replace",
|
||||
|
@ -120,6 +121,10 @@ TestRegister.addTests([
|
|||
true,
|
||||
],
|
||||
},
|
||||
{
|
||||
op: "Label",
|
||||
args: ["skipReplace"]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
@ -137,7 +142,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "Conditional Jump",
|
||||
args: ["match", 0, 0],
|
||||
args: ["match", false, "", 0],
|
||||
},
|
||||
{
|
||||
op: "Find / Replace",
|
||||
|
@ -212,7 +217,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "Conditional Jump",
|
||||
args: ["match", 1, 10],
|
||||
args: ["match", false, "skip match", 10],
|
||||
},
|
||||
{
|
||||
op: "Find / Replace",
|
||||
|
@ -227,6 +232,9 @@ TestRegister.addTests([
|
|||
true,
|
||||
],
|
||||
},
|
||||
{
|
||||
op: "Label", args: ["skip match"],
|
||||
},
|
||||
{
|
||||
op: "Find / Replace",
|
||||
args: [
|
||||
|
@ -251,9 +259,13 @@ TestRegister.addTests([
|
|||
"replaced",
|
||||
].join("\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Label",
|
||||
args: ["back to the beginning"],
|
||||
},
|
||||
{
|
||||
op: "Jump",
|
||||
args: [1],
|
||||
args: ["skip replace"],
|
||||
},
|
||||
{
|
||||
op: "Find / Replace",
|
||||
|
@ -268,9 +280,13 @@ TestRegister.addTests([
|
|||
true,
|
||||
],
|
||||
},
|
||||
{
|
||||
op: "Label",
|
||||
args: ["skip replace"],
|
||||
},
|
||||
{
|
||||
op: "Conditional Jump",
|
||||
args: ["match", -2, 10],
|
||||
args: ["match", false, "back to the beginning", 10],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
|
Loading…
Reference in a new issue