- Timestamp:
- 12/15/18 12:07:16 (6 years ago)
- Location:
- branches/2925_AutoDiffForDynamicalModels
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2925_AutoDiffForDynamicalModels
- Property svn:mergeinfo changed
-
branches/2925_AutoDiffForDynamicalModels/HeuristicLab.Services.Hive
- Property svn:mergeinfo changed
-
branches/2925_AutoDiffForDynamicalModels/HeuristicLab.Services.Hive/3.3/Manager/AuthorizationManager.cs
r15583 r16386 27 27 using DA = HeuristicLab.Services.Hive.DataAccess; 28 28 using DT = HeuristicLab.Services.Hive.DataTransfer; 29 29 using System.Collections.Generic; 30 using System.Linq; 30 31 31 32 namespace HeuristicLab.Services.Hive { 32 33 public class AuthorizationManager : IAuthorizationManager { 33 34 34 private const string NOT_AUTHORIZED = "Current user is not authorized to access the requested resource"; 35 private const string NOT_AUTHORIZED_USERRESOURCE = "Current user is not authorized to access the requested resource"; 36 private const string NOT_AUTHORIZED_USERPROJECT = "Current user is not authorized to access the requested project"; 37 private const string NOT_AUTHORIZED_USERJOB = "Current user is not authorized to access the requested job"; 38 private const string NOT_AUTHORIZED_PROJECTRESOURCE = "Selected project is not authorized to access the requested resource"; 39 private const string USER_NOT_IDENTIFIED = "User could not be identified"; 40 private const string JOB_NOT_EXISTENT = "Queried job could not be found"; 41 private const string TASK_NOT_EXISTENT = "Queried task could not be found"; 42 private const string PROJECT_NOT_EXISTENT = "Queried project could not be found"; 43 35 44 private IPersistenceManager PersistenceManager { 36 45 get { return ServiceLocator.Instance.PersistenceManager; } … … 47 56 public void Authorize(Guid userId) { 48 57 if (userId != ServiceLocator.Instance.UserManager.CurrentUserId) 49 throw new SecurityException(NOT_AUTHORIZED );58 throw new SecurityException(NOT_AUTHORIZED_USERRESOURCE); 50 59 } 51 60 52 61 public void AuthorizeForTask(Guid taskId, DT.Permission requiredPermission) { 53 62 if (ServiceLocator.Instance.RoleVerifier.IsInRole(HiveRoles.Slave)) return; // slave-users can access all tasks 63 if (ServiceLocator.Instance.RoleVerifier.IsInRole(HiveRoles.Administrator)) return; // administrator can access all tasks 64 var currentUserId = UserManager.CurrentUserId; 54 65 var pm = PersistenceManager; 55 66 var taskDao = pm.TaskDao; 67 var projectDao = pm.ProjectDao; 56 68 pm.UseTransaction(() => { 57 69 var task = taskDao.GetById(taskId); 58 if (task == null) throw new SecurityException(NOT_AUTHORIZED); 70 if (task == null) throw new SecurityException(TASK_NOT_EXISTENT); 71 72 // check if user is granted to administer a job-parenting project 73 var administrationGrantedProjects = projectDao 74 .GetAdministrationGrantedProjectsForUser(currentUserId) 75 .ToList(); 76 if (administrationGrantedProjects.Contains(task.Job.Project)) return; 77 59 78 AuthorizeJob(pm, task.JobId, requiredPermission); 60 79 }); … … 62 81 63 82 public void AuthorizeForJob(Guid jobId, DT.Permission requiredPermission) { 64 var pm = PersistenceManager; 65 pm.UseTransaction(() => { 83 if (ServiceLocator.Instance.RoleVerifier.IsInRole(HiveRoles.Administrator)) return; // administrator can access all jobs 84 var currentUserId = UserManager.CurrentUserId; 85 var pm = PersistenceManager; 86 var jobDao = pm.JobDao; 87 var projectDao = pm.ProjectDao; 88 pm.UseTransaction(() => { 89 var job = jobDao.GetById(jobId); 90 if(job == null) throw new SecurityException(JOB_NOT_EXISTENT); 91 92 // check if user is granted to administer a job-parenting project 93 var administrationGrantedProjects = projectDao 94 .GetAdministrationGrantedProjectsForUser(currentUserId) 95 .ToList(); 96 if (administrationGrantedProjects.Contains(job.Project)) return; 97 66 98 AuthorizeJob(pm, jobId, requiredPermission); 67 99 }); 68 100 } 69 101 102 // authorize if user is admin or resource owner 70 103 public void AuthorizeForResourceAdministration(Guid resourceId) { 104 var currentUserId = UserManager.CurrentUserId; 71 105 var pm = PersistenceManager; 72 106 var resourceDao = pm.ResourceDao; 73 107 pm.UseTransaction(() => { 74 108 var resource = resourceDao.GetById(resourceId); 75 if (resource == null) throw new SecurityException(NOT_AUTHORIZED); 76 if (resource.OwnerUserId != UserManager.CurrentUserId 109 if (resource == null) throw new SecurityException(NOT_AUTHORIZED_USERRESOURCE); 110 111 if (resource.OwnerUserId != currentUserId 77 112 && !RoleVerifier.IsInRole(HiveRoles.Administrator)) { 78 throw new SecurityException(NOT_AUTHORIZED); 79 } 80 }); 113 throw new SecurityException(NOT_AUTHORIZED_USERRESOURCE); 114 } 115 }); 116 } 117 118 // authorize if user is admin, project owner or owner of a parent project 119 public void AuthorizeForProjectAdministration(Guid projectId, bool parentalOwnership) { 120 if (projectId == null || projectId == Guid.Empty) return; 121 var currentUserId = UserManager.CurrentUserId; 122 var pm = PersistenceManager; 123 var projectDao = pm.ProjectDao; 124 pm.UseTransaction(() => { 125 var project = projectDao.GetById(projectId); 126 if (project == null) throw new ArgumentException(PROJECT_NOT_EXISTENT); 127 if(!RoleVerifier.IsInRole(HiveRoles.Administrator) 128 && !project.ParentProjectId.HasValue) { 129 throw new SecurityException(NOT_AUTHORIZED_USERPROJECT); 130 } 131 132 List<Project> projectBranch = null; 133 if(parentalOwnership) projectBranch = projectDao.GetParentProjectsById(projectId).ToList(); 134 else projectBranch = projectDao.GetCurrentAndParentProjectsById(projectId).ToList(); 135 136 if(!RoleVerifier.IsInRole(HiveRoles.Administrator) 137 && !projectBranch.Select(x => x.OwnerUserId).Contains(currentUserId)) { 138 throw new SecurityException(NOT_AUTHORIZED_USERPROJECT); 139 } 140 }); 141 } 142 143 // authorize if user is admin, or owner of a project or parent project, for which the resources are assigned to 144 public void AuthorizeForProjectResourceAdministration(Guid projectId, IEnumerable<Guid> resourceIds) { 145 if (projectId == null || projectId == Guid.Empty) return; 146 var currentUserId = UserManager.CurrentUserId; 147 var pm = PersistenceManager; 148 var projectDao = pm.ProjectDao; 149 var resourceDao = pm.ResourceDao; 150 var assignedProjectResourceDao = pm.AssignedProjectResourceDao; 151 pm.UseTransaction(() => { 152 // check if project exists (not necessary) 153 var project = projectDao.GetById(projectId); 154 if (project == null) throw new SecurityException(NOT_AUTHORIZED_USERRESOURCE); 155 156 // check if resourceIds exist 157 if (resourceIds != null && resourceIds.Any() && !resourceDao.CheckExistence(resourceIds)) 158 throw new SecurityException(NOT_AUTHORIZED_USERRESOURCE); 159 160 // check if user is admin 161 if (RoleVerifier.IsInRole(HiveRoles.Administrator)) return; 162 163 // check if user is owner of the project or a parent project 164 var projectBranch = projectDao.GetCurrentAndParentProjectsById(projectId).ToList(); 165 if (!projectBranch.Select(x => x.OwnerUserId).Contains(currentUserId) 166 && !RoleVerifier.IsInRole(HiveRoles.Administrator)) { 167 throw new SecurityException(NOT_AUTHORIZED_USERPROJECT); 168 } 169 170 // check if the all argument resourceIds are among the assigned resources of the owned projects 171 var grantedResourceIds = assignedProjectResourceDao.GetAllGrantedResourceIdsOfOwnedParentProjects(projectId, currentUserId).ToList(); 172 if(resourceIds.Except(grantedResourceIds).Any()) { 173 throw new SecurityException(NOT_AUTHORIZED_USERRESOURCE); 174 } 175 }); 176 } 177 178 // Check if a project is authorized to use a list of resources 179 public void AuthorizeProjectForResourcesUse(Guid projectId, IEnumerable<Guid> resourceIds) { 180 if (projectId == null || projectId == Guid.Empty || resourceIds == null || !resourceIds.Any()) return; 181 var pm = PersistenceManager; 182 var assignedProjectResourceDao = pm.AssignedProjectResourceDao; 183 if (!assignedProjectResourceDao.CheckProjectGrantedForResources(projectId, resourceIds)) 184 throw new SecurityException(NOT_AUTHORIZED_PROJECTRESOURCE); 185 } 186 187 // Check if current user is authorized to use an explicit project (e.g. in order to add a job) 188 // note: administrators and project owner are NOT automatically granted 189 public void AuthorizeUserForProjectUse(Guid userId, Guid projectId) { 190 if(userId == null || userId == Guid.Empty) { 191 throw new SecurityException(USER_NOT_IDENTIFIED); 192 } 193 if(projectId == null) return; 194 195 var pm = PersistenceManager; 196 // collect current and group membership Ids 197 var userAndGroupIds = new List<Guid>() { userId }; 198 userAndGroupIds.AddRange(UserManager.GetUserGroupIdsOfUser(userId)); 199 // perform the actual check 200 var projectPermissionDao = pm.ProjectPermissionDao; 201 if (!projectPermissionDao.CheckUserGrantedForProject(projectId, userAndGroupIds)) { 202 throw new SecurityException(NOT_AUTHORIZED_USERPROJECT); 203 } 81 204 } 82 205 … … 93 216 94 217 private void AuthorizeJob(IPersistenceManager pm, Guid jobId, DT.Permission requiredPermission) { 218 var currentUserId = UserManager.CurrentUserId; 95 219 var requiredPermissionEntity = requiredPermission.ToEntity(); 96 DA.Permission permission = GetPermissionForJob(pm, jobId, UserManager.CurrentUserId);220 DA.Permission permission = GetPermissionForJob(pm, jobId, currentUserId); 97 221 if (permission == Permission.NotAllowed 98 222 || ((permission != requiredPermissionEntity) && requiredPermissionEntity == Permission.Full)) { 99 throw new SecurityException(NOT_AUTHORIZED );223 throw new SecurityException(NOT_AUTHORIZED_USERJOB); 100 224 } 101 225 } -
branches/2925_AutoDiffForDynamicalModels/HeuristicLab.Services.Hive/3.3/Manager/EventManager.cs
r15583 r16386 34 34 public void Cleanup() { 35 35 var pm = PersistenceManager; 36 37 pm.UseTransaction(() => { 38 FinishJobDeletion(pm); 39 pm.SubmitChanges(); 40 }); 41 36 42 pm.UseTransaction(() => { 37 43 SetTimeoutSlavesOffline(pm); … … 45 51 pm.SubmitChanges(); 46 52 }); 53 } 54 55 /// <summary> 56 /// Deletes all jobs which are in state "DeletionPending" (this will include all corresponding tasks). 57 /// The state "DeletionPending" is set by HiveJanitor > StatisticsGenerator 58 /// </summary> 59 private void FinishJobDeletion(IPersistenceManager pm) { 60 var jobDao = pm.JobDao; 61 jobDao.DeleteByState(JobState.DeletionPending); 47 62 } 48 63 -
branches/2925_AutoDiffForDynamicalModels/HeuristicLab.Services.Hive/3.3/Manager/HeartbeatManager.cs
r15583 r16386 142 142 private IEnumerable<MessageContainer> UpdateTasks(IPersistenceManager pm, Heartbeat heartbeat, bool isAllowedToCalculate) { 143 143 var taskDao = pm.TaskDao; 144 var assignedResourceDao = pm.AssignedResourceDao; 144 var jobDao = pm.JobDao; 145 var assignedJobResourceDao = pm.AssignedJobResourceDao; 145 146 var actions = new List<MessageContainer>(); 146 147 if (heartbeat.JobProgress == null || !heartbeat.JobProgress.Any()) 147 148 return actions; 148 149 149 if (!isAllowedToCalculate && heartbeat.JobProgress.Count != 0) { 150 actions.Add(new MessageContainer(MessageContainer.MessageType.PauseAll)); 151 } else { 152 // select all tasks and statelogs with one query 153 var taskIds = heartbeat.JobProgress.Select(x => x.Key).ToList(); 154 var taskInfos = pm.UseTransaction(() => 155 (from task in taskDao.GetAll() 156 where taskIds.Contains(task.TaskId) 157 let lastStateLog = task.StateLogs.OrderByDescending(x => x.DateTime).FirstOrDefault() 158 select new { 159 TaskId = task.TaskId, 160 Command = task.Command, 161 SlaveId = lastStateLog != null ? lastStateLog.SlaveId : default(Guid) 162 }).ToList() 163 ); 164 165 // process the jobProgresses 166 foreach (var jobProgress in heartbeat.JobProgress) { 167 var progress = jobProgress; 168 var curTask = taskInfos.SingleOrDefault(x => x.TaskId == progress.Key); 169 if (curTask == null) { 170 actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, progress.Key)); 171 LogFactory.GetLogger(this.GetType().Namespace).Log("Task on slave " + heartbeat.SlaveId + " does not exist in DB: " + jobProgress.Key); 172 } else { 173 var slaveId = curTask.SlaveId; 174 if (slaveId == Guid.Empty || slaveId != heartbeat.SlaveId) { 175 // assigned slave does not match heartbeat 150 var jobIdsWithStatisticsPending = jobDao.GetJobIdsByState(DA.JobState.StatisticsPending).ToList(); 151 152 // select all tasks and statelogs with one query 153 var taskIds = heartbeat.JobProgress.Select(x => x.Key).ToList(); 154 var taskInfos = pm.UseTransaction(() => 155 (from task in taskDao.GetAll() 156 where taskIds.Contains(task.TaskId) 157 let lastStateLog = task.StateLogs.OrderByDescending(x => x.DateTime).FirstOrDefault() 158 select new { 159 TaskId = task.TaskId, 160 JobId = task.JobId, 161 State = task.State, 162 Command = task.Command, 163 SlaveId = lastStateLog != null ? lastStateLog.SlaveId : default(Guid) 164 }).ToList() 165 ); 166 167 // process the jobProgresses 168 foreach (var jobProgress in heartbeat.JobProgress) { 169 var progress = jobProgress; 170 var curTask = taskInfos.SingleOrDefault(x => x.TaskId == progress.Key); 171 if (curTask == null) { 172 actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, progress.Key)); 173 LogFactory.GetLogger(this.GetType().Namespace).Log("Task on slave " + heartbeat.SlaveId + " does not exist in DB: " + jobProgress.Key); 174 } else if (jobIdsWithStatisticsPending.Contains(curTask.JobId)) { 175 // parenting job of current task has been requested for deletion (indicated by job state "Statistics Pending") 176 // update task execution time 177 pm.UseTransaction(() => { 178 taskDao.UpdateExecutionTime(curTask.TaskId, progress.Value.TotalMilliseconds); 179 }); 180 actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, curTask.TaskId)); 181 LogFactory.GetLogger(this.GetType().Namespace).Log("Abort task " + curTask.TaskId + " on slave " + heartbeat.SlaveId + ". The parenting job " + curTask.JobId + " was requested to be deleted."); 182 } else if (curTask.SlaveId == Guid.Empty || curTask.SlaveId != heartbeat.SlaveId) { 183 // assigned slave does not match heartbeat 184 actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, curTask.TaskId)); 185 LogFactory.GetLogger(this.GetType().Namespace).Log("The slave " + heartbeat.SlaveId + " is not supposed to calculate task: " + curTask.TaskId); 186 } else if (!isAllowedToCalculate) { 187 actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.TaskId)); 188 LogFactory.GetLogger(this.GetType().Namespace).Log("The slave " + heartbeat.SlaveId + " is not allowed to calculate any tasks tue to a downtime. The task is paused."); 189 } else if (!assignedJobResourceDao.CheckJobGrantedForResource(curTask.JobId, heartbeat.SlaveId)) { 190 // slaveId (and parent resourceGroupIds) are not among the assigned resources ids for task-parenting job 191 // this might happen when (a) job-resource assignment has been changed (b) slave is moved to different group 192 actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.TaskId)); 193 LogFactory.GetLogger(this.GetType().Namespace).Log("The slave " + heartbeat.SlaveId + " is not granted to calculate task: " + curTask.TaskId + " of job: " + curTask.JobId); 194 } else { 195 // update task execution time 196 pm.UseTransaction(() => { 197 taskDao.UpdateExecutionTime(curTask.TaskId, progress.Value.TotalMilliseconds); 198 }); 199 switch (curTask.Command) { 200 case DA.Command.Stop: 201 actions.Add(new MessageContainer(MessageContainer.MessageType.StopTask, curTask.TaskId)); 202 break; 203 case DA.Command.Pause: 204 actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.TaskId)); 205 break; 206 case DA.Command.Abort: 176 207 actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, curTask.TaskId)); 177 LogFactory.GetLogger(this.GetType().Namespace).Log("The slave " + heartbeat.SlaveId + " is not supposed to calculate task: " + curTask.TaskId); 178 } else if (!assignedResourceDao.TaskIsAllowedToBeCalculatedBySlave(curTask.TaskId, heartbeat.SlaveId)) { 179 // assigned resources ids of task do not match with slaveId (and parent resourceGroupIds); this might happen when slave is moved to different group 180 actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.TaskId)); 181 } else { 182 // update task execution time 183 pm.UseTransaction(() => { 184 taskDao.UpdateExecutionTime(curTask.TaskId, progress.Value.TotalMilliseconds); 185 }); 186 switch (curTask.Command) { 187 case DA.Command.Stop: 188 actions.Add(new MessageContainer(MessageContainer.MessageType.StopTask, curTask.TaskId)); 189 break; 190 case DA.Command.Pause: 191 actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.TaskId)); 192 break; 193 case DA.Command.Abort: 194 actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, curTask.TaskId)); 195 break; 196 } 197 } 198 } 199 } 200 } 208 break; 209 } 210 } 211 212 } 201 213 return actions; 202 214 }
Note: See TracChangeset
for help on using the changeset viewer.