From 44d0923e7a000755ef6d8338e0d382e9e97a0106 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Tue, 4 Jun 2024 08:12:58 +0000
Subject: [PATCH] add User::hasPermission(), fixes #3453

Closes #3453

Merge request studip/studip!2348
---
 RELEASE-NOTES.md          |  1 +
 lib/models/User.class.php | 25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 556cee65007..37f5fa2cc9d 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -5,6 +5,7 @@
 ## Neue Features
 
 - Der Stud.IP-Cache ist nun kompatibel zu PSR-6. ([TIC #3701](https://gitlab.studip.de/studip/studip/-/issues/3701))
+- Das `User`-Model hat die Methode `hasPermissionLevel()` erhalten, um einfach abfragen zu können, ob eine Person einen bestimmten Berechtigungsstatus hat. ([Issue #3453](https://gitlab.studip.de/studip/studip/-/issues/3453))
 
 ## Breaking changes
 
diff --git a/lib/models/User.class.php b/lib/models/User.class.php
index a9dbc14d4a3..4894031b7ca 100644
--- a/lib/models/User.class.php
+++ b/lib/models/User.class.php
@@ -1622,4 +1622,29 @@ class User extends AuthUserMd5 implements Range, PrivacyObject, Studip\Calendar\
                 return '';
         }
     }
+
+    /*
+     * Returns whether the user has the given permission (for the given range).
+     *
+     * @param string     $permission
+     * @param Range|null $for_range
+     *
+     * @return bool
+     */
+    public function hasPermissionLevel(string $permission, ?Range $for_range = null): bool
+    {
+        if (func_num_args() === 1) {
+            return $GLOBALS['perm']->have_perm($permission, $this->id);
+        }
+
+        if ($for_range === null) {
+            throw new Exception('No valid range given');
+        }
+
+        if ($for_range instanceof User) {
+            return $GLOBALS['perm']->have_profile_perm($permission, $for_range->id, $this->id);
+        }
+
+        return $GLOBALS['perm']->have_studip_perm($permission, $for_range->id, $this->id);
+    }
 }
-- 
GitLab