mirror of
https://github.com/gchq/CyberChef.git
synced 2024-11-02 14:11:02 +01:00
Multiple Register operations can now be called in a single recipe
This commit is contained in:
parent
e2ac297102
commit
877ab57f0a
@ -92,7 +92,7 @@ async function bake(data) {
|
|||||||
} catch (err) {
|
} catch (err) {
|
||||||
self.postMessage({
|
self.postMessage({
|
||||||
action: "bakeError",
|
action: "bakeError",
|
||||||
data: err.message
|
data: err.message.split(":").slice(1).join(":").slice(1) // Cut off worker blurb
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -182,13 +182,15 @@ self.setOption = function(option, value) {
|
|||||||
* Send register values back to the app.
|
* Send register values back to the app.
|
||||||
*
|
*
|
||||||
* @param {number} opIndex
|
* @param {number} opIndex
|
||||||
|
* @param {number} numPrevRegisters
|
||||||
* @param {string[]} registers
|
* @param {string[]} registers
|
||||||
*/
|
*/
|
||||||
self.setRegisters = function(opIndex, registers) {
|
self.setRegisters = function(opIndex, numPrevRegisters, registers) {
|
||||||
self.postMessage({
|
self.postMessage({
|
||||||
action: "setRegisters",
|
action: "setRegisters",
|
||||||
data: {
|
data: {
|
||||||
opIndex: opIndex,
|
opIndex: opIndex,
|
||||||
|
numPrevRegisters: numPrevRegisters,
|
||||||
registers: registers
|
registers: registers
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -116,7 +116,7 @@ const FlowControl = {
|
|||||||
if (!registers) return state;
|
if (!registers) return state;
|
||||||
|
|
||||||
if (ENVIRONMENT_IS_WORKER()) {
|
if (ENVIRONMENT_IS_WORKER()) {
|
||||||
self.setRegisters(state.progress, registers.slice(1));
|
self.setRegisters(state.progress, state.numRegisters, registers.slice(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -127,31 +127,34 @@ const FlowControl = {
|
|||||||
*/
|
*/
|
||||||
function replaceRegister(str) {
|
function replaceRegister(str) {
|
||||||
// Replace references to registers ($Rn) with contents of registers
|
// Replace references to registers ($Rn) with contents of registers
|
||||||
str = str.replace(/((?:^|[^\\])(?:\\.|[^\\])*?)\$R(\d{1,2})/g, (match, pre, regNum) => {
|
str = str ? str.replace(/((?:^|[^\\])(?:\\.|[^\\])*?)\$R(\d{1,2})/g, (match, pre, regNum) => {
|
||||||
const index = parseInt(regNum, 10) + 1;
|
const index = parseInt(regNum, 10) + 1;
|
||||||
return (index >= registers.length) ? match : pre + registers[index];
|
return (index <= state.numRegisters || index >= state.numRegisters + registers.length) ?
|
||||||
});
|
match : pre + registers[index - state.numRegisters];
|
||||||
|
}) : str;
|
||||||
|
|
||||||
// Unescape remaining register references
|
// Unescape remaining register references
|
||||||
return str.replace(/\\\$R(\d{1,2})/, "$R$1");
|
return str ? str.replace(/\\\$R(\d{1,2})/, "$R$1") : str;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step through all subsequent ops and replace registers in args with extracted content
|
// Step through all subsequent ops and replace registers in args with extracted content
|
||||||
for (let i = state.progress + 1; i < state.opList.length; i++) {
|
for (let i = state.progress + 1; i < state.opList.length; i++) {
|
||||||
|
if (state.opList[i].isDisabled()) continue;
|
||||||
|
|
||||||
let args = state.opList[i].getIngValues();
|
let args = state.opList[i].getIngValues();
|
||||||
args = args.map(arg => {
|
args = args.map(arg => {
|
||||||
if (typeof arg !== "string" && typeof arg !== "object") return arg;
|
if (typeof arg !== "string" && typeof arg !== "object") return arg;
|
||||||
|
|
||||||
if (typeof arg === "object" && arg.string) {
|
if (typeof arg === "object" && arg.hasOwnProperty("string")) {
|
||||||
arg.string = replaceRegister(arg.string);
|
arg.string = replaceRegister(arg.string);
|
||||||
return arg;
|
return arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
return replaceRegister(arg);
|
return replaceRegister(arg);
|
||||||
});
|
});
|
||||||
state.opList[i].setIngValues(args);
|
state.opList[i].setIngValues(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state.numRegisters += registers.length - 1;
|
||||||
return state;
|
return state;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ Recipe.prototype.lastOpIndex = function(startIndex) {
|
|||||||
*/
|
*/
|
||||||
Recipe.prototype.execute = async function(dish, startFrom) {
|
Recipe.prototype.execute = async function(dish, startFrom) {
|
||||||
startFrom = startFrom || 0;
|
startFrom = startFrom || 0;
|
||||||
let op, input, output, numJumps = 0;
|
let op, input, output, numJumps = 0, numRegisters = 0;
|
||||||
|
|
||||||
for (let i = startFrom; i < this.opList.length; i++) {
|
for (let i = startFrom; i < this.opList.length; i++) {
|
||||||
op = this.opList[i];
|
op = this.opList[i];
|
||||||
@ -162,15 +162,17 @@ Recipe.prototype.execute = async function(dish, startFrom) {
|
|||||||
if (op.isFlowControl()) {
|
if (op.isFlowControl()) {
|
||||||
// Package up the current state
|
// Package up the current state
|
||||||
let state = {
|
let state = {
|
||||||
"progress": i,
|
"progress": i,
|
||||||
"dish": dish,
|
"dish": dish,
|
||||||
"opList": this.opList,
|
"opList": this.opList,
|
||||||
"numJumps": numJumps
|
"numJumps": numJumps,
|
||||||
|
"numRegisters": numRegisters
|
||||||
};
|
};
|
||||||
|
|
||||||
state = await op.run(state);
|
state = await op.run(state);
|
||||||
i = state.progress;
|
i = state.progress;
|
||||||
numJumps = state.numJumps;
|
numJumps = state.numJumps;
|
||||||
|
numRegisters = state.numRegisters;
|
||||||
} else {
|
} else {
|
||||||
output = await op.run(input, op.getIngValues());
|
output = await op.run(input, op.getIngValues());
|
||||||
dish.set(output, op.outputType);
|
dish.set(output, op.outputType);
|
||||||
|
@ -441,18 +441,19 @@ RecipeWaiter.prototype.opRemove = function(e) {
|
|||||||
* Sets register values.
|
* Sets register values.
|
||||||
*
|
*
|
||||||
* @param {number} opIndex
|
* @param {number} opIndex
|
||||||
|
* @param {number} numPrevRegisters
|
||||||
* @param {string[]} registers
|
* @param {string[]} registers
|
||||||
*/
|
*/
|
||||||
RecipeWaiter.prototype.setRegisters = function(opIndex, registers) {
|
RecipeWaiter.prototype.setRegisters = function(opIndex, numPrevRegisters, registers) {
|
||||||
const op = document.querySelector(`#rec-list .operation:nth-child(${opIndex + 1})`),
|
const op = document.querySelector(`#rec-list .operation:nth-child(${opIndex + 1})`),
|
||||||
prevRegList = op.querySelector(".register-list");
|
prevRegList = op.querySelector(".register-list");
|
||||||
|
|
||||||
// Remove previous div
|
// Remove previous div
|
||||||
if (prevRegList) prevRegList.remove();
|
if (prevRegList) prevRegList.remove();
|
||||||
|
window.Utils = Utils;
|
||||||
let registerList = [];
|
let registerList = [];
|
||||||
for (let i = 0; i < registers.length; i++) {
|
for (let i = 0; i < registers.length; i++) {
|
||||||
registerList.push(`$R${i} = ${Utils.truncate(Utils.printable(registers[i]), 100)}`);
|
registerList.push(`$R${numPrevRegisters + i} = ${Utils.escapeHtml(Utils.truncate(Utils.printable(registers[i]), 100))}`);
|
||||||
}
|
}
|
||||||
const registerListEl = `<div class="register-list">
|
const registerListEl = `<div class="register-list">
|
||||||
${registerList.join("<br>")}
|
${registerList.join("<br>")}
|
||||||
|
@ -62,7 +62,7 @@ WorkerWaiter.prototype.handleChefMessage = function(e) {
|
|||||||
this.app.options[r.data.option] = r.data.value;
|
this.app.options[r.data.option] = r.data.value;
|
||||||
break;
|
break;
|
||||||
case "setRegisters":
|
case "setRegisters":
|
||||||
this.manager.recipe.setRegisters(r.data.opIndex, r.data.registers);
|
this.manager.recipe.setRegisters(r.data.opIndex, r.data.numPrevRegisters, r.data.registers);
|
||||||
break;
|
break;
|
||||||
case "highlightsCalculated":
|
case "highlightsCalculated":
|
||||||
this.manager.highlighter.displayHighlights(r.data.pos, r.data.direction);
|
this.manager.highlighter.displayHighlights(r.data.pos, r.data.direction);
|
||||||
|
@ -201,3 +201,13 @@ button.dropdown-toggle {
|
|||||||
background-color: var(--disabled-bg-colour) !important;
|
background-color: var(--disabled-bg-colour) !important;
|
||||||
border-color: var(--disabled-border-colour) !important;
|
border-color: var(--disabled-border-colour) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.break .register-list {
|
||||||
|
color: var(--fc-breakpoint-operation-font-colour) !important;
|
||||||
|
background-color: var(--fc-breakpoint-operation-border-colour) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.disabled .register-list {
|
||||||
|
color: var(--disabled-font-colour) !important;
|
||||||
|
background-color: var(--disabled-border-colour) !important;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user