Route every conf writer through the guarded path
Eleven call sites wrote master.conf with tmp+rename and nothing else — no backup, no parse check, no audit — including the two toggles the UI uses most and the raw editor that installs a whole hand-edited file.
This commit is contained in:
@@ -82,6 +82,7 @@
|
||||
// ═══════════════════════════════════════════════════════════════════════════════════════════════
|
||||
header('Content-Type: application/json');
|
||||
require_once dirname(__DIR__) . '/include/config.php';
|
||||
require_once dirname(__DIR__) . '/include/confform.php';
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
||||
echo json_encode(['ok' => false, 'error' => 'POST only']);
|
||||
@@ -122,6 +123,9 @@ if (!file_exists($confPath)) {
|
||||
}
|
||||
|
||||
$lines = file($confPath, FILE_KEEP_BLANK_LINES);
|
||||
// Captured before array_splice rewrites the block in place — this is what the write compares
|
||||
// against to prove master.conf did not change while the new order was being assembled.
|
||||
$origConf = implode('', $lines ?: []);
|
||||
if (!$lines) {
|
||||
echo json_encode(['ok' => false, 'error' => 'Could not read master.conf']);
|
||||
exit;
|
||||
@@ -183,7 +187,13 @@ $newBlockLines[] = $lines[$blockEnd];
|
||||
// Replace the original block in $lines
|
||||
array_splice($lines, $blockStart, $blockEnd - $blockStart + 1, $newBlockLines);
|
||||
|
||||
if (!vv_write_conf_raw('master.conf', implode('', $lines))) {
|
||||
// See movescript.php: the block was rebuilt from a copy read before the lock, so the closure
|
||||
// compares against the current contents and abandons the reorder if anything changed in
|
||||
// between. Backup, bash -n, read-back and audit come with the shared path.
|
||||
$ok = vv_conf_edit('master.conf', fn(string $cur): ?string =>
|
||||
$cur === $origConf ? implode('', $lines) : null, [], [$arrayName]);
|
||||
|
||||
if (!$ok) {
|
||||
echo json_encode(['ok' => false, 'error' => 'Write failed']);
|
||||
exit;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user