Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions tests/Security/Php74CompatibilityTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php
/*
+-------------------------------------------------------------------------+
| Copyright (C) 2004-2026 The Cacti Group |
+-------------------------------------------------------------------------+
| Cacti: The Complete RRDtool-based Graphing Solution |
+-------------------------------------------------------------------------+
*/

/*
* Verify plugin source files do not use PHP 8.0+ syntax.
* Cacti 1.2.x plugins must remain compatible with PHP 7.4.
*/

describe('PHP 7.4 compatibility in apcupsd', function () {
$files = array(
'database.php',
'poller_apcupsd.php',
'setup.php',
'upses.php',
);

$readFile = function ($relativeFile) {
$path = realpath(__DIR__ . '/../../' . $relativeFile);

expect($path)->not->toBeFalse("Expected file {$relativeFile} to exist and be resolvable");

$contents = file_get_contents($path);

expect($contents)->not->toBeFalse("Expected file {$relativeFile} to be readable");

return $contents;
};

it('does not use str_contains (PHP 8.0)', function () use ($files, $readFile) {
foreach ($files as $relativeFile) {
$contents = $readFile($relativeFile);

expect(preg_match('/\bstr_contains\s*\(/', $contents))->toBe(0,
"{$relativeFile} uses str_contains() which requires PHP 8.0"
);
}
});

it('does not use str_starts_with (PHP 8.0)', function () use ($files, $readFile) {
foreach ($files as $relativeFile) {
$contents = $readFile($relativeFile);

expect(preg_match('/\bstr_starts_with\s*\(/', $contents))->toBe(0,
"{$relativeFile} uses str_starts_with() which requires PHP 8.0"
);
}
});

it('does not use str_ends_with (PHP 8.0)', function () use ($files, $readFile) {
foreach ($files as $relativeFile) {
$contents = $readFile($relativeFile);

expect(preg_match('/\bstr_ends_with\s*\(/', $contents))->toBe(0,
"{$relativeFile} uses str_ends_with() which requires PHP 8.0"
);
}
});

it('does not use nullsafe operator (PHP 8.0)', function () use ($files, $readFile) {
foreach ($files as $relativeFile) {
$contents = $readFile($relativeFile);

expect(preg_match('/\?->/', $contents))->toBe(0,
"{$relativeFile} uses nullsafe operator which requires PHP 8.0"
);
}
});
});
4 changes: 3 additions & 1 deletion tests/Security/PreparedStatementConsistencyTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@
it('uses prepared DB helpers in all plugin files', function () {
// setup.php is excluded: it is almost entirely schema-migration DDL
// (CREATE/DROP/ALTER TABLE) with no user-supplied parameters to bind,
// unlike the user-facing query code in upses.php.
// unlike the user-facing query code in the other target files.
$targetFiles = array(
'database.php',
'poller_apcupsd.php',
'upses.php',
);

Expand Down
Loading