Files
zoneminder/web/includes/Monitor_Permission.php
T
Isaac ConnorandClaude Opus 5.5 8d6c18db7e fix: only dispatch set()/changes() keys to field accessors refs GHSA-vvx7-ghpv-jq98
ZM_Object::set() called any method whose name matched a key in its data,
and changes() called it as a getter. That data is usually a request array
(filter[...], newMonitor[...], user[...]), so a request could invoke
save(), delete(), execute() and the like. filterdebug with fid=0 did
exactly that before its authorization check: filter[save][...] stored an
AutoExecute filter with a chosen command and filter[execute] ran
zmfilter.pl on it, giving command execution to any logged-in user. The
filter and events views pass filter[...] to set() the same way.

set() and changes() now dispatch a key to a method only when the key is
a field in $defaults or is listed in the class's new static $setters, the
accessors outside $defaults that take a value (Filter's query accessors,
Monitor::Model/Manufacturer/Groups, User::Role, and so on). Other method
names are refused with a warning.

filterdebug also requires Events view before it builds a filter from the
request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 19:32:25 -04:00

45 lines
1.2 KiB
PHP

<?php
namespace ZM;
require_once('database.php');
require_once('Object.php');
require_once('Monitor.php');
require_once('User.php');
require_once('Monitor.php');
class Monitor_Permission extends ZM_Object {
protected static $setters = array('Monitor', 'User');
protected static $table = 'Monitors_Permissions';
protected $defaults = array(
'Id' => null,
'MonitorId' => null,
'UserId' => null,
'Permission' => 'Inherit',
);
private $Monitor;
private $User;
public static function find( $parameters = array(), $options = array() ) {
return ZM_Object::_find(self::class, $parameters, $options);
}
public static function find_one( $parameters = array(), $options = array() ) {
return ZM_Object::_find_one(self::class, $parameters, $options);
}
public function Monitor($new=null) {
if ($new) $this->Monitor = $new;
if (!$this->Monitor)
$this->Monitor = Monitor::find_one(['Id'=>$this->MonitorId]);
return $this->Monitor;
}
public function User($new=null) {
if ($new) $this->User = $new;
if (!$this->User)
$this->User = User::find_one(['Id'=>$this->UserId]);
return $this->User;
}
} # end class Monitor_Permission
?>