diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 42176999..f0fb2ced 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -158,6 +158,8 @@ jobs: run: python scripts/outbound_scope_regression.py build/Src/App/Release/NullockApp.exe - name: control API and Repeater responsiveness run: python scripts/control_responsiveness_regression.py build/Src/App/Release/NullockApp.exe + - name: native Repeater Send and Stop controls + run: python scripts/native_repeater_controls_test.py - name: workspace crash recovery run: python scripts/workspace_recovery_regression.py build/Src/App/Release/NullockApp.exe - name: authenticated scanner regression diff --git a/CHANGELOG.md b/CHANGELOG.md index bf019e48..496f98e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,14 @@ developer-facing record. ## [Unreleased] +### Native Repeater responsiveness +- Run native-window sends on the existing background worker. Show Send/Stop + progress and disable Send/Clear while the request is active. +- Copy the visible target fields before sending, reject blank hosts and ports + outside 1–65535, and expose the pending cancellation state to QML. +- Stop prevents further redirects after the current response or transport + timeout. Immediate socket cancellation and simultaneous sends remain open work. + ### Reflected HTML context handling - Keep HTML template contents inert, including nested templates and apparent closing tags inside raw text, comments or attributes. diff --git a/Src/App/app.qml b/Src/App/app.qml index 871f89bc..af63cd50 100644 --- a/Src/App/app.qml +++ b/Src/App/app.qml @@ -675,6 +675,7 @@ ApplicationWindow { spacing: 8 HeaderCell { text: "Target" } TextField { + id: repeaterHostField Layout.preferredWidth: 280 placeholderText: "host" text: repeater.host @@ -686,8 +687,10 @@ ApplicationWindow { } HeaderCell { text: ":" } TextField { + id: repeaterPortField Layout.preferredWidth: 80 text: "" + repeater.port + validator: IntValidator { bottom: 1; top: 65535; locale: "C" } color: root.text font.family: "Consolas" font.pixelSize: 12 @@ -701,11 +704,32 @@ ApplicationWindow { Item { Layout.fillWidth: true } Cell { text: repeater.statusLine; color: root.accent; Layout.preferredWidth: 200 } AccentButton { - label: repeater.busy ? "..." : "Send" - onClicked: repeater.send() + label: repeater.cancelling ? "Stopping..." : "Stop" + visible: repeater.busy + enabled: !repeater.cancelling + opacity: enabled ? 1 : 0.5 + onClicked: repeater.cancel() + ToolTip.visible: stopHover.hovered + ToolTip.text: "Stops after the current response or transport timeout; skips further redirects." + HoverHandler { id: stopHover } + } + AccentButton { + label: repeater.busy ? "Sending..." : "Send" + enabled: !repeater.busy && repeaterHostField.text.trim().length > 0 + && repeaterPortField.acceptableInput && repeater.requestText.length > 0 + opacity: enabled ? 1 : 0.5 + onClicked: { + // Rectangle buttons do not necessarily take focus from a field. + // Commit the visible target before copying it into the worker. + repeater.host = repeaterHostField.text.trim() + repeater.port = Number(repeaterPortField.text) + repeater.sendAsync() + } } AccentButton { label: "Clear" + enabled: !repeater.busy + opacity: enabled ? 1 : 0.5 onClicked: repeater.clear() } } diff --git a/Src/Core/Networking/repeater.hpp b/Src/Core/Networking/repeater.hpp index 636d873f..2eb33e24 100644 --- a/Src/Core/Networking/repeater.hpp +++ b/Src/Core/Networking/repeater.hpp @@ -90,6 +90,7 @@ class Repeater : public QObject { Q_PROPERTY(qint64 elapsedMs READ elapsedMs NOTIFY responseChanged) Q_PROPERTY(int responseBytes READ responseBytes NOTIFY responseChanged) Q_PROPERTY(bool busy READ busy NOTIFY busyChanged) + Q_PROPERTY(bool cancelling READ cancelling NOTIFY busyChanged) Q_PROPERTY(int activeTab READ activeTab NOTIFY tabsChanged) Q_PROPERTY(int tabCount READ tabCount NOTIFY tabsChanged) // Recompute Content-Length from the actual body before each send (Burp's diff --git a/docs/changelog.html b/docs/changelog.html index 93189ac0..0e952b08 100644 --- a/docs/changelog.html +++ b/docs/changelog.html @@ -52,12 +52,13 @@

What shipped

The development build includes corrected security checks, certificate-cache validation and Repeater CLI fixes; v3.7.0 remains the latest public release, and the v3.8.0 notes below are a draft.