From e7a93b1448b97b0104e3eeb3f61bdffc7db05334 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Janis=20Daniel=20Da=CC=88hne?=
 <janis.daehne2@student.uni-halle.de>
Date: Wed, 12 Jun 2019 17:36:06 +0200
Subject: [PATCH] - made system role check async - moved some permission checks
 closer to method entry point

---
 .../Controllers/ControllerWithDb.cs           |   6 +-
 .../Core/AssessmentStatisticsController.cs    |   8 ++
 .../Core/Exercises/PLangController.cs         |   2 +-
 .../Core/Exercises/ReleaseController.cs       |   8 --
 .../Core/Exercises/SubmissionController.cs    | 117 +++++++++---------
 .../Core/Exercises/TagsController.cs          |   8 +-
 .../TutorViewAssessmentController.cs          |  35 +-----
 .../Controllers/Core/Misc/LangController.cs   |   2 +-
 .../Core/SystemSettingsController.cs          |  15 ++-
 .../Controllers/Core/Users/GroupController.cs |   6 +-
 .../Core/Users/GroupRolesController.cs        |   8 +-
 .../Core/Users/SystemRolesController.cs       |  10 +-
 .../Controllers/Core/Users/UsersController.cs |  18 +--
 .../dashboard/DashboardController.cs          |  12 +-
 .../Models/Users/SystemRolePermission.cs      |   3 +
 15 files changed, 121 insertions(+), 137 deletions(-)

diff --git a/src/ClientServer/Controllers/ControllerWithDb.cs b/src/ClientServer/Controllers/ControllerWithDb.cs
index 62485b9..0fdf20f 100644
--- a/src/ClientServer/Controllers/ControllerWithDb.cs
+++ b/src/ClientServer/Controllers/ControllerWithDb.cs
@@ -130,7 +130,7 @@ namespace ClientServer.Controllers
         /// <param name="onSessionEmptyAction">action when the user id was not found on the session, else null -&gt; login action</param>
         /// <param name="onDbResultEmptyAction">action when the db result was empty</param>
         /// <returns></returns>
