Files
zoneminder/web/includes/User_Role.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

102 lines
3.0 KiB
PHP

<?php
namespace ZM;
require_once('database.php');
require_once('Object.php');
require_once('Group.php');
class User_Role extends ZM_Object {
protected static $setters = array('Monitor_Permissions');
protected static $table = 'User_Roles';
protected $defaults = array(
'Id' => null,
'Name' => '',
'Description' => '',
'Stream' => 'None',
'Events' => 'None',
'Control' => 'None',
'Monitors' => 'None',
'Groups' => 'None',
'Devices' => 'None',
'Snapshots' => 'None',
'System' => 'None',
);
private $Group_Permissions;
private $Monitor_Permissions;
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 static function Indexed_By_Id() {
$results = array();
foreach (ZM_Object::_find('ZM\User_Role', null, array('order' => 'lower(Name)')) as $Object) {
$results[$Object->Id()] = $Object;
}
return $results;
}
public function Group_Permissions() {
if (!$this->Group_Permissions) {
if ($this->Id()) {
require_once('Role_Group_Permission.php');
$this->Group_Permissions = array_to_hash_by_key('GroupId', Role_Group_Permission::find(['RoleId' => $this->Id()]));
} else {
$this->Group_Permissions = [];
}
}
return array_values($this->Group_Permissions);
}
public function Group_Permission($group_id) {
if (!$this->Group_Permissions) $this->Group_Permissions();
if (!isset($this->Group_Permissions[$group_id])) {
require_once('Role_Group_Permission.php');
$gp = $this->Group_Permissions[$group_id] = new Role_Group_Permission();
$gp->RoleId($this->Id());
$gp->GroupId($group_id);
}
return $this->Group_Permissions[$group_id];
}
public function Monitor_Permissions($new = -1) {
if ($new != -1) $this->Monitor_Permissions = $new;
if (!$this->Monitor_Permissions) {
if ($this->Id()) {
require_once('Role_Monitor_Permission.php');
$this->Monitor_Permissions = array_to_hash_by_key('MonitorId', Role_Monitor_Permission::find(['RoleId' => $this->Id()]));
} else {
$this->Monitor_Permissions = [];
}
}
return array_values($this->Monitor_Permissions);
}
public function Monitor_Permission($monitor_id) {
if (!$this->Monitor_Permissions) $this->Monitor_Permissions();
if (!isset($this->Monitor_Permissions[$monitor_id])) {
require_once('Role_Monitor_Permission.php');
$mp = $this->Monitor_Permissions[$monitor_id] = new Role_Monitor_Permission();
$mp->RoleId($this->Id());
$mp->MonitorId($monitor_id);
}
return $this->Monitor_Permissions[$monitor_id];
}
public function Users() {
require_once('User.php');
return User::find(['RoleId' => $this->Id()]);
}
} # end class User_Role
?>