mirror of
https://github.com/elicpeter/nyx.git
synced 2026-06-18 20:15:14 +02:00
[pitboss/grind] deferred session-0011 (20260516T052512Z-20f8)
This commit is contained in:
parent
c162c638a2
commit
d126f3c15c
15 changed files with 510 additions and 10 deletions
|
|
@ -75,12 +75,17 @@ impl LangEmitter for PhpEmitter {
|
|||
|
||||
/// Phase 26 — PHP chain-step harness.
|
||||
///
|
||||
/// Emits a `step.php` script that reads `NYX_PREV_OUTPUT` via
|
||||
/// `getenv()` and forwards it on stdout. The PHP probe shim is kept
|
||||
/// outside the chain step for now and wired in alongside the Phase 15
|
||||
/// emitter follow-up about probe shim splicing.
|
||||
/// Splices the PHP probe shim ([`probe_shim`]) in front of a minimal
|
||||
/// driver that reads `NYX_PREV_OUTPUT` via `getenv()` and forwards it
|
||||
/// on stdout. The composite re-verifier swaps the trailing forward for
|
||||
/// the next member's payload-injection prologue when running a
|
||||
/// multi-step chain; the shim has to be in the same file so a chain
|
||||
/// step that terminates at a sink can also drive the `__nyx_probe`
|
||||
/// channel.
|
||||
fn chain_step(prev_output: Option<&[u8]>) -> ChainStepHarness {
|
||||
let source = "<?php\n$prev = getenv(\"NYX_PREV_OUTPUT\");\nif ($prev === false) { $prev = \"\"; }\necho $prev;\n".to_owned();
|
||||
let shim = probe_shim();
|
||||
let driver = "$prev = getenv(\"NYX_PREV_OUTPUT\");\nif ($prev === false) { $prev = \"\"; }\necho $prev;\n";
|
||||
let source = format!("<?php\n{shim}\n{driver}");
|
||||
ChainStepHarness {
|
||||
source,
|
||||
filename: "step.php".to_owned(),
|
||||
|
|
@ -712,4 +717,27 @@ mod tests {
|
|||
"install_crash_guard ordering wrong: payload_pos={payload_pos} install_pos={install_pos} invoke_pos={invoke_pos}",
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn chain_step_splices_probe_shim_for_composite_reverify() {
|
||||
let step = chain_step(Some(b"<prev>"));
|
||||
assert!(
|
||||
step.source.contains("__nyx_probe"),
|
||||
"PHP chain step must splice the probe shim"
|
||||
);
|
||||
assert!(
|
||||
step.source.starts_with("<?php"),
|
||||
"PHP chain step must open with <?php"
|
||||
);
|
||||
assert!(
|
||||
step.source.contains("getenv(\"NYX_PREV_OUTPUT\")"),
|
||||
"PHP chain step must keep its NYX_PREV_OUTPUT forwarder"
|
||||
);
|
||||
let shim_pos = step.source.find("__nyx_probe").unwrap();
|
||||
let driver_pos = step.source.find("getenv(\"NYX_PREV_OUTPUT\")").unwrap();
|
||||
assert!(
|
||||
shim_pos < driver_pos,
|
||||
"probe shim must come before the driver so the shim's helpers are in scope when a sink rewrite splices in"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -362,6 +362,26 @@ def __nyx_install_crash_guard(sink_callee):
|
|||
signal.signal(s, _handler)
|
||||
except (OSError, ValueError):
|
||||
pass
|
||||
|
||||
# Phase 10 (Track D.3) stub helpers. When the verifier spawned a SqlStub it
|
||||
# publishes the queries-log path through NYX_SQL_LOG; a sink call site that
|
||||
# wants the host-side stub to see its query appends one record-per-call. The
|
||||
# helper is a no-op when NYX_SQL_LOG is unset so the same fixture source still
|
||||
# runs under harness modes that didn't spawn a stub.
|
||||
def __nyx_stub_sql_record(query, **detail):
|
||||
import os
|
||||
p = os.environ.get("NYX_SQL_LOG")
|
||||
if not p:
|
||||
return
|
||||
try:
|
||||
with open(p, "a") as _f:
|
||||
for k, v in detail.items():
|
||||
_f.write('# %s: %s\n' % (str(k), str(v)))
|
||||
_f.write(str(query))
|
||||
if not str(query).endswith('\n'):
|
||||
_f.write('\n')
|
||||
except OSError:
|
||||
pass
|
||||
"#
|
||||
}
|
||||
|
||||
|
|
@ -1207,6 +1227,19 @@ mod tests {
|
|||
assert!(harness.source.contains("NYX_PROBE_PATH"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn probe_shim_publishes_stub_sql_recorder() {
|
||||
let shim = probe_shim();
|
||||
assert!(
|
||||
shim.contains("def __nyx_stub_sql_record"),
|
||||
"Python probe shim must define __nyx_stub_sql_record"
|
||||
);
|
||||
assert!(
|
||||
shim.contains("NYX_SQL_LOG"),
|
||||
"stub recorder must read NYX_SQL_LOG"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn shape_detect_flask() {
|
||||
let src = "from flask import Flask\napp = Flask(__name__)\n@app.route('/')\ndef index():\n pass\n";
|
||||
|
|
|
|||
|
|
@ -71,8 +71,16 @@ impl LangEmitter for RubyEmitter {
|
|||
}
|
||||
|
||||
/// Phase 26 — Ruby chain-step harness.
|
||||
///
|
||||
/// Splices the Ruby probe shim ([`probe_shim`]) in front of a minimal
|
||||
/// driver that reads `NYX_PREV_OUTPUT` from `ENV` and forwards it on
|
||||
/// stdout. Mirrors the Python / Node steps: a step that terminates at
|
||||
/// a sink needs the shim in the same file so it can drive the
|
||||
/// `__nyx_probe` channel.
|
||||
fn chain_step(prev_output: Option<&[u8]>) -> ChainStepHarness {
|
||||
let source = "prev = ENV[\"NYX_PREV_OUTPUT\"] || \"\"\n$stdout.write(prev)\n".to_owned();
|
||||
let shim = probe_shim();
|
||||
let driver = "prev = ENV[\"NYX_PREV_OUTPUT\"] || \"\"\n$stdout.write(prev)\n";
|
||||
let source = format!("{shim}\n{driver}");
|
||||
ChainStepHarness {
|
||||
source,
|
||||
filename: "step.rb".to_owned(),
|
||||
|
|
@ -768,4 +776,23 @@ mod tests {
|
|||
"install_crash_guard ordering wrong: payload_pos={payload_pos} install_pos={install_pos} invoke_pos={invoke_pos}",
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn chain_step_splices_probe_shim_for_composite_reverify() {
|
||||
let step = chain_step(Some(b"<prev>"));
|
||||
assert!(
|
||||
step.source.contains("__nyx_probe"),
|
||||
"Ruby chain step must splice the probe shim"
|
||||
);
|
||||
assert!(
|
||||
step.source.contains("ENV[\"NYX_PREV_OUTPUT\"]"),
|
||||
"Ruby chain step must keep its NYX_PREV_OUTPUT forwarder"
|
||||
);
|
||||
let shim_pos = step.source.find("__nyx_probe").unwrap();
|
||||
let driver_pos = step.source.find("ENV[\"NYX_PREV_OUTPUT\"]").unwrap();
|
||||
assert!(
|
||||
shim_pos < driver_pos,
|
||||
"probe shim must come before the driver so a sink rewrite has the shim's helpers in scope"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue