Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs @ 15503

Last change on this file since 15503 was 15503, checked in by jzenisek, 6 years ago

#2839 added ResourcePermission handling (still in progress)

File size: 50.7 KB
RevLine 
[12691]1#region License Information
2/* HeuristicLab
[14185]3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
[12691]4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
[12584]23using System.Collections.Generic;
24using System.Linq;
[12691]25using System.Security;
26using System.ServiceModel;
[12584]27using HeuristicLab.Services.Access;
28using HeuristicLab.Services.Hive.DataAccess.Interfaces;
29using HeuristicLab.Services.Hive.DataTransfer;
[12691]30using HeuristicLab.Services.Hive.Manager;
[12584]31using HeuristicLab.Services.Hive.ServiceContracts;
32using DA = HeuristicLab.Services.Hive.DataAccess;
33using DT = HeuristicLab.Services.Hive.DataTransfer;
34
35namespace HeuristicLab.Services.Hive {
[12691]36  /// <summary>
37  /// Implementation of the Hive service (interface <see cref="IHiveService"/>).
38  /// We need 'IgnoreExtensionDataObject' Attribute for the slave to work.
39  /// </summary>
40  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, IgnoreExtensionDataObject = true)]
41  [HiveOperationContextBehavior]
[12861]42  public class HiveService : IHiveService {
[15503]43    private const string NOT_AUTHORIZED_RESOURCE = "Current user is not authorized to access the requested resource";
44    private const string NOT_AUTHORIZED_PROJECT = "Current user is not authorized to access the requested project";
45
[12584]46    private static readonly DA.TaskState[] CompletedStates = { DA.TaskState.Finished, DA.TaskState.Aborted, DA.TaskState.Failed };
47
48    private IPersistenceManager PersistenceManager {
49      get { return ServiceLocator.Instance.PersistenceManager; }
50    }
51
52    private IUserManager UserManager {
53      get { return ServiceLocator.Instance.UserManager; }
54    }
55
56    private IRoleVerifier RoleVerifier {
57      get { return ServiceLocator.Instance.RoleVerifier; }
58    }
59
60    private IAuthorizationManager AuthorizationManager {
61      get { return ServiceLocator.Instance.AuthorizationManager; }
62    }
[12691]63    private IEventManager EventManager {
64      get { return ServiceLocator.Instance.EventManager; }
65    }
[12861]66    private HeartbeatManager HeartbeatManager {
67      get { return ServiceLocator.Instance.HeartbeatManager; }
[12691]68    }
[12584]69
[12691]70    #region Task Methods
[12584]71    public Guid AddTask(DT.Task task, DT.TaskData taskData, IEnumerable<Guid> resourceIds) {
72      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]73      var pm = PersistenceManager;
[12691]74      using (new PerformanceLogger("AddTask")) {
[12584]75        var taskDao = pm.TaskDao;
76        var stateLogDao = pm.StateLogDao;
[15497]77
78        var resourceDao = pm.ResourceDao;
79        var resourcePermissionDao = pm.ResourcePermissionDao;
80        var currentUserId = UserManager.CurrentUserId;
81
[15500]82        //// V1 user grant check
83        //// get granted (parent) resources
[15503]84        //var allGrantedResourceIds = pm.UseTransaction(() => {
[15500]85        //  return resourcePermissionDao.GetAll().ToList()
86        //    .Where(x => x.GrantedUserId == currentUserId
87        //      || UserManager.VerifyUser(currentUserId, new List<Guid> { x.GrantedUserId }))
88        //    .Select(y => y.ResourceId)
89        //    .ToList();
90        //});
[15497]91
[15500]92        //// get children of granted parent resources
93        //var userGrantedChildResourceIds = pm.UseTransaction(() => {
[15503]94        //  return allGrantedResourceIds
[15500]95        //  .SelectMany(x => resourceDao.GetResourcesByParentId(x))
96        //  .Select(y => y.ResourceId);
97        //});
[15497]98
[15500]99        //// join list of parent and child resources
[15503]100        //allGrantedResourceIds.AddRange(userGrantedChildResourceIds);
[15497]101
[15500]102        // V2 user grant check
[15503]103        var allGrantedResourceIds = pm.UseTransaction(() => {
[15500]104          var groupAndGroupIds = new List<Guid> { currentUserId };
105          groupAndGroupIds.AddRange(UserManager.GetUserGroupIdsOfUser(currentUserId));
[15503]106          return resourcePermissionDao.GetByUserAndGroupIds(groupAndGroupIds).ToList();
[15500]107        });
108
[15503]109        // get all owned resourceIds
110        var ownedResourceIds = resourceDao.GetAll()
111          .Where(x => x.OwnerUserId == currentUserId)
112          .Select(x => x.ResourceId).ToList();
113
114        // join list of owned and granted resourceIds
115        allGrantedResourceIds.AddRange(ownedResourceIds);
116
117        // filter initial resourceId list with the list of the granted ones
118        var filteredResourceIds = resourceIds
119          .Where(x => allGrantedResourceIds.Contains(x))
120          .Distinct().ToList();
121
122        // TODO-JAN: Additional Filtering:
123        // TODO-JAN: user - project check; project - resource check
124
125
[12584]126        var newTask = task.ToEntity();
127        newTask.JobData = taskData.ToEntity();
128        newTask.JobData.LastUpdate = DateTime.Now;
[15503]129        newTask.AssignedTaskResources.AddRange(filteredResourceIds.Select(
[15411]130          x => new DA.AssignedTaskResource {
[12584]131            ResourceId = x
132          }));
133        newTask.State = DA.TaskState.Waiting;
134        return pm.UseTransaction(() => {
135          taskDao.Save(newTask);
136          pm.SubmitChanges();
137          stateLogDao.Save(new DA.StateLog {
138            State = DA.TaskState.Waiting,
139            DateTime = DateTime.Now,
140            TaskId = newTask.TaskId,
141            UserId = UserManager.CurrentUserId,
142            SlaveId = null,
143            Exception = null
144          });
145          pm.SubmitChanges();
146          return newTask.TaskId;
147        }, false, true);
148      }
149    }
150
151    public Guid AddChildTask(Guid parentTaskId, DT.Task task, DT.TaskData taskData) {
152      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
153      IEnumerable<Guid> resourceIds;
[12857]154      var pm = PersistenceManager;
[12691]155      using (new PerformanceLogger("AddChildTask")) {
[15411]156        var assignedTaskResourceDao = pm.AssignedTaskResourceDao;
[12584]157        resourceIds = pm.UseTransaction(() => {
[15411]158          return assignedTaskResourceDao.GetByTaskId(parentTaskId)
[12584]159            .Select(x => x.ResourceId)
160            .ToList();
161        });
162      }
163      task.ParentTaskId = parentTaskId;
164      return AddTask(task, taskData, resourceIds);
165    }
166
167    public DT.Task GetTask(Guid taskId) {
168      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
169      AuthorizationManager.AuthorizeForTask(taskId, Permission.Read);
[12857]170      var pm = PersistenceManager;
[12691]171      using (new PerformanceLogger("GetTask")) {
[12584]172        var taskDao = pm.TaskDao;
173        return pm.UseTransaction(() => {
174          var task = taskDao.GetById(taskId);
175          return task.ToDto();
176        });
177      }
178    }
179
180    public IEnumerable<DT.LightweightTask> GetLightweightJobTasks(Guid jobId) {
181      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
182      AuthorizationManager.AuthorizeForJob(jobId, Permission.Read);
[12857]183      var pm = PersistenceManager;
[12691]184      using (new PerformanceLogger("GetLightweightJobTasks")) {
[12584]185        var taskDao = pm.TaskDao;
186        return pm.UseTransaction(() => {
187          return taskDao.GetByJobId(jobId)
[12691]188            .ToList()
[12584]189            .Select(x => new DT.LightweightTask {
190              Id = x.TaskId,
191              ExecutionTime = TimeSpan.FromMilliseconds(x.ExecutionTimeMs),
192              ParentTaskId = x.ParentTaskId,
193              StateLog = x.StateLogs.OrderBy(y => y.DateTime)
194                                    .Select(z => z.ToDto())
195                                    .ToList(),
196              State = x.State.ToDto(),
197              Command = x.Command.ToDto(),
198              LastTaskDataUpdate = x.JobData.LastUpdate
[12691]199            })
200            .ToList();
[12584]201        }, false, true);
202      }
203    }
204
205    public IEnumerable<DT.LightweightTask> GetLightweightJobTasksWithoutStateLog(Guid jobId) {
206      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
207      AuthorizationManager.AuthorizeForJob(jobId, Permission.Read);
[12857]208      var pm = PersistenceManager;
[12691]209      using (new PerformanceLogger("GetLightweightJobTasksWithoutStateLog")) {
[12584]210        var taskDao = pm.TaskDao;
211        return pm.UseTransaction(() => {
212          return taskDao.GetByJobId(jobId)
[12691]213            .ToList()
[12584]214            .Select(x => new DT.LightweightTask {
215              Id = x.TaskId,
216              ExecutionTime = TimeSpan.FromMilliseconds(x.ExecutionTimeMs),
217              ParentTaskId = x.ParentTaskId,
218              StateLog = new List<DT.StateLog>(),
219              State = x.State.ToDto(),
220              Command = x.Command.ToDto(),
221              LastTaskDataUpdate = x.JobData.LastUpdate
[12691]222            })
223            .ToList();
[12584]224        }, false, true);
225      }
226    }
227
228    public DT.TaskData GetTaskData(Guid taskId) {
229      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
230      AuthorizationManager.AuthorizeForTask(taskId, Permission.Read);
[12857]231      var pm = PersistenceManager;
[12691]232      using (new PerformanceLogger("GetTaskData")) {
[12584]233        var taskDataDao = pm.TaskDataDao;
234        return pm.UseTransaction(() => taskDataDao.GetById(taskId).ToDto());
235      }
236    }
237
238    public void UpdateTask(DT.Task taskDto) {
239      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
240      AuthorizationManager.AuthorizeForTask(taskDto.Id, Permission.Full);
[12857]241      var pm = PersistenceManager;
[12691]242      using (new PerformanceLogger("UpdateTask")) {
[12584]243        var taskDao = pm.TaskDao;
244        pm.UseTransaction(() => {
245          var task = taskDao.GetById(taskDto.Id);
246          taskDto.CopyToEntity(task);
247          pm.SubmitChanges();
248        });
249      }
250    }
251
252    public void UpdateTaskData(DT.Task taskDto, DT.TaskData taskDataDto) {
253      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
254      AuthorizationManager.AuthorizeForTask(taskDto.Id, Permission.Full);
[12857]255      var pm = PersistenceManager;
[12691]256      using (new PerformanceLogger("UpdateTaskData")) {
[12584]257        var taskDao = pm.TaskDao;
258        var taskDataDao = pm.TaskDataDao;
259        pm.UseTransaction(() => {
260          var task = taskDao.GetById(taskDto.Id);
261          var taskData = taskDataDao.GetById(taskDataDto.TaskId);
262          taskDto.CopyToEntity(task);
263          taskDataDto.CopyToEntity(taskData);
264          taskData.LastUpdate = DateTime.Now;
265          pm.SubmitChanges();
266        });
267      }
268    }
269
270    public DT.Task UpdateTaskState(Guid taskId, DT.TaskState taskState, Guid? slaveId, Guid? userId, string exception) {
271      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
272      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
[12857]273      var pm = PersistenceManager;
[12691]274      using (new PerformanceLogger("UpdateTaskState")) {
[12584]275        var taskDao = pm.TaskDao;
276        return pm.UseTransaction(() => {
277          var task = taskDao.GetById(taskId);
278          UpdateTaskState(pm, task, taskState, slaveId, userId, exception);
279          pm.SubmitChanges();
280          return task.ToDto();
281        });
282      }
283    }
[12691]284    #endregion
[12584]285
[12691]286    #region Task Control Methods
[12584]287    public void StopTask(Guid taskId) {
288      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
289      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
[12857]290      var pm = PersistenceManager;
[12691]291      using (new PerformanceLogger("StopTask")) {
[12584]292        var taskDao = pm.TaskDao;
293        pm.UseTransaction(() => {
294          var task = taskDao.GetById(taskId);
295          if (task.State == DA.TaskState.Calculating || task.State == DA.TaskState.Transferring) {
296            task.Command = DA.Command.Stop;
297          } else if (task.State != DA.TaskState.Aborted
298                     && task.State != DA.TaskState.Finished
299                     && task.State != DA.TaskState.Failed) {
300            UpdateTaskState(pm, task, DT.TaskState.Aborted, null, null, string.Empty);
301          }
302          pm.SubmitChanges();
303        });
304      }
305    }
306
307    public void PauseTask(Guid taskId) {
308      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
309      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
[12857]310      var pm = PersistenceManager;
[12691]311      using (new PerformanceLogger("PauseTask")) {
[12584]312        var taskDao = pm.TaskDao;
313        pm.UseTransaction(() => {
314          var task = taskDao.GetById(taskId);
315          if (task.State == DA.TaskState.Calculating || task.State == DA.TaskState.Transferring) {
316            task.Command = DA.Command.Pause;
[15121]317          } else if (task.State != DA.TaskState.Paused
318                     && task.State != DA.TaskState.Aborted
[14901]319                     && task.State != DA.TaskState.Finished
320                     && task.State != DA.TaskState.Failed) {
321            UpdateTaskState(pm, task, DT.TaskState.Paused, null, null, string.Empty);
[12584]322          }
323          pm.SubmitChanges();
324        });
325      }
326    }
327
328    public void RestartTask(Guid taskId) {
329      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
330      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
[12857]331      var pm = PersistenceManager;
[12691]332      using (new PerformanceLogger("RestartTask")) {
[12584]333        var taskDao = pm.TaskDao;
334        pm.UseTransaction(() => {
335          var task = taskDao.GetById(taskId);
336          task.Command = null;
337          UpdateTaskState(pm, task, DT.TaskState.Waiting, null, UserManager.CurrentUserId, string.Empty);
338          pm.SubmitChanges();
339        });
340      }
341    }
[12691]342    #endregion
[12584]343
[12691]344    #region Job Methods
345    public DT.Job GetJob(Guid id) {
[12584]346      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12691]347      AuthorizationManager.AuthorizeForJob(id, DT.Permission.Read);
[12857]348      var pm = PersistenceManager;
[12691]349      using (new PerformanceLogger("GetJob")) {
[12584]350        var jobDao = pm.JobDao;
351        var jobPermissionDao = pm.JobPermissionDao;
352        var taskDao = pm.TaskDao;
[12691]353        var currentUserId = UserManager.CurrentUserId;
[12584]354        return pm.UseTransaction(() => {
355          var job = jobDao.GetById(id).ToDto();
356          if (job != null) {
357            var statistics = taskDao.GetByJobId(job.Id)
358              .GroupBy(x => x.JobId)
359              .Select(x => new {
360                TotalCount = x.Count(),
361                CalculatingCount = x.Count(y => y.State == DA.TaskState.Calculating),
362                FinishedCount = x.Count(y => CompletedStates.Contains(y.State))
363              }).FirstOrDefault();
364            if (statistics != null) {
365              job.JobCount = statistics.TotalCount;
366              job.CalculatingCount = statistics.CalculatingCount;
367              job.FinishedCount = statistics.FinishedCount;
368            }
[12932]369            job.OwnerUsername = UserManager.GetUserNameById(job.OwnerUserId);
[12691]370            if (currentUserId == job.OwnerUserId) {
371              job.Permission = Permission.Full;
372            } else {
373              var jobPermission = jobPermissionDao.GetByJobAndUserId(job.Id, currentUserId);
374              job.Permission = jobPermission == null ? Permission.NotAllowed : jobPermission.Permission.ToDto();
375            }
[12584]376          }
377          return job;
378        });
379      }
380    }
381
[12691]382    public IEnumerable<DT.Job> GetJobs() {
383      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]384      var pm = PersistenceManager;
[12691]385      using (new PerformanceLogger("GetJobs")) {
386        var jobDao = pm.JobDao;
387        var jobPermissionDao = pm.JobPermissionDao;
388        var taskDao = pm.TaskDao;
389        var currentUserId = UserManager.CurrentUserId;
390        return pm.UseTransaction(() => {
391          var jobs = jobDao.GetAll()
392            .Where(x => x.OwnerUserId == currentUserId
393                     || x.JobPermissions.Count(y => y.Permission != DA.Permission.NotAllowed
394                                                 && y.GrantedUserId == currentUserId) > 0)
395            .Select(x => x.ToDto())
396            .ToList();
397          var statistics = taskDao.GetAll()
398              .GroupBy(x => x.JobId)
399              .Select(x => new {
400                x.Key,
401                TotalCount = x.Count(),
402                CalculatingCount = x.Count(y => y.State == DA.TaskState.Calculating),
403                FinishedCount = x.Count(y => CompletedStates.Contains(y.State))
404              })
405              .ToList();
406          foreach (var job in jobs) {
407            var statistic = statistics.FirstOrDefault(x => x.Key == job.Id);
408            if (statistic != null) {
409              job.JobCount = statistic.TotalCount;
410              job.CalculatingCount = statistic.CalculatingCount;
411              job.FinishedCount = statistic.FinishedCount;
412            }
[12932]413            job.OwnerUsername = UserManager.GetUserNameById(job.OwnerUserId);
[12691]414            if (currentUserId == job.OwnerUserId) {
415              job.Permission = Permission.Full;
416            } else {
417              var jobPermission = jobPermissionDao.GetByJobAndUserId(job.Id, currentUserId);
418              job.Permission = jobPermission == null ? Permission.NotAllowed : jobPermission.Permission.ToDto();
419            }
420          }
421          return jobs;
422        });
423      }
[12584]424    }
425
[12776]426    public Guid AddJob(DT.Job jobDto) {
[12691]427      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]428      var pm = PersistenceManager;
[12691]429      using (new PerformanceLogger("AddJob")) {
430        var jobDao = pm.JobDao;
[12776]431        var userPriorityDao = pm.UserPriorityDao;
[12691]432        return pm.UseTransaction(() => {
433          jobDto.OwnerUserId = UserManager.CurrentUserId;
434          jobDto.DateCreated = DateTime.Now;
435          var job = jobDao.Save(jobDto.ToEntity());
[12776]436          if (userPriorityDao.GetById(jobDto.OwnerUserId) == null) {
437            userPriorityDao.Save(new DA.UserPriority {
438              UserId = jobDto.OwnerUserId,
439              DateEnqueued = jobDto.DateCreated
440            });
441          }
[12691]442          pm.SubmitChanges();
443          return job.JobId;
444        });
445      }
[12584]446    }
447
[12691]448    public void UpdateJob(DT.Job jobDto) {
449      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
450      AuthorizationManager.AuthorizeForJob(jobDto.Id, DT.Permission.Full);
[12857]451      var pm = PersistenceManager;
[12691]452      using (new PerformanceLogger("UpdateJob")) {
453        bool exists = true;
454        var jobDao = pm.JobDao;
455        pm.UseTransaction(() => {
456          var job = jobDao.GetById(jobDto.Id);
457          if (job == null) {
458            exists = false;
459            job = new DA.Job();
460          }
461          jobDto.CopyToEntity(job);
462          if (!exists) {
463            jobDao.Save(job);
464          }
465          pm.SubmitChanges();
466        });
467      }
[12584]468    }
469
[12691]470    public void DeleteJob(Guid jobId) {
471      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
472      AuthorizationManager.AuthorizeForJob(jobId, DT.Permission.Full);
[12857]473      var pm = PersistenceManager;
[12691]474      using (new PerformanceLogger("DeleteJob")) {
475        var jobDao = pm.JobDao;
476        pm.UseTransaction(() => {
[12776]477          // child task will be deleted by db-trigger
[12691]478          jobDao.Delete(jobId);
479          pm.SubmitChanges();
480        });
481      }
[12584]482    }
[12691]483    #endregion
[12584]484
[12691]485    #region JobPermission Methods
486    public void GrantPermission(Guid jobId, Guid grantedUserId, DT.Permission permission) {
487      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
488      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
[12857]489      var pm = PersistenceManager;
[12691]490      using (new PerformanceLogger("GrantPermission")) {
491        var jobPermissionDao = pm.JobPermissionDao;
492        var currentUserId = UserManager.CurrentUserId;
493        pm.UseTransaction(() => {
494          jobPermissionDao.SetJobPermission(jobId, currentUserId, grantedUserId, permission.ToEntity());
495          pm.SubmitChanges();
496        });
497      }
[12584]498    }
499
[12691]500    public void RevokePermission(Guid jobId, Guid grantedUserId) {
501      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
502      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
[12857]503      var pm = PersistenceManager;
[12691]504      using (new PerformanceLogger("RevokePermission")) {
505        var jobPermissionDao = pm.JobPermissionDao;
506        var currentUserId = UserManager.CurrentUserId;
507        pm.UseTransaction(() => {
508          jobPermissionDao.SetJobPermission(jobId, currentUserId, grantedUserId, DA.Permission.NotAllowed);
509          pm.SubmitChanges();
510        });
511      }
[12584]512    }
513
514    public IEnumerable<JobPermission> GetJobPermissions(Guid jobId) {
[12691]515      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
516      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
[12857]517      var pm = PersistenceManager;
[12691]518      using (new PerformanceLogger("GetJobPermissions")) {
519        var jobPermissionDao = pm.JobPermissionDao;
520        return pm.UseTransaction(() => jobPermissionDao.GetByJobId(jobId)
521          .Select(x => x.ToDto())
522          .ToList()
523        );
524      }
[12584]525    }
526
[12926]527    // BackwardsCompatibility3.3
528    #region Backwards compatible code, remove with 3.4
[12584]529    public bool IsAllowedPrivileged() {
[12926]530      return true;
[12584]531    }
[12691]532    #endregion
[12926]533    #endregion
[12584]534
[12691]535    #region Login Methods
536    public void Hello(DT.Slave slaveInfo) {
537      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
538      if (UserManager.CurrentUser.UserName != "hiveslave") {
539        slaveInfo.OwnerUserId = UserManager.CurrentUserId;
540      }
[12857]541      var pm = PersistenceManager;
[12691]542      using (new PerformanceLogger("Hello")) {
543        var slaveDao = pm.SlaveDao;
544        pm.UseTransaction(() => {
545          var slave = slaveDao.GetById(slaveInfo.Id);
546          if (slave == null) {
547            slaveDao.Save(slaveInfo.ToEntity());
548          } else {
549            bool oldIsAllowedToCalculate = slave.IsAllowedToCalculate;
550            Guid? oldParentResourceId = slave.ParentResourceId;
551            slaveInfo.CopyToEntity(slave);
552            slave.IsAllowedToCalculate = oldIsAllowedToCalculate;
553            slave.ParentResourceId = oldParentResourceId;
554            slave.LastHeartbeat = DateTime.Now;
555            slave.SlaveState = DA.SlaveState.Idle;
556          }
557          pm.SubmitChanges();
558        });
559      }
[12584]560    }
561
562    public void GoodBye(Guid slaveId) {
[12691]563      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
[12857]564      var pm = PersistenceManager;
[12691]565      using (new PerformanceLogger("GoodBye")) {
566        var slaveDao = pm.SlaveDao;
567        pm.UseTransaction(() => {
568          var slave = slaveDao.GetById(slaveId);
569          if (slave != null) {
570            slave.SlaveState = DA.SlaveState.Offline;
571            pm.SubmitChanges();
572          }
573        });
574      }
[12584]575    }
[12691]576    #endregion
[12584]577
[12691]578    #region Heartbeat Methods
[12776]579    public List<MessageContainer> Heartbeat(DT.Heartbeat heartbeat) {
[12691]580      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
581      List<MessageContainer> result = new List<MessageContainer>();
582      try {
583        using (new PerformanceLogger("ProcessHeartbeat")) {
584          result = HeartbeatManager.ProcessHeartbeat(heartbeat);
585        }
[15379]586      } catch (Exception ex) {
[12691]587        DA.LogFactory.GetLogger(this.GetType().Namespace).Log(string.Format("Exception processing Heartbeat: {0}", ex));
588      }
589      if (HeuristicLab.Services.Hive.Properties.Settings.Default.TriggerEventManagerInHeartbeat) {
590        TriggerEventManager(false);
591      }
592      return result;
[12584]593    }
[12691]594    #endregion
[12584]595
[12691]596    #region Plugin Methods
[12776]597    public DT.Plugin GetPlugin(Guid pluginId) {
[12691]598      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
[12857]599      var pm = PersistenceManager;
[12691]600      using (new PerformanceLogger("GetPlugin")) {
601        var pluginDao = pm.PluginDao;
602        return pm.UseTransaction(() => pluginDao.GetById(pluginId).ToDto());
603      }
[12584]604    }
605
[12776]606    public Guid AddPlugin(DT.Plugin plugin, List<DT.PluginData> pluginData) {
[12691]607      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]608      var pm = PersistenceManager;
[12691]609      using (new PerformanceLogger("AddPlugin")) {
610        var pluginDao = pm.PluginDao;
611        plugin.UserId = UserManager.CurrentUserId;
612        plugin.DateCreated = DateTime.Now;
613        return pm.UseTransaction(() => {
614          var pluginEntity = pluginDao.GetByHash(plugin.Hash).SingleOrDefault();
615          if (pluginEntity != null) {
616            throw new FaultException<PluginAlreadyExistsFault>(new PluginAlreadyExistsFault(pluginEntity.PluginId));
617          }
618          pluginEntity = plugin.ToEntity();
619          foreach (var data in pluginData) {
[12776]620            data.PluginId = default(Guid); // real id will be assigned from linq2sql
[12691]621            pluginEntity.PluginData.Add(data.ToEntity());
622          }
623          pluginDao.Save(pluginEntity);
624          pm.SubmitChanges();
625          return pluginEntity.PluginId;
626        });
627      }
[12584]628    }
629
[12776]630    public IEnumerable<DT.Plugin> GetPlugins() {
[12691]631      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
[12857]632      var pm = PersistenceManager;
[12691]633      using (new PerformanceLogger("GetPlugins")) {
634        var pluginDao = pm.PluginDao;
635        return pm.UseTransaction(() => pluginDao.GetAll()
636          .Where(x => x.Hash != null)
637          .Select(x => x.ToDto())
638          .ToList()
639        );
640      }
[12584]641    }
642
[12776]643    public IEnumerable<DT.PluginData> GetPluginDatas(List<Guid> pluginIds) {
[12691]644      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
[12857]645      var pm = PersistenceManager;
[12691]646      using (new PerformanceLogger("GetPluginDatas")) {
647        var pluginDataDao = pm.PluginDataDao;
648        return pm.UseTransaction(() => pluginDataDao.GetAll()
649            .Where(x => pluginIds.Contains(x.PluginId))
650            .Select(x => x.ToDto())
651            .ToList()
652        );
653      }
[12584]654    }
[12691]655    #endregion
[12584]656
[15379]657    #region Project Methods
658    public Guid AddProject(DT.Project projectDto) {
659      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
660      var pm = PersistenceManager;
661      using (new PerformanceLogger("AddProject")) {
662        var projectDao = pm.ProjectDao;
663        return pm.UseTransaction(() => {
664          var project = projectDao.Save(projectDto.ToEntity());
665          pm.SubmitChanges();
666          return project.ProjectId;
667        });
668      }
669    }
670
671    public void UpdateProject(DT.Project projectDto) {
672      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
673      var pm = PersistenceManager;
674      using (new PerformanceLogger("UpdateProject")) {
675        var projectDao = pm.ProjectDao;
676        pm.UseTransaction(() => {
677          var project = projectDao.GetById(projectDto.Id);
678          if (project != null) {
679            projectDto.CopyToEntity(project);
680          } else {
681            projectDao.Save(projectDto.ToEntity());
682          }
683          pm.SubmitChanges();
684        });
685      }
686    }
687
688    public void DeleteProject(Guid projectId) {
689      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
[15380]690      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
[15379]691      var pm = PersistenceManager;
692      using (new PerformanceLogger("DeleteProject")) {
693        var projectDao = pm.ProjectDao;
694        pm.UseTransaction(() => {
695          projectDao.Delete(projectId);
696          pm.SubmitChanges();
697        });
698      }
699    }
700
701    public DT.Project GetProject(Guid projectId) {
702      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
703      var pm = PersistenceManager;
704      using (new PerformanceLogger("GetProject")) {
705        var projectDao = pm.ProjectDao;
706        return pm.UseTransaction(() => projectDao.GetById(projectId).ToDto());
707      }
708    }
709
710    public IEnumerable<DT.Project> GetProjects() {
[12691]711      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[15379]712      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
[12857]713      var pm = PersistenceManager;
[15379]714      using (new PerformanceLogger("GetProjects")) {
715        var projectDao = pm.ProjectDao;
716        var projectPermissionDao = pm.ProjectPermissionDao;
717        var currentUserId = UserManager.CurrentUserId;
718        return pm.UseTransaction(() => {
[15380]719          var projectPermissions = projectPermissionDao.GetAll();
[15379]720          return projectDao.GetAll().ToList()
721            .Where(x => isAdministrator
722              || x.OwnerUserId == currentUserId
[15380]723              || UserManager.VerifyUser(currentUserId, projectPermissions
[15379]724                  .Where(y => y.ProjectId == x.ProjectId)
725                  .Select(z => z.GrantedUserId)
726                  .ToList())
727              )
728            .Select(x => x.ToDto())
729            .ToList();
730        });
731      }
732    }
733    #endregion
734
735    #region ProjectPermission Methods
736    public void GrantProjectPermissions(Guid projectId, Guid[] grantedUserIds) {
737      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[15380]738      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
[15379]739      var pm = PersistenceManager;
740      using (new PerformanceLogger("GrantProjectPermissions")) {
[12691]741        pm.UseTransaction(() => {
[15379]742          var project = AuthorizeForProject(pm, projectId);
743          var projectPermissions = project.ProjectPermissions.ToList();
[12691]744          foreach (var id in grantedUserIds) {
[15379]745            if (projectPermissions.All(x => x.GrantedUserId != id)) {
746              project.ProjectPermissions.Add(new DA.ProjectPermission {
[12691]747                GrantedUserId = id,
748                GrantedByUserId = UserManager.CurrentUserId
749              });
750            }
751          }
752          pm.SubmitChanges();
753        });
754      }
[12584]755    }
756
[15379]757    public void RevokeProjectPermissions(Guid projectId, Guid[] grantedUserIds) {
[12691]758      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[15380]759      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
[12857]760      var pm = PersistenceManager;
[15379]761      using (new PerformanceLogger("RevokeProjectPermissions")) {
762        var projectPermissionDao = pm.ProjectPermissionDao;
[12691]763        pm.UseTransaction(() => {
[15379]764          projectPermissionDao.DeleteByProjectAndGrantedUserId(projectId, grantedUserIds);
[12972]765          pm.SubmitChanges();
[12691]766        });
767      }
[12584]768    }
769
[15379]770    public IEnumerable<DT.ProjectPermission> GetProjectPermissions(Guid projectId) {
[12691]771      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]772      var pm = PersistenceManager;
[15379]773      using (new PerformanceLogger("GetProjectPermissions")) {
774        var projectPermissionDao = pm.ProjectPermissionDao;
775        return pm.UseTransaction(() => projectPermissionDao.GetByProjectId(projectId)
[12691]776          .Select(x => x.ToDto())
777          .ToList()
778        );
779      }
[12584]780    }
[12691]781    #endregion
[12584]782
[15411]783    #region AssignedProjectResource Methods
784    public void AssignProjectResources(Guid projectId, Guid[] resourceIds) {
785      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
786      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
787      var pm = PersistenceManager;
788      using (new PerformanceLogger("AssignProjectResources")) {
789        pm.UseTransaction(() => {
790          var project = AuthorizeForProject(pm, projectId);
791          var assignedProjectResources = project.AssignedProjectResources.ToList();
792          foreach (var id in resourceIds) {
793            if (assignedProjectResources.All(x => x.ResourceId != id)) {
794              project.AssignedProjectResources.Add(new DA.AssignedProjectResource {
795                ResourceId = id
796              });
797            }
798          }
799          pm.SubmitChanges();
800        });
801      }
802    }
803
804    public void UnassignProjectResources(Guid projectId, Guid[] resourceIds) {
805      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
806      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
807      var pm = PersistenceManager;
808      using (new PerformanceLogger("UnassignProjectResources")) {
809        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
810        pm.UseTransaction(() => {
811          assignedProjectResourceDao.DeleteByProjectAndGrantedUserId(projectId, resourceIds);
812          pm.SubmitChanges();
813        });
814      }
815    }
816
817    public IEnumerable<AssignedProjectResource> GetAssignedResourcesForProject(Guid projectId) {
818      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
819      var pm = PersistenceManager;
820      using (new PerformanceLogger("GetAssignedResourcesForProject")) {
821        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
822        return pm.UseTransaction(() => assignedProjectResourceDao.GetByProjectId(projectId)
823          .Select(x => x.ToDto())
824          .ToList()
825        );
826      }
827    }
828    #endregion
829
[12691]830    #region Slave Methods
831    public Guid AddSlave(DT.Slave slaveDto) {
832      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
[12857]833      var pm = PersistenceManager;
[12691]834      using (new PerformanceLogger("AddSlave")) {
835        var slaveDao = pm.SlaveDao;
836        return pm.UseTransaction(() => {
837          var slave = slaveDao.Save(slaveDto.ToEntity());
838          pm.SubmitChanges();
839          return slave.ResourceId;
840        });
841      }
[12584]842    }
843
[12691]844    public Guid AddSlaveGroup(DT.SlaveGroup slaveGroupDto) {
845      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]846      var pm = PersistenceManager;
[12691]847      using (new PerformanceLogger("AddSlaveGroup")) {
848        var slaveGroupDao = pm.SlaveGroupDao;
849        return pm.UseTransaction(() => {
850          if (slaveGroupDto.Id == Guid.Empty) {
851            slaveGroupDto.Id = Guid.NewGuid();
852          }
853          var slaveGroup = slaveGroupDao.Save(slaveGroupDto.ToEntity());
854          pm.SubmitChanges();
855          return slaveGroup.ResourceId;
856        });
857      }
[12584]858    }
859
[12776]860    public DT.Slave GetSlave(Guid slaveId) {
[12691]861      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
[12857]862      var pm = PersistenceManager;
[12691]863      using (new PerformanceLogger("GetSlave")) {
864        var slaveDao = pm.SlaveDao;
865        return pm.UseTransaction(() => slaveDao.GetById(slaveId).ToDto());
866      }
[12584]867    }
868
[12776]869    public IEnumerable<DT.Slave> GetSlaves() {
[12691]870      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
871      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
[12857]872      var pm = PersistenceManager;
[12691]873      using (new PerformanceLogger("GetSlaves")) {
874        var slaveDao = pm.SlaveDao;
[15379]875        var resourcePermissionDao = pm.ProjectPermissionDao;
[12691]876        var currentUserId = UserManager.CurrentUserId;
877        return pm.UseTransaction(() => {
878          var resourcePermissions = resourcePermissionDao.GetAll();
[13142]879          return slaveDao.GetAll().ToList()
[12691]880            .Where(x => isAdministrator
881              || x.OwnerUserId == null
882              || x.OwnerUserId == currentUserId
883              || UserManager.VerifyUser(currentUserId, resourcePermissions
[15497]884                  //.Where(y => y.ResourceId == x.ResourceId)
[12691]885                  .Select(z => z.GrantedUserId)
886                  .ToList())
887              )
888            .Select(x => x.ToDto())
889            .ToList();
890        });
891      }
[12584]892    }
893
[12776]894    public IEnumerable<DT.SlaveGroup> GetSlaveGroups() {
[12691]895      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
896      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
[12857]897      var pm = PersistenceManager;
[12691]898      using (new PerformanceLogger("GetSlaveGroups")) {
899        var slaveGroupDao = pm.SlaveGroupDao;
[15379]900        var resourcePermissionDao = pm.ProjectPermissionDao;
[12691]901        var currentUserId = UserManager.CurrentUserId;
902        return pm.UseTransaction(() => {
903          var resourcePermissions = resourcePermissionDao.GetAll();
[13142]904          return slaveGroupDao.GetAll().ToList()
[12691]905            .Where(x => isAdministrator
906              || x.OwnerUserId == null
907              || x.OwnerUserId == currentUserId
908              || UserManager.VerifyUser(currentUserId, resourcePermissions
[15497]909                  //.Where(y => y.ResourceId == x.ResourceId)
[12691]910                  .Select(z => z.GrantedUserId)
911                  .ToList())
912              )
913            .Select(x => x.ToDto())
914            .ToList();
915        });
916      }
[12584]917    }
918
[12691]919    public void UpdateSlave(DT.Slave slaveDto) {
920      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]921      var pm = PersistenceManager;
[12691]922      using (new PerformanceLogger("UpdateSlave")) {
923        var slaveDao = pm.SlaveDao;
924        pm.UseTransaction(() => {
925          var slave = slaveDao.GetById(slaveDto.Id);
926          if (slave != null) {
927            slaveDto.CopyToEntity(slave);
928          } else {
929            slaveDao.Save(slaveDto.ToEntity());
930          }
931          pm.SubmitChanges();
932        });
933      }
[12584]934    }
935
[12691]936    public void UpdateSlaveGroup(DT.SlaveGroup slaveGroupDto) {
937      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]938      var pm = PersistenceManager;
[12691]939      using (new PerformanceLogger("UpdateSlaveGroup")) {
940        var slaveGroupDao = pm.SlaveGroupDao;
941        pm.UseTransaction(() => {
942          var slaveGroup = slaveGroupDao.GetById(slaveGroupDto.Id);
943          if (slaveGroup != null) {
944            slaveGroupDto.CopyToEntity(slaveGroup);
945          } else {
946            slaveGroupDao.Save(slaveGroupDto.ToEntity());
947          }
948          pm.SubmitChanges();
949        });
950      }
[12584]951    }
952
953    public void DeleteSlave(Guid slaveId) {
[12691]954      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
955      AuthorizationManager.AuthorizeForResourceAdministration(slaveId);
[12857]956      var pm = PersistenceManager;
[12691]957      using (new PerformanceLogger("DeleteSlave")) {
958        var slaveDao = pm.SlaveDao;
959        pm.UseTransaction(() => {
960          slaveDao.Delete(slaveId);
[12972]961          pm.SubmitChanges();
[12691]962        });
963      }
[12584]964    }
965
966    public void DeleteSlaveGroup(Guid slaveGroupId) {
[12691]967      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
968      AuthorizationManager.AuthorizeForResourceAdministration(slaveGroupId);
[12857]969      var pm = PersistenceManager;
[12691]970      using (new PerformanceLogger("DeleteSlaveGroup")) {
971        var slaveGroupDao = pm.SlaveGroupDao;
972        pm.UseTransaction(() => {
973          slaveGroupDao.Delete(slaveGroupId);
[12972]974          pm.SubmitChanges();
[12691]975        });
976      }
[12584]977    }
978
979    public void AddResourceToGroup(Guid slaveGroupId, Guid resourceId) {
[12691]980      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
[12857]981      var pm = PersistenceManager;
[12691]982      using (new PerformanceLogger("AddResourceToGroup")) {
983        var resourceDao = pm.ResourceDao;
984        pm.UseTransaction(() => {
985          var resource = resourceDao.GetById(resourceId);
986          resource.ParentResourceId = slaveGroupId;
987          pm.SubmitChanges();
988        });
989      }
[12584]990    }
991
992    public void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId) {
[12691]993      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
[12857]994      var pm = PersistenceManager;
[12691]995      using (new PerformanceLogger("RemoveResourceFromGroup")) {
996        var resourceDao = pm.ResourceDao;
997        pm.UseTransaction(() => {
998          var resource = resourceDao.GetById(resourceId);
999          resource.ParentResourceId = null;
1000          pm.SubmitChanges();
1001        });
1002      }
[12584]1003    }
1004
1005    public Guid GetResourceId(string resourceName) {
[12691]1006      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]1007      var pm = PersistenceManager;
[12691]1008      using (new PerformanceLogger("GetResourceId")) {
1009        var resourceDao = pm.ResourceDao;
1010        return pm.UseTransaction(() => {
1011          var resource = resourceDao.GetByName(resourceName);
1012          return resource != null ? resource.ResourceId : Guid.Empty;
1013        });
1014      }
[12584]1015    }
1016
1017    public void TriggerEventManager(bool force) {
[12857]1018      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
[12691]1019      // use a serializable transaction here to ensure not two threads execute this simultaniously (mutex-lock would not work since IIS may use multiple AppDomains)
1020      bool cleanup;
[12857]1021      var pm = PersistenceManager;
[12691]1022      using (new PerformanceLogger("TriggerEventManager")) {
1023        cleanup = false;
1024        var lifecycleDao = pm.LifecycleDao;
1025        pm.UseTransaction(() => {
1026          var lastLifecycle = lifecycleDao.GetLastLifecycle();
1027          DateTime lastCleanup = lastLifecycle != null ? lastLifecycle.LastCleanup : DateTime.MinValue;
1028          if (force || DateTime.Now - lastCleanup > HeuristicLab.Services.Hive.Properties.Settings.Default.CleanupInterval) {
1029            lifecycleDao.UpdateLifecycle();
1030            cleanup = true;
1031            pm.SubmitChanges();
1032          }
1033        }, true);
1034      }
1035      if (cleanup) {
1036        EventManager.Cleanup();
1037      }
[12584]1038    }
1039
1040    public int GetNewHeartbeatInterval(Guid slaveId) {
[12691]1041      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
[12857]1042      var pm = PersistenceManager;
[12691]1043      using (new PerformanceLogger("GetNewHeartbeatInterval")) {
1044        var slaveDao = pm.SlaveDao;
1045        return pm.UseTransaction(() => {
1046          var slave = slaveDao.GetById(slaveId);
1047          if (slave != null) {
1048            return slave.HbInterval;
1049          }
1050          return -1;
1051        });
1052      }
[12584]1053    }
[12691]1054    #endregion
[12584]1055
[15503]1056    #region ResourcePermission Methods
1057    // only for authorized Administrator/ResourceOwner
1058    public void GrantResourcePermissions(Guid resourceId, Guid[] grantedUserIds) {
1059      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1060      AuthorizationManager.AuthorizeForResourceAdministration(resourceId);
1061      var pm = PersistenceManager;
1062      using(new PerformanceLogger("GrantResourcePermissions")) {
1063        pm.UseTransaction(() => {
1064          var resourceDao = pm.ResourceDao;
1065          var resource = resourceDao.GetById(resourceId);
1066          var resourcePermissions = resource.ResourcePermissions.ToList();
1067          foreach(var id in grantedUserIds) {
1068            if(resourcePermissions.All(x => x.GrantedUserId != id)) {
1069              resource.ResourcePermissions.Add(new DA.ResourcePermission {
1070                GrantedUserId = id,
1071                GrantedByUserId = UserManager.CurrentUserId
1072              });
1073            }
1074          }
1075          pm.SubmitChanges();
1076        });
1077      }
1078    }
1079
1080    // only for authorized Administrator/ResourceOwner/(Sub)ProjectOwner to which the Resource (i.e. resourceId) is assigned
1081    public void GrantResourcePermissions(Guid resourceId, Guid projectId, Guid[] grantedUserIds) {
1082      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1083      AuthorizationManager.AuthorizeForResourceAdministration(resourceId);
1084      var pm = PersistenceManager;
1085      using (new PerformanceLogger("GrantResourcePermissions")) {
1086        pm.UseTransaction(() => {
1087
1088
1089          // TODO-JAN
1090
1091
1092          pm.SubmitChanges();
1093        });
1094      }
1095    }
1096
1097    // only for authorized Administrator/ResourceOwner
1098    public void RevokeResourcePermissions(Guid resourceId, Guid[] grantedUserIds) {
1099      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1100      AuthorizationManager.AuthorizeForResourceAdministration(resourceId);
1101      var pm = PersistenceManager;
1102      using(new PerformanceLogger("RevokeResourcePermission")) {
1103        pm.UseTransaction(() => {
1104          var resourcePermissionDao = pm.ResourcePermissionDao;
1105          resourcePermissionDao.DeleteByResourceIdAndGrantedUserId(resourceId, grantedUserIds);
1106          pm.SubmitChanges();
1107        });
1108      }
1109    }
1110
1111    // only for authorized Administrator/ResourceOwner/(Sub)ProjectOwner to which the Resource (i.e. resourceId) is assigned
1112    public void RevokeResourcePermissions(Guid resourceId, Guid projectId, Guid[] grantedUserIds) {
1113      // TODO-JAN
1114    }
1115
1116    #endregion
1117
[12691]1118    #region Downtime Methods
1119    public Guid AddDowntime(DT.Downtime downtimeDto) {
1120      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1121      AuthorizationManager.AuthorizeForResourceAdministration(downtimeDto.ResourceId);
[12857]1122      var pm = PersistenceManager;
[12691]1123      using (new PerformanceLogger("AddDowntime")) {
1124        var downtimeDao = pm.DowntimeDao;
1125        return pm.UseTransaction(() => {
1126          var downtime = downtimeDao.Save(downtimeDto.ToEntity());
1127          pm.SubmitChanges();
1128          return downtime.ResourceId;
1129        });
1130      }
[12584]1131    }
1132
1133    public void DeleteDowntime(Guid downtimeId) {
[12691]1134      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]1135      var pm = PersistenceManager;
[12691]1136      using (new PerformanceLogger("DeleteDowntime")) {
1137        var downtimeDao = pm.DowntimeDao;
1138        pm.UseTransaction(() => {
1139          downtimeDao.Delete(downtimeId);
1140          pm.SubmitChanges();
1141        });
1142      }
[12584]1143    }
1144
[12691]1145    public void UpdateDowntime(DT.Downtime downtimeDto) {
1146      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1147      AuthorizationManager.AuthorizeForResourceAdministration(downtimeDto.ResourceId);
[12857]1148      var pm = PersistenceManager;
[12691]1149      using (new PerformanceLogger("UpdateDowntime")) {
1150        var downtimeDao = pm.DowntimeDao;
1151        pm.UseTransaction(() => {
1152          var downtime = downtimeDao.GetById(downtimeDto.Id);
1153          if (downtime != null) {
1154            downtimeDto.CopyToEntity(downtime);
1155          } else {
1156            downtimeDao.Save(downtimeDto.ToEntity());
1157          }
1158          pm.SubmitChanges();
1159        });
1160      }
[12584]1161    }
1162
[12776]1163    public IEnumerable<DT.Downtime> GetDowntimesForResource(Guid resourceId) {
[12691]1164      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]1165      var pm = PersistenceManager;
[12691]1166      using (new PerformanceLogger("GetDowntimesForResource")) {
1167        var downtimeDao = pm.DowntimeDao;
1168        return pm.UseTransaction(() => downtimeDao.GetByResourceId(resourceId)
1169          .Select(x => x.ToDto())
1170          .ToList()
1171        );
1172      }
[12584]1173    }
[12691]1174    #endregion
[12584]1175
[12691]1176    #region User Methods
[12584]1177    public string GetUsernameByUserId(Guid userId) {
[12691]1178      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1179      var user = UserManager.GetUserById(userId);
1180      return user != null ? user.UserName : null;
[12584]1181    }
1182
1183    public Guid GetUserIdByUsername(string username) {
[12691]1184      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1185      var user = ServiceLocator.Instance.UserManager.GetUserByName(username);
1186      return user != null ? (Guid?)user.ProviderUserKey ?? Guid.Empty : Guid.Empty;
[12584]1187    }
[12691]1188    #endregion
[12584]1189
[12691]1190    #region UserPriorities Methods
[12776]1191    public IEnumerable<DT.UserPriority> GetUserPriorities() {
[12857]1192      var pm = PersistenceManager;
[12691]1193      using (new PerformanceLogger("GetUserPriorities")) {
1194        var userPriorityDao = pm.UserPriorityDao;
1195        return pm.UseTransaction(() => userPriorityDao.GetAll()
1196          .Select(x => x.ToDto())
1197          .ToList()
1198        );
1199      }
[12584]1200    }
[12691]1201    #endregion
[12584]1202
[12691]1203    #region Private Helper Methods
1204    private void UpdateTaskState(IPersistenceManager pm, DA.Task task, DT.TaskState taskState, Guid? slaveId, Guid? userId, string exception) {
1205      var stateLogDao = pm.StateLogDao;
1206      var taskStateEntity = taskState.ToEntity();
[14901]1207
[15358]1208      if (task.State == DA.TaskState.Transferring && taskStateEntity == DA.TaskState.Paused && task.Command == null) {
[12857]1209        // slave paused and uploaded the task (no user-command) -> set waiting.
[12691]1210        taskStateEntity = DA.TaskState.Waiting;
1211      }
[14901]1212
[12691]1213      stateLogDao.Save(new DA.StateLog {
1214        State = taskStateEntity,
1215        DateTime = DateTime.Now,
1216        TaskId = task.TaskId,
1217        UserId = userId,
1218        SlaveId = slaveId,
1219        Exception = exception
1220      });
[14901]1221
[12691]1222      task.State = taskStateEntity;
[14901]1223
1224      if (task.Command == DA.Command.Pause && task.State == DA.TaskState.Paused
1225          || task.Command == DA.Command.Abort && task.State == DA.TaskState.Aborted
1226          || task.Command == DA.Command.Stop && task.State == DA.TaskState.Aborted) {
1227        task.Command = null;
1228      }
[12691]1229    }
1230
[15379]1231    private DA.Project AuthorizeForProject(IPersistenceManager pm, Guid projectId) {
1232      var projectDao = pm.ProjectDao;
1233      var project = projectDao.GetById(projectId);
[15503]1234      if (project == null) throw new SecurityException(NOT_AUTHORIZED_PROJECT);
[15379]1235      if (project.OwnerUserId != UserManager.CurrentUserId
[12691]1236          && !RoleVerifier.IsInRole(HiveRoles.Administrator)) {
[15503]1237        throw new SecurityException(NOT_AUTHORIZED_PROJECT);
[12691]1238      }
[15379]1239      return project;
[12691]1240    }
[15503]1241
1242    // Check if the current user is authorized (i.e. is owner of the (sub)project) to set permissions
1243    // for a certain resource (resourceId) in the context of a certain project (projectId)
1244    private DA.Resource AuthorizeForResource(IPersistenceManager pm, Guid resourceId, Guid projectId) {
1245      var projectDao = pm.ProjectDao;
1246      var project = projectDao.GetById(projectId);
1247      if (project == null) throw new SecurityException(NOT_AUTHORIZED_PROJECT);
1248
1249      var resourceDao = pm.ResourceDao;
1250      var resource = resourceDao.GetById(resourceId);
1251      if (resource == null) throw new SecurityException(NOT_AUTHORIZED_RESOURCE);
1252
1253
1254      if (project.OwnerUserId != UserManager.CurrentUserId
1255        && !RoleVerifier.IsInRole(HiveRoles.Administrator)) {
1256        throw new SecurityException(NOT_AUTHORIZED_PROJECT);
1257      }
1258
1259      // look up if resourceId is amongst the assigned ones
1260      var assignedResources = project.AssignedProjectResources.ToList();
1261      if (assignedResources.Select(x => x.ResourceId).Contains(resourceId)) {
1262        return resource;
1263      }
1264
1265      // look up if one of the parent resourceIds is amongst the assigned ones
1266      // note: this should be faster than checking all children of the assigned
1267      // resource(-groups) for the certain resourceId
1268      var parentResourceIds = resourceDao.GetResourceIdsByChildId(resourceId);
1269      if(assignedResources.Select(x => x.ResourceId)
1270        .Intersect(parentResourceIds).Count() > 0) {
1271        return resource;
1272      }
1273
1274      throw new SecurityException(NOT_AUTHORIZED_PROJECT);
1275    }
[12691]1276    #endregion
[12584]1277  }
1278}
Note: See TracBrowser for help on using the repository browser.