Files
zoneminder/web/includes/Role_Monitor_Permission.php
Isaac Connor 4e60cb96a7 feat: add User Roles feature for reusable permission templates
Add a User Roles system where roles define reusable permission templates.
When a user has a role assigned, the role provides fallback permissions
(user's direct permissions take precedence; role is used when user has 'None').

Database changes:
- Add User_Roles table with same permission fields as Users
- Add Role_Groups_Permissions table for per-role group overrides
- Add Role_Monitors_Permissions table for per-role monitor overrides
- Add RoleId foreign key to Users table

Permission resolution order:
1. User's direct Monitor/Group permissions (if not 'Inherit')
2. Role's Monitor/Group permissions (if user has role)
3. Role's base permission (if user's is 'None')
4. User's base permission (fallback)

Includes:
- PHP models: User_Role, Role_Group_Permission, Role_Monitor_Permission
- Role management UI in Options > Roles tab
- Role selector in user edit form
- REST API endpoints for roles CRUD
- Translation strings for en_gb

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 13:34:27 -05:00

45 lines
1.2 KiB
PHP

<?php
namespace ZM;
require_once('database.php');
require_once('Object.php');
require_once('Monitor.php');
class Role_Monitor_Permission extends ZM_Object {
protected static $table = 'Role_Monitors_Permissions';
protected $defaults = array(
'Id' => null,
'RoleId' => null,
'MonitorId' => null,
'Permission' => 'Inherit',
);
private $Role;
private $Monitor;
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 Role($new = null) {
if ($new) $this->Role = $new;
if (!$this->Role) {
require_once('User_Role.php');
$this->Role = User_Role::find_one(['Id' => $this->RoleId()]);
}
return $this->Role;
}
public function Monitor($new = null) {
if ($new) $this->Monitor = $new;
if (!$this->Monitor)
$this->Monitor = Monitor::find_one(['Id' => $this->MonitorId()]);
return $this->Monitor;
}
} # end class Role_Monitor_Permission
?>