Feature #49: Active Directory Managed Groups

Document Template Attachments, Device Batches, Device Profiles and User
Flags can be associated with an Active Directory group. This AD group is
then automatically synchronized with relevant User/Machine accounts.
Contains various other UI tweaks and configuration enhancements.
This commit is contained in:
Gary Sharp
2014-06-16 22:21:31 +10:00
parent ebf78dd08d
commit a819d2722a
119 changed files with 8349 additions and 2373 deletions
@@ -1,5 +1,7 @@
using Disco.Models.Repository;
using Disco.Models.Services.Interop.ActiveDirectory;
using Disco.Services.Authorization;
using Disco.Services.Interop.ActiveDirectory;
using Disco.Services.Tasks;
using Disco.Services.Users.UserFlags;
using Disco.Services.Web;
@@ -15,6 +17,8 @@ namespace Disco.Web.Areas.API.Controllers
const string pDescription = "description";
const string pIcon = "icon";
const string pIconColour = "iconcolour";
const string pAssignedUsersLinkedGroup = "assigneduserslinkedgroup";
const string pAssignedUserDevicesLinkedGroup = "assigneduserdeviceslinkedgroup";
[DiscoAuthorize(Claims.Config.UserFlag.Configure)]
public virtual ActionResult Update(int id, string key, string value = null, Nullable<bool> redirect = null)
@@ -44,6 +48,12 @@ namespace Disco.Web.Areas.API.Controllers
case pIconColour:
UpdateIconColour(flag, value);
break;
case pAssignedUsersLinkedGroup:
UpdateAssignedUsersLinkedGroup(flag, value);
break;
case pAssignedUserDevicesLinkedGroup:
UpdateAssignedUserDevicesLinkedGroup(flag, value);
break;
default:
throw new Exception("Invalid Update Key");
}
@@ -106,7 +116,7 @@ namespace Disco.Web.Areas.API.Controllers
}
else
{
return Json("Invalid User Flag Id", JsonRequestBehavior.AllowGet);
throw new ArgumentException("Invalid User Flag Id", "id");
}
if (redirect)
return RedirectToAction(MVC.Config.UserFlag.Index(UserFlag.Id));
@@ -121,6 +131,72 @@ namespace Disco.Web.Areas.API.Controllers
return Json(string.Format("Error: {0}", ex.Message), JsonRequestBehavior.AllowGet);
}
}
[DiscoAuthorize(Claims.Config.UserFlag.Configure)]
public virtual ActionResult UpdateAssignedUsersLinkedGroup(int id, string GroupId = null, bool redirect = false)
{
try
{
if (id < 0)
throw new ArgumentOutOfRangeException("id");
var UserFlag = Database.UserFlags.Find(id);
if (UserFlag == null)
throw new ArgumentException("Invalid User Flag Id", "id");
var syncTaskStatus = UpdateAssignedUsersLinkedGroup(UserFlag, GroupId);
if (redirect)
if (syncTaskStatus == null)
return RedirectToAction(MVC.Config.UserFlag.Index(UserFlag.Id));
else
{
syncTaskStatus.SetFinishedUrl(Url.Action(MVC.Config.UserFlag.Index(UserFlag.Id)));
return RedirectToAction(MVC.Config.Logging.TaskStatus(syncTaskStatus.SessionId));
}
else
return Json("OK", JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
if (redirect)
throw;
else
return Json(string.Format("Error: {0}", ex.Message), JsonRequestBehavior.AllowGet);
}
}
[DiscoAuthorize(Claims.Config.UserFlag.Configure)]
public virtual ActionResult UpdateAssignedUserDevicesLinkedGroup(int id, string GroupId = null, bool redirect = false)
{
try
{
if (id < 0)
throw new ArgumentOutOfRangeException("id");
var UserFlag = Database.UserFlags.Find(id);
if (UserFlag == null)
throw new ArgumentException("Invalid User Flag Id", "id");
var syncTaskStatus = UpdateAssignedUserDevicesLinkedGroup(UserFlag, GroupId);
if (redirect)
if (syncTaskStatus == null)
return RedirectToAction(MVC.Config.UserFlag.Index(UserFlag.Id));
else
{
syncTaskStatus.SetFinishedUrl(Url.Action(MVC.Config.UserFlag.Index(UserFlag.Id)));
return RedirectToAction(MVC.Config.Logging.TaskStatus(syncTaskStatus.SessionId));
}
else
return Json("OK", JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
if (redirect)
throw;
else
return Json(string.Format("Error: {0}", ex.Message), JsonRequestBehavior.AllowGet);
}
}
#endregion
#region Update Properties
@@ -131,37 +207,98 @@ namespace Disco.Web.Areas.API.Controllers
if (string.IsNullOrWhiteSpace(IconColour))
throw new ArgumentNullException("IconColour");
UserFlag.Icon = Icon;
UserFlag.IconColour = IconColour;
UserFlagService.Update(Database, UserFlag);
if (UserFlag.Icon != Icon ||
UserFlag.IconColour != IconColour)
{
UserFlag.Icon = Icon;
UserFlag.IconColour = IconColour;
UserFlagService.Update(Database, UserFlag);
}
}
private void UpdateIcon(UserFlag UserFlag, string Icon)
{
if (string.IsNullOrWhiteSpace(Icon))
throw new ArgumentNullException("Icon");
UserFlag.Icon = Icon;
UserFlagService.Update(Database, UserFlag);
if (UserFlag.Icon != Icon)
{
UserFlag.Icon = Icon;
UserFlagService.Update(Database, UserFlag);
}
}
private void UpdateIconColour(UserFlag UserFlag, string IconColour)
{
if (string.IsNullOrWhiteSpace(IconColour))
throw new ArgumentNullException("IconColour");
UserFlag.IconColour = IconColour;
UserFlagService.Update(Database, UserFlag);
if (UserFlag.IconColour != IconColour)
{
UserFlag.IconColour = IconColour;
UserFlagService.Update(Database, UserFlag);
}
}
private void UpdateName(UserFlag UserFlag, string Name)
{
UserFlag.Name = Name;
UserFlagService.Update(Database, UserFlag);
if (UserFlag.Name != Name)
{
UserFlag.Name = Name;
UserFlagService.Update(Database, UserFlag);
}
}
private void UpdateDescription(UserFlag UserFlag, string Description)
{
UserFlag.Description = Description;
UserFlagService.Update(Database, UserFlag);
if (UserFlag.Description != Description)
{
UserFlag.Description = Description;
UserFlagService.Update(Database, UserFlag);
}
}
private ScheduledTaskStatus UpdateAssignedUsersLinkedGroup(UserFlag UserFlag, string AssignedUsersLinkedGroup)
{
var configJson = ADManagedGroup.ValidConfigurationToJson(UserFlagUsersManagedGroup.GetKey(UserFlag), AssignedUsersLinkedGroup, null);
if (UserFlag.UsersLinkedGroup != configJson)
{
UserFlag.UsersLinkedGroup = configJson;
UserFlagService.Update(Database, UserFlag);
if (UserFlag.UsersLinkedGroup != null)
{
// Sync Group
UserFlagUsersManagedGroup managedGroup;
if (UserFlagUsersManagedGroup.TryGetManagedGroup(UserFlag, out managedGroup))
{
return ADManagedGroupsSyncTask.ScheduleSync(managedGroup);
}
}
}
return null;
}
private ScheduledTaskStatus UpdateAssignedUserDevicesLinkedGroup(UserFlag UserFlag, string AssignedUserDevicesLinkedGroup)
{
var configJson = ADManagedGroup.ValidConfigurationToJson(UserFlagUserDevicesManagedGroup.GetKey(UserFlag), AssignedUserDevicesLinkedGroup, null);
if (UserFlag.UserDevicesLinkedGroup != configJson)
{
UserFlag.UserDevicesLinkedGroup = configJson;
UserFlagService.Update(Database, UserFlag);
if (UserFlag.UserDevicesLinkedGroup != null)
{
// Sync Group
UserFlagUserDevicesManagedGroup managedGroup;
if (UserFlagUserDevicesManagedGroup.TryGetManagedGroup(UserFlag, out managedGroup))
{
return ADManagedGroupsSyncTask.ScheduleSync(managedGroup);
}
}
}
return null;
}
#endregion
@@ -218,7 +355,7 @@ namespace Disco.Web.Areas.API.Controllers
throw new ArgumentException("Invalid User Flag Id", "id");
var assignedUsers = Database.UserFlagAssignments.Where(a => a.UserFlagId == userFlag.Id && !a.RemovedDate.HasValue).OrderBy(a => a.UserId).Select(a => a.UserId).ToList();
return Json(assignedUsers, JsonRequestBehavior.AllowGet);
}
#endregion