Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
484cdbb
fix(security): RLIKE injection, XSS, unserialize, and trigger_cmd har…
somethingwithproof May 17, 2026
eb9487b
test: add Pest v1 security regression suite
somethingwithproof May 17, 2026
850e05d
test(security): strengthen TriggerCmd and RlikeInjection coverage
somethingwithproof May 17, 2026
8b97adc
fix(security): replace raw SQL concatenation with prepared statements
somethingwithproof May 17, 2026
a57493f
fix(security): wrap AJAX URL params with encodeURIComponent
somethingwithproof May 17, 2026
4922fff
test(security): add encodeURIComponent regression tests for AJAX filters
somethingwithproof May 17, 2026
8903631
fix(compat): replace str_starts_with with strncmp for PHP 7.4
somethingwithproof May 17, 2026
e13f1a7
fix(guard): cast drp_action valid-actions to strings for strict in_array
somethingwithproof May 17, 2026
c9035b2
fix(validation): add gfrv() calls for id and action fields in bulk ha…
somethingwithproof May 17, 2026
62de01c
test(security): add PreparedStatementConsistencyTest from #769
somethingwithproof May 17, 2026
a24496a
docs(api): document get_total_row_data third-arg contract at call sites
somethingwithproof May 17, 2026
570b37b
fix(atomicity): wrap bulk notify-list writes in transactions
somethingwithproof May 17, 2026
0095f22
fix(atomicity): rollback on db_execute_prepared failure in bulk handlers
somethingwithproof May 17, 2026
913124c
fix(atomicity): break on failure in loops; move template cascade afte…
somethingwithproof May 17, 2026
025dc6f
docs(changelog): document security hardening entries for develop
somethingwithproof May 17, 2026
0185bcb
fix(thold): quote PHP_BINARY in lint test, add putenv/bootstrap sync …
somethingwithproof May 17, 2026
b5d0677
fix(thold): clarify RLIKE test assertions and document sql_params con…
somethingwithproof May 17, 2026
6187ead
fix(test): use nowdoc for RLIKE vulnerable-pattern strings
somethingwithproof May 17, 2026
61ad805
fix(test): replace nested-paren-hostile regex with substr_count; shor…
somethingwithproof May 17, 2026
be3c392
thold: remove eval() from RPN evaluator and escape trigger_cmd shell …
Jul 13, 2026
969418d
thold: address automated review feedback (SQL quote consistency, exec…
Jul 13, 2026
dc0e351
Fix Thold RPN evaluator formatting
somethingwithproof Jul 14, 2026
d200dfc
Fix Thold CI dependencies and formatting
somethingwithproof Jul 14, 2026
c2ac1a0
security: prepare notification queue bulk deletes
somethingwithproof Jul 14, 2026
6d661ff
fix: restore nested selected_graphs_array deserialize
somethingwithproof Jul 14, 2026
45c7e44
style: format unserialize hardening test
somethingwithproof Jul 14, 2026
72d17b6
test: replace source-grep assertions with behavioural tests
somethingwithproof Aug 17, 2026
e8da977
fix(thold): abandon RPN expressions that have no usable result
somethingwithproof Aug 17, 2026
0d83fb6
fix(security): prefer Cacti's RLIKE quoting helper for the name filter
somethingwithproof Aug 17, 2026
ed90d65
fix(notify_lists): repair the bulk actions, which never ran
somethingwithproof Aug 17, 2026
8c98930
docs(changelog): record the hardening and the bugs it uncovered
somethingwithproof Aug 17, 2026
3b839ad
test: cover the trigger command paths and the optional core branches
somethingwithproof Aug 17, 2026
c23120d
fix(thold): log the result of an inline trigger command
somethingwithproof Aug 17, 2026
a1a8a6c
ci: leave the Apache PHP package change to its own pull request
somethingwithproof Aug 17, 2026
4601159
fix(thold): quote substituted values before the trigger command is as…
somethingwithproof Aug 17, 2026
e1315a6
test: move the Cacti library fixture out of an ignored path
somethingwithproof Aug 17, 2026
97d18b4
style: apply the project php-cs-fixer configuration
somethingwithproof Aug 17, 2026
fe41340
test: follow Cacti's test layout and composer scripts
somethingwithproof Aug 17, 2026
9fb2072
test: keep optional-core coverage in Pest process order
somethingwithproof Aug 17, 2026
8fd4be7
ci: keep plugin PR integration checks on pinned Cacti
somethingwithproof Aug 17, 2026
52a8d98
ci: bound package index refreshes
somethingwithproof Aug 17, 2026
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
30 changes: 19 additions & 11 deletions .github/workflows/plugin-ci-workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,21 +35,12 @@ jobs:
integration-test:
runs-on: ${{ matrix.os }}

# A failure against the pinned release is a real failure. The develop entry
# is advisory: it is how a core regression becomes visible here, but it must
# not turn the plugin's own pull requests red.
continue-on-error: ${{ matrix.cacti != 'release/1.2.31' }}

strategy:
fail-fast: false
matrix:
php: ['8.1', '8.2', '8.3', '8.4']
os: [ubuntu-latest]
cacti: ['release/1.2.31']
include:
- php: '8.4'
os: ubuntu-latest
cacti: 'develop'

services:
mariadb:
Expand Down Expand Up @@ -95,10 +86,27 @@ jobs:
echo "PHP_BINARY=$(command -v php)" >> "$GITHUB_ENV"

- name: Run apt-get update
run: sudo apt-get update
run: |
for attempt in 1 2 3; do
if sudo timeout 3m apt-get \
-o Dpkg::Lock::Timeout=60 \
-o Acquire::Retries=3 \
-o Acquire::http::Timeout=30 \
-o Acquire::https::Timeout=30 \
update; then
exit 0
fi

if [ "$attempt" -lt 3 ]; then
sleep 10
fi
done

echo 'apt-get update failed after three bounded attempts.' >&2
exit 1

- name: Install System Dependencies
run: sudo apt-get install -y apache2 snmp snmpd rrdtool fping
run: sudo apt-get install -y apache2 snmp snmpd rrdtool fping libapache2-mod-php

- name: Start SNMPD Agent and Test
run: |
Expand Down
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@

--- develop ---

* security: Use prepared statements for the bulk form actions in notify_lists.php and notify_queue.php
* security: Bind $graph_id in get_allowed_thresholds() and get_allowed_threshold_logs() instead of interpolating it
* security: Route rfilter through db_qstr_rlike() where Cacti provides it, and quote it otherwise
* security: Quote the values substituted into trigger commands
* security: Escape the page, id and drp_action values printed into hidden inputs
* security: Remove the eval() calls from the RPN expression evaluator
* issue: Bulk actions on the Notification Lists page did nothing, because the action allowlist compared an int against strings
* issue: Bulk writes were discarded on MySQL, where Cacti's db_commit_transaction() never commits
* issue: An RPN expression dividing zero by zero pushed no result, corrupting the rest of the stack
* issue: An RPN expression taking the modulo of zero, the square root of a negative, or the log of zero aborted the poller or produced NAN
* issue: Deleting a notification list left soft-deleted devices pointing at it
* issue#686: Applying a templated threshold to a graph via the wrench icon, creates a duplicate graph
* issue#707: Excessive timeout for row caching prevents data from being updated timely
* issue#710: Fixing Typo in thold_daemons.service File
Expand Down
Loading
Loading