Update public source
This commit is contained in:
@@ -1222,6 +1222,8 @@
|
|||||||
step,
|
step,
|
||||||
mask.value,
|
mask.value,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
updateMaskBulkVisibility();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -1340,24 +1342,291 @@
|
|||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getMethodSteps() {
|
||||||
|
return Array.from(
|
||||||
|
stepsContainer.querySelectorAll(
|
||||||
|
"[data-method-step]",
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function getBulkMaskSteps() {
|
||||||
|
return getMethodSteps().filter(
|
||||||
|
(step) =>
|
||||||
|
step.dataset.bulkMaskStep ===
|
||||||
|
"true",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function getStepMask(step) {
|
||||||
|
const maskInput =
|
||||||
|
step.querySelector(
|
||||||
|
'input[name$="_mask"]',
|
||||||
|
);
|
||||||
|
|
||||||
|
return maskInput
|
||||||
|
? maskInput.value.trim()
|
||||||
|
: "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function getStepWorkloadProfile(step) {
|
||||||
|
const workload =
|
||||||
|
step.querySelector(
|
||||||
|
"[data-workload-profile]",
|
||||||
|
);
|
||||||
|
|
||||||
|
return workload
|
||||||
|
? workload.value
|
||||||
|
: "2";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function setStepWorkloadProfile(
|
||||||
|
step,
|
||||||
|
value,
|
||||||
|
) {
|
||||||
|
const workload =
|
||||||
|
step.querySelector(
|
||||||
|
"[data-workload-profile]",
|
||||||
|
);
|
||||||
|
|
||||||
|
if (workload) {
|
||||||
|
workload.value =
|
||||||
|
String(value || "2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function refreshBulkMaskGroup() {
|
||||||
|
const group =
|
||||||
|
document.querySelector(
|
||||||
|
"[data-mask-bulk-group]",
|
||||||
|
);
|
||||||
|
|
||||||
|
const bulkSteps =
|
||||||
|
getBulkMaskSteps();
|
||||||
|
|
||||||
|
if (!group || bulkSteps.length === 0) {
|
||||||
|
if (group) {
|
||||||
|
group.remove();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const firstStep =
|
||||||
|
bulkSteps[0];
|
||||||
|
|
||||||
|
const title =
|
||||||
|
group.querySelector(
|
||||||
|
"[data-mask-bulk-group-title]",
|
||||||
|
);
|
||||||
|
|
||||||
|
const count =
|
||||||
|
group.querySelector(
|
||||||
|
"[data-mask-bulk-group-count]",
|
||||||
|
);
|
||||||
|
|
||||||
|
const list =
|
||||||
|
group.querySelector(
|
||||||
|
"[data-mask-bulk-group-list]",
|
||||||
|
);
|
||||||
|
|
||||||
|
const toggle =
|
||||||
|
group.querySelector(
|
||||||
|
"[data-mask-bulk-group-toggle]",
|
||||||
|
);
|
||||||
|
|
||||||
|
const firstStepTitle =
|
||||||
|
firstStep.querySelector(
|
||||||
|
".method-step-title",
|
||||||
|
);
|
||||||
|
|
||||||
|
const stepNumber =
|
||||||
|
firstStepTitle
|
||||||
|
? firstStepTitle.textContent
|
||||||
|
.replace(
|
||||||
|
/^Step\s+/i,
|
||||||
|
"",
|
||||||
|
)
|
||||||
|
.trim()
|
||||||
|
: "1";
|
||||||
|
|
||||||
|
title.textContent =
|
||||||
|
`Step ${stepNumber} — Mask`;
|
||||||
|
|
||||||
|
count.textContent =
|
||||||
|
`Маски: ${bulkSteps.length}`;
|
||||||
|
|
||||||
|
list.innerHTML = "";
|
||||||
|
|
||||||
|
bulkSteps.forEach(
|
||||||
|
(step) => {
|
||||||
|
const item =
|
||||||
|
document.createElement("li");
|
||||||
|
|
||||||
|
item.textContent =
|
||||||
|
getStepMask(step);
|
||||||
|
|
||||||
|
list.appendChild(item);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
toggle.textContent =
|
||||||
|
group.classList.contains(
|
||||||
|
"is-expanded",
|
||||||
|
)
|
||||||
|
? "Скрыть список"
|
||||||
|
: "Показать список";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function createBulkMaskGroup(
|
||||||
|
bulkSteps,
|
||||||
|
) {
|
||||||
|
const existing =
|
||||||
|
document.querySelector(
|
||||||
|
"[data-mask-bulk-group]",
|
||||||
|
);
|
||||||
|
|
||||||
|
if (existing) {
|
||||||
|
existing.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bulkSteps.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const group =
|
||||||
|
document.createElement("div");
|
||||||
|
|
||||||
|
group.className =
|
||||||
|
"method-step-bulk-group";
|
||||||
|
|
||||||
|
group.dataset.maskBulkGroup =
|
||||||
|
"true";
|
||||||
|
|
||||||
|
group.innerHTML = `
|
||||||
|
<div
|
||||||
|
class="method-step-bulk-group-title"
|
||||||
|
data-mask-bulk-group-title
|
||||||
|
></div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="method-step-bulk-group-mode"
|
||||||
|
>
|
||||||
|
Mode 3
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="method-step-bulk-group-summary"
|
||||||
|
>
|
||||||
|
<strong
|
||||||
|
data-mask-bulk-group-count
|
||||||
|
></strong>
|
||||||
|
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="methods-button-secondary"
|
||||||
|
data-mask-bulk-group-toggle
|
||||||
|
>
|
||||||
|
Показать список
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="method-step-bulk-group-list"
|
||||||
|
data-mask-bulk-group-list
|
||||||
|
>
|
||||||
|
<ol></ol>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
group.querySelector(
|
||||||
|
"[data-mask-bulk-group-toggle]",
|
||||||
|
).addEventListener(
|
||||||
|
"click",
|
||||||
|
() => {
|
||||||
|
group.classList.toggle(
|
||||||
|
"is-expanded",
|
||||||
|
);
|
||||||
|
|
||||||
|
refreshBulkMaskGroup();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
stepsContainer.insertBefore(
|
||||||
|
group,
|
||||||
|
bulkSteps[0],
|
||||||
|
);
|
||||||
|
|
||||||
|
bulkSteps.forEach(
|
||||||
|
(step) => {
|
||||||
|
step.dataset.bulkMaskStep =
|
||||||
|
"true";
|
||||||
|
|
||||||
|
step.classList.add(
|
||||||
|
"method-step-bulk-hidden",
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
refreshBulkMaskGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function updateMaskBulkVisibility() {
|
function updateMaskBulkVisibility() {
|
||||||
const bulk =
|
const bulk =
|
||||||
document.getElementById("mask-bulk");
|
document.getElementById("mask-bulk");
|
||||||
|
|
||||||
const hasMaskMode =
|
const bulkSteps =
|
||||||
Array.from(
|
getBulkMaskSteps();
|
||||||
stepsContainer.querySelectorAll(
|
|
||||||
"[data-attack-mode]",
|
if (bulkSteps.length > 0) {
|
||||||
),
|
addMaskBulkButton.disabled =
|
||||||
).some(
|
false;
|
||||||
(modeSelect) =>
|
|
||||||
modeSelect.value === "3",
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const mode3Steps =
|
||||||
|
getMethodSteps().filter(
|
||||||
|
(step) => {
|
||||||
|
const modeSelect =
|
||||||
|
step.querySelector(
|
||||||
|
"[data-attack-mode]",
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
modeSelect &&
|
||||||
|
modeSelect.value === "3"
|
||||||
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
addMaskBulkButton.disabled =
|
const manualMode3Steps =
|
||||||
!hasMaskMode;
|
mode3Steps.filter(
|
||||||
|
(step) =>
|
||||||
|
getStepMask(step) !== "",
|
||||||
|
);
|
||||||
|
|
||||||
if (!hasMaskMode) {
|
if (manualMode3Steps.length > 0) {
|
||||||
|
addMaskBulkButton.disabled =
|
||||||
|
true;
|
||||||
|
|
||||||
|
bulk.classList.remove(
|
||||||
|
"is-visible",
|
||||||
|
);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
addMaskBulkButton.disabled =
|
||||||
|
mode3Steps.length === 0;
|
||||||
|
|
||||||
|
if (mode3Steps.length === 0) {
|
||||||
bulk.classList.remove(
|
bulk.classList.remove(
|
||||||
"is-visible",
|
"is-visible",
|
||||||
);
|
);
|
||||||
@@ -1368,13 +1637,65 @@
|
|||||||
function addBulkMasks(
|
function addBulkMasks(
|
||||||
masks,
|
masks,
|
||||||
) {
|
) {
|
||||||
|
const methodSteps =
|
||||||
|
getMethodSteps();
|
||||||
|
|
||||||
|
const sourceStep =
|
||||||
|
methodSteps.find(
|
||||||
|
(step) => {
|
||||||
|
const modeSelect =
|
||||||
|
step.querySelector(
|
||||||
|
"[data-attack-mode]",
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
modeSelect &&
|
||||||
|
modeSelect.value === "3"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!sourceStep) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const workloadProfile =
|
||||||
|
getStepWorkloadProfile(
|
||||||
|
sourceStep,
|
||||||
|
);
|
||||||
|
|
||||||
|
const oldBulkSteps =
|
||||||
|
getBulkMaskSteps();
|
||||||
|
|
||||||
|
oldBulkSteps.forEach(
|
||||||
|
(step) => {
|
||||||
|
step.remove();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
const firstStep =
|
||||||
|
sourceStep;
|
||||||
|
|
||||||
|
const bulkSteps = [
|
||||||
|
firstStep,
|
||||||
|
];
|
||||||
|
|
||||||
|
while (
|
||||||
|
bulkSteps.length <
|
||||||
|
masks.length
|
||||||
|
) {
|
||||||
|
bulkSteps.push(
|
||||||
|
addStep(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
masks.forEach(
|
masks.forEach(
|
||||||
(mask) => {
|
(mask, index) => {
|
||||||
const newStep =
|
const step =
|
||||||
addStep();
|
bulkSteps[index];
|
||||||
|
|
||||||
const modeSelect =
|
const modeSelect =
|
||||||
newStep.querySelector(
|
step.querySelector(
|
||||||
"[data-attack-mode]",
|
"[data-attack-mode]",
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -1384,25 +1705,45 @@
|
|||||||
new Event("change"),
|
new Event("change"),
|
||||||
);
|
);
|
||||||
|
|
||||||
const newMask =
|
setStepWorkloadProfile(
|
||||||
newStep.querySelector(
|
step,
|
||||||
|
workloadProfile,
|
||||||
|
);
|
||||||
|
|
||||||
|
const maskInput =
|
||||||
|
step.querySelector(
|
||||||
'input[name$="_mask"]',
|
'input[name$="_mask"]',
|
||||||
);
|
);
|
||||||
|
|
||||||
newMask.value =
|
maskInput.value =
|
||||||
mask;
|
mask;
|
||||||
|
|
||||||
newMask.dispatchEvent(
|
maskInput.dispatchEvent(
|
||||||
new Event(
|
new Event(
|
||||||
"input",
|
"input",
|
||||||
{ bubbles: true },
|
{ bubbles: true },
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
step.dataset.bulkMaskStep =
|
||||||
|
"true";
|
||||||
|
|
||||||
|
step.classList.add(
|
||||||
|
"method-step-bulk-hidden",
|
||||||
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
stepCountInput.value =
|
stepCountInput.value =
|
||||||
stepCount;
|
stepCount;
|
||||||
|
|
||||||
|
rebuildStepNumbers();
|
||||||
|
|
||||||
|
createBulkMaskGroup(
|
||||||
|
bulkSteps,
|
||||||
|
);
|
||||||
|
|
||||||
|
updateMaskBulkVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1420,6 +1761,9 @@
|
|||||||
step.className =
|
step.className =
|
||||||
"method-step";
|
"method-step";
|
||||||
|
|
||||||
|
step.dataset.methodStep =
|
||||||
|
"true";
|
||||||
|
|
||||||
step.dataset.step =
|
step.dataset.step =
|
||||||
currentStepNumber;
|
currentStepNumber;
|
||||||
|
|
||||||
@@ -1618,7 +1962,7 @@
|
|||||||
() => {
|
() => {
|
||||||
|
|
||||||
if (
|
if (
|
||||||
stepsContainer.children.length <= 1
|
getMethodSteps().length <= 1
|
||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1626,6 +1970,7 @@
|
|||||||
step.remove();
|
step.remove();
|
||||||
|
|
||||||
rebuildStepNumbers();
|
rebuildStepNumbers();
|
||||||
|
updateMaskBulkVisibility();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -1666,9 +2011,7 @@
|
|||||||
|
|
||||||
function rebuildStepNumbers() {
|
function rebuildStepNumbers() {
|
||||||
const stepElements =
|
const stepElements =
|
||||||
Array.from(
|
getMethodSteps();
|
||||||
stepsContainer.children,
|
|
||||||
);
|
|
||||||
|
|
||||||
stepCount =
|
stepCount =
|
||||||
stepElements.length;
|
stepElements.length;
|
||||||
@@ -1728,6 +2071,8 @@
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
refreshBulkMaskGroup();
|
||||||
|
|
||||||
stepCountInput.value =
|
stepCountInput.value =
|
||||||
stepCount;
|
stepCount;
|
||||||
}
|
}
|
||||||
@@ -1805,18 +2150,42 @@
|
|||||||
if (addMaskBulkButton.disabled) {
|
if (addMaskBulkButton.disabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const bulk =
|
const bulk =
|
||||||
document.getElementById(
|
document.getElementById(
|
||||||
"mask-bulk",
|
"mask-bulk",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const textarea =
|
||||||
|
bulk.querySelector(
|
||||||
|
"[data-mask-bulk]",
|
||||||
|
);
|
||||||
|
|
||||||
|
const bulkSteps =
|
||||||
|
getBulkMaskSteps();
|
||||||
|
|
||||||
|
if (bulkSteps.length > 0) {
|
||||||
|
textarea.value =
|
||||||
|
bulkSteps
|
||||||
|
.map(
|
||||||
|
(step) =>
|
||||||
|
getStepMask(step),
|
||||||
|
)
|
||||||
|
.join("\n");
|
||||||
|
|
||||||
|
textarea.dispatchEvent(
|
||||||
|
new Event(
|
||||||
|
"input",
|
||||||
|
{ bubbles: true },
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
bulk.classList.add(
|
bulk.classList.add(
|
||||||
"is-visible",
|
"is-visible",
|
||||||
);
|
);
|
||||||
|
|
||||||
bulk.querySelector(
|
textarea.focus();
|
||||||
"[data-mask-bulk]",
|
|
||||||
).focus();
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -1838,6 +2207,31 @@
|
|||||||
} else {
|
} else {
|
||||||
addStep();
|
addStep();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const initialMode3Steps =
|
||||||
|
getMethodSteps().filter(
|
||||||
|
(step) => {
|
||||||
|
const modeSelect =
|
||||||
|
step.querySelector(
|
||||||
|
"[data-attack-mode]",
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
modeSelect &&
|
||||||
|
modeSelect.value === "3" &&
|
||||||
|
getStepMask(step) !== ""
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
if (initialMode3Steps.length > 1) {
|
||||||
|
createBulkMaskGroup(
|
||||||
|
initialMode3Steps,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateMaskBulkVisibility();
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user