Commit Graph
120 Commits
Author SHA1 Message Date
Isaac Connor db9ba436b7 fix: break sort-value ties by Id when finding prev/next events
getNearEvents compared only the sort column with >= / <= and excluded the
current event, using Id solely as a secondary ORDER BY. When several events
share a sort value - most often StartDateTime, which has one-second
resolution, with multiple monitors recording in step - the later event of
a tie chose the earlier one as its Next. Event playback, gapless or not,
then looped between the two and the Next button could not escape.

Compare the full (sort value, Id) tuple so ordering is strict in both
directions. Read the current event's sort value through the same
Events/Monitors join as the searches, which also makes Prev/Next work
when sorting by MonitorName (the value was previously looked up in the
Events row and was always NULL).
2026-09-28 07:55:57 -04:00
Isaac ConnorandClaude Opus 5 33661907d1 feat: persist the peak audio level on each frame row
zm_update-1.39.31.sql gave monitors audio detection, but the level only ever
existed in shared memory, so it was gone the moment the frame passed and there
was nothing for the event view to plot. Add Frames.AudioLevel next to Score, on
the same 0-100 dBFS-derived scale the threshold uses.

What is stored is the peak since the previous row, not the level at the instant
the row was written. Frames rows are written well below the capture rate --
only alarm, bulk and score-increasing frames get one -- so sampling at write
time would drop exactly the short loud noises worth seeing on a timeline.
AudioDetector accumulates the peak as it decodes and Event::AddFrame takes it
where the row is built, which clears it so each row covers its own interval.
The Event constructor takes and discards it once, otherwise an event's first
row reports the loudest moment since the previous event ended.

This needs no shared memory change: zma is now an offline re-analysis tool and
the live analysis runs in a thread of zmc, alongside the capture thread that
runs the decoder, so the peak can stay in the AudioDetector. SharedData keeps
its documented 888-byte layout and its fixed offsets.

The frames ajax returns the column, and Score with it. elements in
web/ajax/status.php is a whitelist that never listed Score, which is why the
event view's cue strip has been reading an undefined Score off every frame.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JpiSWBmtQkR5bcgpHWY4ME
2026-09-20 18:17:43 -05:00
singhharsh1708 aad6c4bfcb refactor: retire the FrameSkip column refs #3570 2026-09-02 20:28:37 +05:30
IgorA100 35151e0a4b Added $data['getLogStatusHTML'] = logState() (status.php) 2026-06-08 20:37:34 +03:00
Isaac ConnorandClaude Opus 4.6 191130dcf3 fix: validate eventId in getNearEvents() in ajax/status.php
Apply validCardinal() to $_REQUEST['id'], consistent with the
validation now used in getNearFrame() and getFrameImage().

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 16:52:26 -05:00
Isaac ConnorandClaude Opus 4.6 24a2126def fix: validate eventId and frameId in getNearFrame() in ajax/status.php
Apply validCardinal() to $_REQUEST['id'] values, consistent with
getFrameImage() which already validates the same kind of inputs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 16:50:59 -05:00
Isaac ConnorandClaude Opus 4.6 89c358a6c0 fix: remove print_r object dump from permission error in ajax/status.php
The canView() failure path was dumping the entire Monitor object via
print_r() into the AJAX error response. This leaked all monitor
properties (Host, Path, ControlAddress, etc.) to users who fail the
permission check. Replace with a minimal error message containing
only the entity type and id.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 15:26:25 -05:00
Isaac ConnorandClaude Opus 4.6 0392d0ef27 fix: add early per-object canView() check in ajax/status.php
The monitor entity's func/zmu elements (Status, FrameRate) execute
in the element loop before the post-SQL canView() check, allowing
any authenticated user to query any monitor via zmu commands.

Add an early permission check after the id is determined but before
the element processing loop. When the entity spec has an 'object'
key and an id is provided, construct the object and call canView()
which respects per-group and per-role permissions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 14:44:42 -05:00
Isaac ConnorandClaude Opus 4.6 e163d3b9b8 fix: replace eval() with call_user_func() in ajax/status.php
Replace all four eval() call sites with call_user_func(). Entity-level
funcs (getFrameImage, getNearFrame, getNearEvents) are now callable
strings. Element-level funcs (daemonCheck, getLoad, getDiskPercent)
are now closures. postFunc handlers use call_user_func with $sqlData
passed as the argument.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 14:11:58 -05:00
Isaac ConnorandClaude Opus 4.6 1d89736b65 fix: harden ORDER BY sort field validation in ajax/status.php
The sort field whitelist check compared bare field names against
$fieldSql entries that could be backtick-wrapped or aliased SQL
expressions, so the check would often fail to match legitimate
fields.  When it failed, execution fell through to append the sort
direction (ASC/DESC) without a field name, producing malformed SQL.
The error log call also passed the wrong variable to join().

Rewrite the sort handling to:
- Skip invalid fields with continue instead of falling through
- Match field names against bare, backtick-wrapped, and aliased forms
- Collect valid ORDER BY clauses into an array before appending
- Backtick-wrap field names in the output SQL
- Only append ORDER BY when valid clauses exist

Also parameterize the prev-event sort comparison in getNearEvents()
and add the missing sort_field bind parameter to both prev and next
event queries.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 14:02:15 -05:00
Isaac Connor 52b7c47fd4 Fix Secondary Order SQL Infection in via Stored Event Name and Cause Fields. Fixes GHSA-r6gm-478g-f2c4 2026-02-06 13:58:27 -05:00
Isaac Connor ffeec4cdec Add E.Id != and use >= and <= when comparing StartDateTime so that we don't skip events with the same startDateTime. Fixes #4186 2024-12-09 17:27:56 -05:00
Isaac Connor 359330b384 When loading prev/next event, sort by StartDateTime, not Id. Id's are not guaranteed to be time-wise sequential. Maybe Fixes #4186 2024-11-27 13:55:50 -05:00
Isaac Connor 51ad77c6b9 Always add auth_relay info to status requests 2024-06-06 18:10:23 -04:00
Isaac Connor ad6a8c376b Add new auth_hash to any status request. Fixed auth timeout when using rtsp2web or janus 2024-06-06 17:51:05 -04:00
Isaac Connor f9ea031581 Merge branch 'patch-6' of github.com:IgorA100/zoneminder into IgorA100-patch-6 2024-03-14 17:15:46 -04:00
Isaac Connor 5120baa9ee Implement object permissions vs entity permissions so that we can handle the new group based permissions on Monitors. This fixes status updates when MOnitors=None but there is a per-monitor group based view permission. 2024-03-05 14:00:23 -05:00
IgorA100 cd8ffa08dc Add getCpuUsageHTML() 2024-02-27 16:49:29 +03:00
Isaac Connor 9669f1e3ef Sanitize entity before outputting it preventing XSS 2024-01-24 19:22:47 -05:00
Isaac Connor e9362f1a10 Fix duplicated Capturing in monitor status elements. Add Recording. Fix MinEventId, MaxEventId, TotalEvents. Ad CaptureFPS, AnalysisFPS and CaptureBandwidth 2024-01-02 16:28:49 -05:00
Isaac Connor 23a0e561eb Remove depth of nested if's by returning early. 2023-11-21 10:49:09 -05:00
Isaac Connor 50ece0ae57 Turn off debugging of status ajax results. Can be a lot of info and can be gotten from browser dev tools 2023-10-26 09:25:45 -04:00
Isaac Connor f8c89a0405 Merge branch 'master' into tags 2023-09-14 16:42:06 -04:00
Isaac Connor b44216d3da Merge branch 'master' of github.com:ZoneMinder/zoneminder 2023-09-08 14:19:09 -04:00
Isaac Connor 473d34e220 Update events frameimage status code to use Event object. Make not finding the frame a debug because of bulk frames. 2023-09-08 14:17:36 -04:00
Simpler1 18d74ed7ac (feat): Tags
fix(tag): Create tags on mobile

chore(tags): Change TagName to Name

chore(tags): eslint

chore(tags): dbFetchAll to dbQuery for removetag

chore(events): eslint (attempt 2)

feat(tags): Better handling of keyboard

fix(tags): Enter key for creating new tag

fix(tags): Don't allow space as a tag name

feat(tags): Delete tag if last assignment removed

fix(tags): Increase height of dropdown

in progress

fix(Tags): Use T.Id on the events page dropdown

fix(Tags): Remove $availableTags from events.php

chore(sql): Formatting sql statements

feat(Tags): Working OR on filters and events pages

fix(filter): Populate availableTags

chore(Tags): code formatting

fix(tag): Add tag on create tag

Fix(tags): Remove tag from available if last

feat(tags): Add zm_update.sql

fix(chosen): Undo css width

fix(chosen): tags dropdown width

fix(tags): dropdown over timeline

fix(tags): Full width input

fix(events): Refresh table on page show

