From 2d49e93405fcd9d2b649954a722ee4b317fc0906 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 2 Jan 2024 12:18:09 -0500 Subject: [PATCH] Introduce a Create permission for Monitors, so that a given user may Edit existing monitors, but not create new ones. --- db/zm_create.sql.in | 2 +- db/zm_update-1.37.48.sql | 3 ++ distros/redhat/zoneminder.spec | 2 +- version.txt | 2 +- web/includes/actions/monitor.php | 6 +++- web/includes/auth.php | 8 ++++- web/skins/classic/views/add_monitors.php | 7 ++++ web/skins/classic/views/console.php | 23 ++++++++++---- web/skins/classic/views/js/add_monitors.js | 37 ++-------------------- web/skins/classic/views/js/console.js | 25 ++++++++++----- web/skins/classic/views/user.php | 3 +- 11 files changed, 62 insertions(+), 56 deletions(-) diff --git a/db/zm_create.sql.in b/db/zm_create.sql.in index 2ec95424c..41ac76377 100644 --- a/db/zm_create.sql.in +++ b/db/zm_create.sql.in @@ -776,7 +776,7 @@ CREATE TABLE `Users` ( `Stream` enum('None','View') NOT NULL default 'None', `Events` enum('None','View','Edit') NOT NULL default 'None', `Control` enum('None','View','Edit') NOT NULL default 'None', - `Monitors` enum('None','View','Edit') NOT NULL default 'None', + `Monitors` enum('None','View','Edit','Create') NOT NULL default 'None', `Groups` enum('None','View','Edit') NOT NULL default 'None', `Devices` enum('None','View','Edit') NOT NULL default 'None', `Snapshots` enum('None','View','Edit') NOT NULL default 'None', diff --git a/db/zm_update-1.37.48.sql b/db/zm_update-1.37.48.sql index 8b9ff59d5..38ac5b8d6 100644 --- a/db/zm_update-1.37.48.sql +++ b/db/zm_update-1.37.48.sql @@ -1 +1,4 @@ UPDATE Monitors SET ControlAddress='' WHERE ControlAddress='user:port@ip'; + +ALTER TABLE Users MODIFY `Monitors` enum('None','View','Edit','Create') NOT NULL default 'None'; +UPDATE Users SET Monitors='Create' WHERE Monitors='Edit'; diff --git a/distros/redhat/zoneminder.spec b/distros/redhat/zoneminder.spec index 7d22d7771..507ce107e 100644 --- a/distros/redhat/zoneminder.spec +++ b/distros/redhat/zoneminder.spec @@ -18,7 +18,7 @@ %global zmtargetdistro %{?rhel:el%{rhel}}%{!?rhel:fc%{fedora}} Name: zoneminder -Version: 1.37.47 +Version: 1.37.48 Release: 2%{?dist} Summary: A camera monitoring and analysis tool Group: System Environment/Daemons diff --git a/version.txt b/version.txt index 40545acde..d03c4692d 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.37.47 +1.37.48 diff --git a/web/includes/actions/monitor.php b/web/includes/actions/monitor.php index b7c3a13c9..970c23fa2 100644 --- a/web/includes/actions/monitor.php +++ b/web/includes/actions/monitor.php @@ -20,7 +20,7 @@ // Monitor edit actions, monitor id derived, require edit permissions for that monitor if (!canEdit('Monitors')) { - ZM\Warning('Monitor actions require Monitors Permissions'); + ZM\Warning('Monitor actions require Monitors Edit Permissions'); return; } @@ -42,6 +42,10 @@ if ($action == 'save') { if (!$x10Monitor) $x10Monitor = array(); } } else { + if (!canCreate('Monitors')) { + ZM\Warning('Monitor actions require Monitors Create Permissions'); + return; + } if ($user->unviewableMonitorIds()) { ZM\Warning('You are restricted to certain monitors so cannot add a new one.'); return; diff --git a/web/includes/auth.php b/web/includes/auth.php index df1be9d92..57abdf557 100644 --- a/web/includes/auth.php +++ b/web/includes/auth.php @@ -338,7 +338,13 @@ function editableMonitor($mid) { function canEdit($area, $mid=false) { global $user; - return ( $user && ($user->$area() == 'Edit') && ( !$mid || visibleMonitor($mid) )); + return ( $user && ($user->$area() == 'Edit' or $user->$area() == 'Create') && ( !$mid || visibleMonitor($mid) )); +} + +function canCreate($area) { + global $user; + + return ( $user && ($user->$area() == 'Create') ); } function userFromSession() { diff --git a/web/skins/classic/views/add_monitors.php b/web/skins/classic/views/add_monitors.php index c07a0ef5e..b10c8292a 100644 --- a/web/skins/classic/views/add_monitors.php +++ b/web/skins/classic/views/add_monitors.php @@ -22,6 +22,7 @@ if (!canEdit('Monitors')) { $view = 'error'; return; } +$canCreateMonitors = canCreate('Monitors'); $focusWindow = true; @@ -50,6 +51,9 @@ getBodyTopHTML(); value=""/>
+ +
diff --git a/web/skins/classic/views/console.php b/web/skins/classic/views/console.php index a170c7e78..3857da740 100644 --- a/web/skins/classic/views/console.php +++ b/web/skins/classic/views/console.php @@ -18,6 +18,9 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // +$canEditMonitors = canEdit('Monitors'); +$canCreateMonitors = canCreate('Monitors'); + $eventCounts = array( 'Total'=> array( 'title' => translate('Events'), @@ -179,18 +182,24 @@ echo $navbar ?>
+ +