-        public bool HasSystemPermission(Func<SystemRole, bool> checkPermissionFunc, Action onDbResultEmptyAction = null,
+        public async Task<bool> HasSystemPermission(Func<SystemRole, bool> checkPermissionFunc, Action onDbResultEmptyAction = null,
             Action onSessionEmptyAction = null)
         {
             //int? userId = HttpContext.Session.GetInt32(Constants.SessionUserIdKey);
@@ -147,11 +147,11 @@ namespace ClientServer.Controllers
             }
 
             //check if user has permission
-            User user = _context.Users
+            User user = await _context.Users
                 .Where(p => p.Id == userId)
                 .Include(p => p.SystemRole)
                 .Include(p => p.SystemRole.SystemRolePermission)
-                .FirstOrDefault();
+                .FirstOrDefaultAsync();
 
             if (user == null)
             {
diff --git a/src/ClientServer/Controllers/Core/AssessmentStatisticsController.cs b/src/ClientServer/Controllers/Core/AssessmentStatisticsController.cs
index 1863f39..3e3a15f 100644
--- a/src/ClientServer/Controllers/Core/AssessmentStatisticsController.cs
+++ b/src/ClientServer/Controllers/Core/AssessmentStatisticsController.cs
@@ -25,6 +25,14 @@ namespace ClientServer.Controllers.Core
 
         }
 
+        /// <summary>
+        ///
+        ///
+        /// PERMISSION needs to be checked for every group (where the exercise is connected) individually)
+        /// </summary>
+        /// <param name="userId"></param>
+        /// <param name="pagination"></param>
+        /// <returns></returns>
         [HttpPost("all/{userId}")]
         public async Task GetAssessmentStatistics(int userId, [FromBody] PaginationPostData pagination)
         {
diff --git a/src/ClientServer/Controllers/Core/Exercises/PLangController.cs b/src/ClientServer/Controllers/Core/Exercises/PLangController.cs
index 56c2fe6..d0581d2 100644
--- a/src/ClientServer/Controllers/Core/Exercises/PLangController.cs
+++ b/src/ClientServer/Controllers/Core/Exercises/PLangController.cs
@@ -27,7 +27,7 @@ namespace ClientServer.Controllers.Core.Exercises
 
             //user needs permission
 
-            if (base.HasSystemPermission(role => role != null && role.SystemRolePermission.CanChangeSystemSettings) ==
+            if (await HasSystemPermission(role => role != null && role.SystemRolePermission.CanChangeSystemSettings) ==
                 false)
             {
                 await
diff --git a/src/ClientServer/Controllers/Core/Exercises/ReleaseController.cs b/src/ClientServer/Controllers/Core/Exercises/ReleaseController.cs
index 1bf2cfa..65d3ba4 100644
--- a/src/ClientServer/Controllers/Core/Exercises/ReleaseController.cs
+++ b/src/ClientServer/Controllers/Core/Exercises/ReleaseController.cs
@@ -696,14 +696,6 @@ namespace ClientServer.Controllers.Core.Exercises
 
             int userId = GetUserId();
 
-
-            if (releaseId <= 0)
-            {
-                await
-                    Response.WriteAsync(
-                        Jc.Serialize(new BasicResponse(ResponseCode.InvalidRequest, "invalid release id")));
-                return;
-            }
             
             //the user group that manages the exercise
             var targetUserGroup =
diff --git a/src/ClientServer/Controllers/Core/Exercises/SubmissionController.cs b/src/ClientServer/Controllers/Core/Exercises/SubmissionController.cs
index 9dd5198..a46c28d 100644
--- a/src/ClientServer/Controllers/Core/Exercises/SubmissionController.cs
+++ b/src/ClientServer/Controllers/Core/Exercises/SubmissionController.cs
@@ -71,6 +71,28 @@ namespace ClientServer.Controllers.Core.Exercises
                     .FirstOrDefaultAsync(p => p.Id == releaseId)
                 ;
 
+            if (release == null)
+            {
+                await
+                    Response.WriteAsync(
+                        Jc.Serialize(new BasicResponse(ResponseCode.NotFound, "release not found")));
+                return;
+            }
+            
+            //the user group that manages the exercise
+            var targetUserGroup =
+                await _context.ExerciseReleases.Where(p => p.Id == release.Id)
+                    .Select(p => p.Exercise.UserGroupId)
+                    .FirstOrDefaultAsync();
+
+            if (!await base.HasGroupPermission(targetUserGroup,
+                permission => permission != null && permission.CanAssessExercises))
+            {
+                await
+                    Response.WriteAsync(
+                        Jc.Serialize(new BasicResponse(ResponseCode.NoPermission, "no permission")));
+                return;
+            }
 
             bool shouldGetPreAssessmentResults = false;
 
@@ -121,31 +143,6 @@ namespace ClientServer.Controllers.Core.Exercises
             }
 
 
-            if (release == null)
-            {
-                await
-                    Response.WriteAsync(
-                        Jc.Serialize(new BasicResponse(ResponseCode.NotFound, "release not found")));
-                return;
-            }
-
-
-            //the user group that manages the exercise
-            var targetUserGroup =
-                await _context.ExerciseReleases.Where(p => p.Id == release.Id)
-                    .Select(p => p.Exercise.UserGroupId)
-                    .FirstOrDefaultAsync();
-
-            if (!await base.HasGroupPermission(targetUserGroup,
-                permission => permission != null && permission.CanAssessExercises))
-            {
-                await
-                    Response.WriteAsync(
-                        Jc.Serialize(new BasicResponse(ResponseCode.NoPermission, "no permission")));
-                return;
-            }
-
-
             PaginatedData<AssessmentFullBase> assessments;
 
             if (shouldGetPreAssessmentResults)
@@ -181,6 +178,41 @@ namespace ClientServer.Controllers.Core.Exercises
             // because we use a link we don't get and need the csrf token...
             if (!await base.IsLoggedIn(null, false, true)) return;
 
+            var release = await _context.ExerciseReleases
+                    .Include(p => p.Exercise)
+                    .Include(p => p.ExerciseReleaseWithUserAsParticipations)
+                    .ThenInclude(p => p.User)
+                    .Include(p => p.ExerciseReleaseWithUserAsParticipations)
+                    .ThenInclude(p => p.Solutions)
+                    .ThenInclude(p => p.Assessment)
+                    .FirstOrDefaultAsync(p => p.GeneratedCode == releaseCode)
+                ;
+
+
+            if (release == null)
+            {
+                await
+                    Response.WriteAsync(
+                        Jc.Serialize(new BasicResponse(ResponseCode.NotFound, "release not found")));
+                return;
+            }
+            
+            //the user group that manages the exercise
+            var targetUserGroup =
+                await _context.ExerciseReleases.Where(p => p.Id == release.Id)
+                    .Select(p => p.Exercise.UserGroupId)
+                    .FirstOrDefaultAsync();
+
+            if (!await base.HasGroupPermission(targetUserGroup,
+                permission => permission != null && permission.CanAssessExercises))
+            {
+                await
+                    Response.WriteAsync(
+                        Jc.Serialize(new BasicResponse(ResponseCode.NoPermission, "no permission")));
+                return;
+            }
+            
+            
             if (csvDelimiter.Trim() == "") {
                 await
                     Response.WriteAsync(
@@ -548,26 +580,6 @@ namespace ClientServer.Controllers.Core.Exercises
             }
 
 
-            var release = await _context.ExerciseReleases
-                    .Include(p => p.Exercise)
-                    .Include(p => p.ExerciseReleaseWithUserAsParticipations)
-                    .ThenInclude(p => p.User)
-                    .Include(p => p.ExerciseReleaseWithUserAsParticipations)
-                    .ThenInclude(p => p.Solutions)
-                    .ThenInclude(p => p.Assessment)
-                    .FirstOrDefaultAsync(p => p.GeneratedCode == releaseCode)
-                ;
-
-
-            if (release == null)
-            {
-                await
-                    Response.WriteAsync(
-                        Jc.Serialize(new BasicResponse(ResponseCode.NotFound, "release not found")));
-                return;
-            }
-
-
             var pLangs = await _context.PLangs
                 .ToListAsync();
 
@@ -579,21 +591,6 @@ namespace ClientServer.Controllers.Core.Exercises
                 return;
             }
 
-            //the user group that manages the exercise
-            var targetUserGroup =
-                await _context.ExerciseReleases.Where(p => p.Id == release.Id)
-                    .Select(p => p.Exercise.UserGroupId)
-                    .FirstOrDefaultAsync();
-
-            if (!await base.HasGroupPermission(targetUserGroup,
-                permission => permission != null && permission.CanAssessExercises))
-            {
-                await
-                    Response.WriteAsync(
-                        Jc.Serialize(new BasicResponse(ResponseCode.NoPermission, "no permission")));
-                return;
-            }
-
 
             //get all
             var paginationData = new PaginationPostData()
diff --git a/src/ClientServer/Controllers/Core/Exercises/TagsController.cs b/src/ClientServer/Controllers/Core/Exercises/TagsController.cs
index 90a7ab4..44586ac 100644
--- a/src/ClientServer/Controllers/Core/Exercises/TagsController.cs
+++ b/src/ClientServer/Controllers/Core/Exercises/TagsController.cs
@@ -63,7 +63,7 @@ namespace ClientServer.Controllers.Core.Exercises
         {
             if (!await base.IsLoggedIn()) return;
 
-            if (base.HasSystemPermission(role => role != null && role.SystemRolePermission.CanManageTags) == false)
+            if (await HasSystemPermission(role => role != null && role.SystemRolePermission.CanManageTags) == false)
             {
                 await
                     Response.WriteAsync(Jc.Serialize(new BasicResponse(ResponseCode.NoPermission, "no permission")));
@@ -136,7 +136,7 @@ namespace ClientServer.Controllers.Core.Exercises
         {
             if (!await base.IsLoggedIn()) return;
 
-            if (base.HasSystemPermission(role => role != null && role.SystemRolePermission.CanManageTags) == false)
+            if (await HasSystemPermission(role => role != null && role.SystemRolePermission.CanManageTags) == false)
             {
                 await
                     Response.WriteAsync(Jc.Serialize(new BasicResponse(ResponseCode.NoPermission, "no permission")));
@@ -214,7 +214,7 @@ namespace ClientServer.Controllers.Core.Exercises
         {
             if (!await base.IsLoggedIn()) return;
 
-            if (base.HasSystemPermission(role => role != null && role.SystemRolePermission.CanManageTags) == false)
+            if (await base.HasSystemPermission(role => role != null && role.SystemRolePermission.CanManageTags) == false)
             {
                 await
                     Response.WriteAsync(Jc.Serialize(new BasicResponse(ResponseCode.NoPermission, "no permission")));
@@ -327,7 +327,7 @@ namespace ClientServer.Controllers.Core.Exercises
         {
             if (!await base.IsLoggedIn()) return;
 
-            if (base.HasSystemPermission(role => role != null && role.SystemRolePermission.CanManageTags) == false)
+            if (await HasSystemPermission(role => role != null && role.SystemRolePermission.CanManageTags) == false)
             {
                 await
                     Response.WriteAsync(Jc.Serialize(new BasicResponse(ResponseCode.NoPermission, "no permission")));
diff --git a/src/ClientServer/Controllers/Core/Exercises/TutorViewAssessmentController.cs b/src/ClientServer/Controllers/Core/Exercises/TutorViewAssessmentController.cs
index a0ecd8c..777b409 100644
--- a/src/ClientServer/Controllers/Core/Exercises/TutorViewAssessmentController.cs
+++ b/src/ClientServer/Controllers/Core/Exercises/TutorViewAssessmentController.cs
@@ -455,6 +455,8 @@ namespace ClientServer.Controllers.Core.Exercises
         public async Task GetAssessment(int exerciseReleaseId, int userId, int pLangId)
         {
             if (!await base.IsLoggedIn()) return;
+            
+            if (!await HasPermission(exerciseReleaseId)) return;
 
             //get all automatic assessments for this release
             var release = await _context.ExerciseReleases
@@ -472,21 +474,6 @@ namespace ClientServer.Controllers.Core.Exercises
                 return;
             }
 
-            //the user group that manages the exercise
-            var targetUserGroup =
-                await _context.ExerciseReleases.Where(p => p.Id == release.Id)
-                    .Select(p => p.Exercise.UserGroupId)
-                    .FirstOrDefaultAsync();
-
-            if (!await base.HasGroupPermission(targetUserGroup,
-                permission => permission != null && permission.CanAssessExercises))
-            {
-                await
-                    Response.WriteAsync(
-                        Jc.Serialize(new BasicResponse(ResponseCode.NoPermission, "no permission")));
-                return;
-            }
-
             var userReleaseParticipation = await _context.ExerciseReleaseWithUserAsParticipations.Where(p =>
                         p.ExerciseReleaseId == exerciseReleaseId
                         && p.UserId == userId
@@ -547,6 +534,8 @@ namespace ClientServer.Controllers.Core.Exercises
         {
             if (!await base.IsLoggedIn()) return;
 
+            
+            
             //get all automatic assessments for this release
             var release = await _context.ExerciseReleases
                     .Include(p => p.Exercise)
@@ -579,20 +568,7 @@ namespace ClientServer.Controllers.Core.Exercises
                 return;
             }
 
-            //the user group that manages the exercise
-            var targetUserGroup =
-                await _context.ExerciseReleases.Where(p => p.Id == release.Id)
-                    .Select(p => p.Exercise.UserGroupId)
-                    .FirstOrDefaultAsync();
-
-            if (!await base.HasGroupPermission(targetUserGroup,
-                permission => permission != null && permission.CanAssessExercises))
-            {
-                await
-                    Response.WriteAsync(
-                        Jc.Serialize(new BasicResponse(ResponseCode.NoPermission, "no permission")));
-                return;
-            }
+            if (!await HasPermission(release.Id)) return;
 
             var userReleaseParticipation = await _context.ExerciseReleaseWithUserAsParticipations.Where(p =>
                         p.ExerciseReleaseId == assessmentFullBase.ExerciseReleaseId
@@ -652,7 +628,6 @@ namespace ClientServer.Controllers.Core.Exercises
             await
                 Response.WriteAsync(
                     Jc.Serialize(new BasicResponse(ResponseCode.Ok, "")));
-            return;
         }
     }
 }
diff --git a/src/ClientServer/Controllers/Core/Misc/LangController.cs b/src/ClientServer/Controllers/Core/Misc/LangController.cs
index 45e840b..6760c59 100644
--- a/src/ClientServer/Controllers/Core/Misc/LangController.cs
+++ b/src/ClientServer/Controllers/Core/Misc/LangController.cs
@@ -30,7 +30,7 @@ namespace ClientServer.Controllers.Core.Exercises
 
             //user needs permission
 
-            if (base.HasSystemPermission(role => role != null && role.SystemRolePermission.CanChangeSystemSettings) ==
+            if (await HasSystemPermission(role => role != null && role.SystemRolePermission.CanChangeSystemSettings) ==
                 false)
             {
                 await
diff --git a/src/ClientServer/Controllers/Core/SystemSettingsController.cs b/src/ClientServer/Controllers/Core/SystemSettingsController.cs
index 45c3047..4eb45f9 100644
--- a/src/ClientServer/Controllers/Core/SystemSettingsController.cs
+++ b/src/ClientServer/Controllers/Core/SystemSettingsController.cs
@@ -104,7 +104,7 @@ namespace ClientServer.Controllers.Core
         {
             if (!await base.IsLoggedIn()) return;
 
-            if (base.HasSystemPermission(role =>
+            if (await HasSystemPermission(role =>
                     role != null && role.SystemRolePermission.CanChangeSystemSettings) == false)
             {
                 await
@@ -134,7 +134,7 @@ namespace ClientServer.Controllers.Core
         {
             if (!await base.IsLoggedIn()) return;
 
-            if (base.HasSystemPermission(role =>
+            if (await HasSystemPermission(role =>
                     role != null && role.SystemRolePermission.CanChangeSystemSettings) == false)
             {
                 await
@@ -170,6 +170,15 @@ namespace ClientServer.Controllers.Core
         {
             if (!await base.IsLoggedIn()) return;
 
+            //this already checks if the user exists
+            if (await HasSystemPermission(role =>
+                    role != null && role.SystemRolePermission.CanChangeSystemSettings) == false)
+            {
+                await
+                    Response.WriteAsync(
+                        Jc.Serialize(new BasicResponse(ResponseCode.NotFound, "no permission")));
+                return;
+            }
 
             var settingsFromBackend = new SystemSettingsFromBackend()
             {
@@ -242,7 +251,7 @@ namespace ClientServer.Controllers.Core
             var userId = base.GetUserId();
 
             //this already checks if the user exists
-            if (base.HasSystemPermission(role =>
+            if (await HasSystemPermission(role =>
                     role != null && role.SystemRolePermission.CanChangeSystemSettings) == false)
             {
                 await
diff --git a/src/ClientServer/Controllers/Core/Users/GroupController.cs b/src/ClientServer/Controllers/Core/Users/GroupController.cs
index 3c7d1b2..4db167e 100644
--- a/src/ClientServer/Controllers/Core/Users/GroupController.cs
+++ b/src/ClientServer/Controllers/Core/Users/GroupController.cs
@@ -33,7 +33,7 @@ namespace ClientServer.Controllers.Core.Users
             int userId = GetUserId();
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null && permission.SystemRolePermission.CanCreateGroups))
             {
                 await
@@ -170,7 +170,7 @@ namespace ClientServer.Controllers.Core.Users
             if (!await base.IsLoggedIn()) return;
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null && permission.SystemRolePermission.CanDeleteGroups))
             {
                 await
@@ -731,7 +731,7 @@ namespace ClientServer.Controllers.Core.Users
         /// <param name="userId">the user who wants to leave</param>
         /// <param name="userGroupRoleId">the current role of the user in the group</param>
         /// <returns>null: system settings not found (no creator role), true: user can leave, false: cannot leave</returns>
-        public async Task<bool?> HasGroupAtLeastOnCreator(int groupId, int userId, int userGroupRoleId)
+        private async Task<bool?> HasGroupAtLeastOnCreator(int groupId, int userId, int userGroupRoleId)
         {
             SystemSetting systemSetting = await _context.SystemSettings
                 .Include(p => p.DefaultGroupRole)
diff --git a/src/ClientServer/Controllers/Core/Users/GroupRolesController.cs b/src/ClientServer/Controllers/Core/Users/GroupRolesController.cs
index 4ed84ab..504098d 100644
--- a/src/ClientServer/Controllers/Core/Users/GroupRolesController.cs
+++ b/src/ClientServer/Controllers/Core/Users/GroupRolesController.cs
@@ -30,7 +30,7 @@ namespace ClientServer.Controllers.Core.Users
             if (!await base.IsLoggedIn()) return;
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null &&
                                   (
                                       permission.SystemRolePermission.CanCreateRoles
@@ -172,7 +172,7 @@ namespace ClientServer.Controllers.Core.Users
 
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null && permission.SystemRolePermission.CanCreateRoles))
             {
                 await
@@ -248,7 +248,7 @@ namespace ClientServer.Controllers.Core.Users
 
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null && permission.SystemRolePermission.CanChangeRoles))
             {
                 await
@@ -328,7 +328,7 @@ namespace ClientServer.Controllers.Core.Users
             if (!await base.IsLoggedIn()) return;
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null && permission.SystemRolePermission.CanDeleteRoles))
             {
                 await
diff --git a/src/ClientServer/Controllers/Core/Users/SystemRolesController.cs b/src/ClientServer/Controllers/Core/Users/SystemRolesController.cs
index cf9eac1..325479b 100644
--- a/src/ClientServer/Controllers/Core/Users/SystemRolesController.cs
+++ b/src/ClientServer/Controllers/Core/Users/SystemRolesController.cs
@@ -31,7 +31,7 @@ namespace ClientServer.Controllers.Core.Users
             if (!await base.IsLoggedIn()) return;
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null &&
                                   (permission.SystemRolePermission.CanManageNewUsers
                                    || permission.SystemRolePermission.CanCreateRoles
@@ -89,7 +89,7 @@ namespace ClientServer.Controllers.Core.Users
             if (!await base.IsLoggedIn()) return;
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null &&
                                   (permission.SystemRolePermission.CanManageNewUsers
                                    || permission.SystemRolePermission.CanCreateRoles
@@ -123,7 +123,7 @@ namespace ClientServer.Controllers.Core.Users
             if (!await base.IsLoggedIn()) return;
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null && permission.SystemRolePermission.CanCreateRoles))
             {
                 await
@@ -202,7 +202,7 @@ namespace ClientServer.Controllers.Core.Users
             if (!await base.IsLoggedIn()) return;
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null && permission.SystemRolePermission.CanChangeRoles))
             {
                 await
@@ -298,7 +298,7 @@ namespace ClientServer.Controllers.Core.Users
             if (!await base.IsLoggedIn()) return;
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null && permission.SystemRolePermission.CanDeleteRoles))
             {
                 await
diff --git a/src/ClientServer/Controllers/Core/Users/UsersController.cs b/src/ClientServer/Controllers/Core/Users/UsersController.cs
index b768c52..04ab0e5 100644
--- a/src/ClientServer/Controllers/Core/Users/UsersController.cs
+++ b/src/ClientServer/Controllers/Core/Users/UsersController.cs
@@ -165,7 +165,7 @@ namespace ClientServer.Controllers.Core.Users
 
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     (permission) => permission != null && permission.SystemRolePermission.CanChangeUserData))
             {
                 await
@@ -240,7 +240,7 @@ namespace ClientServer.Controllers.Core.Users
 
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     (permission) => permission != null && permission.SystemRolePermission.CanChangeUserData))
             {
                 await
@@ -399,7 +399,7 @@ namespace ClientServer.Controllers.Core.Users
 
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     (permission) => permission != null && permission.SystemRolePermission.CanManageNewUsers))
             {
                 await
@@ -505,7 +505,7 @@ namespace ClientServer.Controllers.Core.Users
             if (!await base.IsLoggedIn()) return;
 
             if (
-                    !HasSystemPermission(
+                    !await HasSystemPermission(
                         permission => permission != null && permission.SystemRolePermission.CanManageNewUsers))
                 //TODo or use permission can delete users??
             {
@@ -550,7 +550,7 @@ namespace ClientServer.Controllers.Core.Users
             if (!await base.IsLoggedIn()) return;
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null && permission.SystemRolePermission.CanManageNewUsers))
             {
                 await
@@ -577,7 +577,7 @@ namespace ClientServer.Controllers.Core.Users
             {
                 //check if the creating user is allowed to set the role...
                 if (
-                    !HasSystemPermission(
+                    !await HasSystemPermission(
                         permission =>
                             permission != null && permission.SystemRolePermission.CanChangeOtherUsersSystemRole))
                 {
@@ -635,7 +635,7 @@ namespace ClientServer.Controllers.Core.Users
             if (!await base.IsLoggedIn()) return;
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     (permission) => permission != null
                                     && (permission.SystemRolePermission.CanChangeOtherUsersSystemRole
                                         || permission.SystemRolePermission.CanDeleteActivatedUsers
@@ -748,7 +748,7 @@ namespace ClientServer.Controllers.Core.Users
             int ownId = GetUserId();
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null && permission.SystemRolePermission.CanDeleteActivatedUsers))
             {
                 await
@@ -817,7 +817,7 @@ namespace ClientServer.Controllers.Core.Users
             int userId = GetUserId();
 
             if (
-                !HasSystemPermission(
+                !await HasSystemPermission(
                     permission => permission != null && permission.SystemRolePermission.CanChangeOtherUsersSystemRole))
             {
                 await
diff --git a/src/ClientServer/Controllers/dashboard/DashboardController.cs b/src/ClientServer/Controllers/dashboard/DashboardController.cs
index f2fac83..94635e2 100644
--- a/src/ClientServer/Controllers/dashboard/DashboardController.cs
+++ b/src/ClientServer/Controllers/dashboard/DashboardController.cs
@@ -42,7 +42,7 @@ namespace ClientServer.Controllers
         {
             if (!await base.IsLoggedIn()) return;
 
-            if (!base.HasSystemPermission(role =>
+            if (!await HasSystemPermission(role =>
                 role != null && role.SystemRolePermission != null && role.SystemRolePermission.CanViewDashboard))
             {
                 await
@@ -127,7 +127,7 @@ namespace ClientServer.Controllers
         {
             if (!await base.IsLoggedIn()) return;
 
-            if (!base.HasSystemPermission(role =>
+            if (!await HasSystemPermission(role =>
                 role != null && role.SystemRolePermission != null && role.SystemRolePermission.CanViewDashboard))
             {
                 await
@@ -160,7 +160,7 @@ namespace ClientServer.Controllers
         {
             if (!await base.IsLoggedIn()) return;
 
-            if (!base.HasSystemPermission(role =>
+            if (!await HasSystemPermission(role =>
                 role != null && role.SystemRolePermission != null && role.SystemRolePermission.CanViewDashboard))
             {
                 await
@@ -203,7 +203,7 @@ namespace ClientServer.Controllers
         {
             if (!await base.IsLoggedIn()) return;
 
-            if (!base.HasSystemPermission(role =>
+            if (!await HasSystemPermission(role =>
                 role != null && role.SystemRolePermission != null && role.SystemRolePermission.CanViewDashboard))
             {
                 await
@@ -240,7 +240,7 @@ namespace ClientServer.Controllers
         {
             if (!await base.IsLoggedIn()) return;
 
-            if (!base.HasSystemPermission(role =>
+            if (!await HasSystemPermission(role =>
                 role != null && role.SystemRolePermission != null && role.SystemRolePermission.CanViewDashboard))
             {
                 await Response.WriteAsync(
@@ -298,7 +298,7 @@ namespace ClientServer.Controllers
         {
             if (!await base.IsLoggedIn()) return;
 
-            if (!base.HasSystemPermission(role =>
+            if (!await HasSystemPermission(role =>
                 role != null && role.SystemRolePermission != null && role.SystemRolePermission.CanViewDashboard))
             {
                 await
diff --git a/src/ClientServer/Models/Users/SystemRolePermission.cs b/src/ClientServer/Models/Users/SystemRolePermission.cs
index b237953..b9df0a6 100644
--- a/src/ClientServer/Models/Users/SystemRolePermission.cs
+++ b/src/ClientServer/Models/Users/SystemRolePermission.cs
@@ -40,6 +40,7 @@ namespace ClientServer.Models.Users
 
         /// <summary>
         /// true: can change user data (e.g. firstname, lastname...), false: not
+        /// TODO maybe combine CanChangeOtherUsersSystemRole, CanDeleteActivatedUsers, CanChangeUserData to CanManageActivatedUsers/CanManageOldUsers
         /// </summary>
         public bool CanChangeUserData { get; set; }
 
@@ -49,11 +50,13 @@ namespace ClientServer.Models.Users
         public bool CanManageNewUsers { get; set; }
         /// <summary>
         /// true: can change the group independent role (system role) of other users, false: not
+        /// TODO maybe combine CanChangeOtherUsersSystemRole, CanDeleteActivatedUsers, CanChangeUserData to CanManageActivatedUsers/CanManageOldUsers
         /// </summary>
         public bool CanChangeOtherUsersSystemRole { get; set; }
 
         /// <summary>
         /// true: can delete activated users, false: not
+        /// TODO maybe combine CanChangeOtherUsersSystemRole, CanDeleteActivatedUsers, CanChangeUserData to CanManageActivatedUsers/CanManageOldUsers
         /// </summary>
         public bool CanDeleteActivatedUsers { get; set; }
 
-- 
GitLab