chore(filter): Clean up availableTags

chore(event): Clean up available & selected Tags

fix(event): Update available tags on remove

fix(event): Remove hack for selected tags

feat(tags): Blur input after adding tag

doc(tags): Initial tags documentation

fix(tags): Dark theme dropdown

fix(tags): Dark theme for tags on input

fix(tags): Dark theme for highlight in dropdown

fix(tags): Populate filter tags droplist

chore(): Bump zm_update to 1.37.42

chore(tags): Move mobile check to skin.js

chore(tags): Comment debug statements

fix(tags): Enter key to create tag on mobile Chome

chore(tags): Space in 'All Tags' for translation

Temporary commit to handle cookie expiration times

chore(tags): Remove unnecessary Tag(s) from en_gb

chore(): Cleanup unnecessary Error and Debug

chore(): Resolve merge conflicts

chore(): Address merge conflicts with master
2023-08-31 15:50:08 -04:00
Alejandro Criado-Pérez 6fd119157a Text corrections 2023-08-27 02:00:59 +02:00
Isaac Connor d31f918abc Change the api for frameimage status request to split id into eid and fid instead of having id as an array. 2023-08-15 09:15:24 -04:00
Isaac Connor 03155da5b6 Use the full integer value instead of the first char of mi. Fixes failure to get status on janus viewing pages 2023-07-25 15:18:35 -04:00
Isaac Connor 59ff7f3a31 Improve logged wrt insufficient permissions 2023-06-08 09:17:16 -04:00
Isaac Connor 969baa3891 Convert user from an array to a User object 2023-04-23 12:57:29 -04:00
Isaac Connor 1c538a4bf0 Include Capturing, Analysing, Recording instead of Function 2022-12-14 08:28:21 -05:00
Isaac Connor 0a28a3e659 Add check for REQUEST['entity']. Add missing quotes around state word because it gets executed as code 2022-12-12 13:06:13 -05:00
Isaac Connor df591a677e Handle when there is no filtering in getNearEvents 2022-12-07 12:27:12 -05:00
Isaac Connor e08b826843 Add support for lambda functions as post processing. Use the to replace StartDateTimeShort with StartDateTimeFormatted so that dates on viewed events use the specified formatting. 2022-06-21 11:42:18 -04:00
Isaac Connor 909c0e903f Include EndDateTimeShort in event ajax response 2022-02-17 13:30:01 -05:00
Isaac Connor cb80283398 Merge branch 'master' into timeline_multi_monitor
update code to use jquery instead of mootools
when only viewing 1 monitor, split view in half
load first event image righ toff the bat
2022-02-11 18:03:35 -05:00
Isaac Connor d71a5932f5 Turn off useless shm display in header. Add ram and swap usage 2021-10-14 13:33:29 -04:00
Isaac Connor 4a40214f73 StartTimeShort should be StartDateTimeShort. Leave StartTimeShort for backwards compatibility. Add Storage, DiskSpace in status=>event 2021-06-08 16:58:50 -04:00
Isaac Connor 587cebecbb navbar requests don't pass an auth token so we never send an auth update. Just always send it. 2021-03-13 12:10:35 -05:00
Andrew Bauer 347c64eb7d remove warning 2020-12-01 13:30:57 -06:00
Andrew Bauer 6da826d79c fix typo 2020-12-01 13:29:43 -06:00
Isaac Connor 66f7cc55dc Spacing code comments, quotes 2020-11-13 17:05:23 -05:00
Isaac Connor ee89eb45e6 Fix EndTime to EndDateTime 2020-11-04 18:39:02 -05:00
Isaac Connor e085e08caa Fix missed StartTime to StartDateTime 2020-11-04 18:27:51 -05:00
Isaac Connor 1690bcbd38 update auth_relay when we update auth_hash 2020-10-26 18:49:14 -04:00
Isaac Connor e6f08959fa Fix use of result instead of NearEvents 2020-10-21 10:40:26 -04:00
Isaac Connor 34ce3a1498 Use Filter::parse instead of parseFilter. Use Filter->addTerm to limit to User's monitor restrictions. Return early with better logging in the event of error. Introduce Filter->addTerm 2020-10-21 10:36:40 -04:00
Isaac Connor 10c0a6617c Return Debug to a regular function to match other logging functions. Since we switched to using namespaces we no longer clash with cake_php. 2020-10-14 10:39:25 -04:00
Isaac Connor 9e6db17e68 Fix getting next event due to case of asc 2020-10-10 11:09:39 -04:00