PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/Source/Libraries/Umbraco.Cms.Web.Editors/UserGroupEditorController.cs

#
C# | 266 lines | 171 code | 51 blank | 44 comment | 13 complexity | d06dcffa0717d7b4d3681a3d8a62a38c MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, BSD-3-Clause, CC-BY-SA-3.0, LGPL-2.1, MIT, Apache-2.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Web.Mvc;
  6. using Umbraco.Cms.Web.Context;
  7. using Umbraco.Cms.Web.Model.BackOffice.Editors;
  8. using Umbraco.Cms.Web.Mvc.ActionFilters;
  9. using Umbraco.Cms.Web.Security.Permissions;
  10. using Umbraco.Framework;
  11. using Umbraco.Framework.Localization;
  12. using Umbraco.Framework.Persistence.Model;
  13. using Umbraco.Framework.Persistence.Model.Associations;
  14. using Umbraco.Framework.Persistence.Model.Attribution.MetaData;
  15. using Umbraco.Framework.Persistence.Model.Constants;
  16. using Umbraco.Framework.Persistence.Model.Constants.Entities;
  17. using Umbraco.Framework.Persistence.Model.Constants.Schemas;
  18. using Umbraco.Framework.Security;
  19. using Umbraco.Hive;
  20. using Umbraco.Hive.Configuration;
  21. using Umbraco.Hive.ProviderGrouping;
  22. using Umbraco.Hive.RepositoryTypes;
  23. namespace Umbraco.Cms.Web.Editors
  24. {
  25. [Editor(CorePluginConstants.UserGroupEditorControllerId)]
  26. [UmbracoEditor]
  27. [SupportClientNotifications]
  28. public class UserGroupEditorController : AbstractContentEditorController
  29. {
  30. public UserGroupEditorController(IBackOfficeRequestContext requestContext)
  31. : base(requestContext)
  32. {
  33. _hive = BackOfficeRequestContext.Application.Hive.GetWriter(new Uri("security://user-groups"));
  34. Mandate.That(_hive != null, x => new NullReferenceException("Could not find hive provider for route security://user-groups"));
  35. }
  36. private readonly GroupUnitFactory _hive;
  37. public override GroupUnitFactory Hive
  38. {
  39. get { return _hive; }
  40. }
  41. #region Actions
  42. /// <summary>
  43. /// Action to render the editor
  44. /// </summary>
  45. /// <returns></returns>
  46. public override ActionResult Edit(HiveId? id)
  47. {
  48. if (id.IsNullValueOrEmpty()) return HttpNotFound();
  49. using (var uow = Hive.Create<ISecurityStore>())
  50. {
  51. var userEntity = uow.Repositories.Get<UserGroup>(id.Value);
  52. if (userEntity == null)
  53. throw new ArgumentException(string.Format("No user group found for id: {0} on action Edit", id));
  54. var userViewModel = BackOfficeRequestContext.Application.FrameworkContext.TypeMappers.Map<UserGroup, UserGroupEditorModel>(userEntity);
  55. PopulatePermissions(userViewModel);
  56. return View(userViewModel);
  57. }
  58. }
  59. /// <summary>
  60. /// Handles the editor post back
  61. /// </summary>
  62. /// <param name="id">The id.</param>
  63. /// <returns></returns>
  64. /// <remarks></remarks>
  65. [ActionName("Edit")]
  66. [HttpPost]
  67. [ValidateInput(false)]
  68. [SupportsPathGeneration]
  69. [PersistTabIndexOnRedirect]
  70. [Save]
  71. public ActionResult EditForm(HiveId id)
  72. {
  73. Mandate.ParameterNotEmpty(id, "id");
  74. using (var uow = Hive.Create<ISecurityStore>())
  75. {
  76. var userEntity = uow.Repositories.Get<UserGroup>(id);
  77. if (userEntity == null)
  78. throw new ArgumentException(string.Format("No entity for id: {0} on action EditForm", id));
  79. var userGroupViewModel = BackOfficeRequestContext.Application.FrameworkContext.TypeMappers.Map<UserGroup, UserGroupEditorModel>(userEntity);
  80. PopulatePermissions(userGroupViewModel);
  81. //need to ensure that all of the Ids are mapped correctly, when editing existing content the only reason for this
  82. //is to ensure any new document type properties that have been created are reflected in the new content revision
  83. ReconstructModelPropertyIds(userGroupViewModel);
  84. return ProcessSubmit(userGroupViewModel, userEntity);
  85. }
  86. }
  87. /// <summary>
  88. /// Displays the Create user editor
  89. /// </summary>
  90. /// <returns></returns>
  91. [HttpGet]
  92. public virtual ActionResult Create()
  93. {
  94. //create the new user item
  95. var userGroupViewModel = CreateNewUserGroup();
  96. PopulatePermissions(userGroupViewModel);
  97. return View("Edit", userGroupViewModel);
  98. }
  99. /// <summary>
  100. /// Creates a new user based on posted values
  101. /// </summary>
  102. /// <returns></returns>
  103. [ActionName("Create")]
  104. [HttpPost]
  105. [ValidateInput(false)]
  106. [SupportsPathGeneration]
  107. [PersistTabIndexOnRedirect]
  108. [Save]
  109. public ActionResult CreateForm()
  110. {
  111. var userGroupViewModel = CreateNewUserGroup();
  112. PopulatePermissions(userGroupViewModel);
  113. //map the Ids correctly to the model so it binds
  114. ReconstructModelPropertyIds(userGroupViewModel);
  115. return ProcessSubmit(userGroupViewModel, null);
  116. }
  117. #endregion
  118. #region Protected/Private methods
  119. /// <summary>
  120. /// Populates the permissions for the given model.
  121. /// </summary>
  122. /// <param name="model">The model.</param>
  123. private void PopulatePermissions(UserGroupEditorModel model)
  124. {
  125. // Get all permissions
  126. var permissions = BackOfficeRequestContext.RegisteredComponents.Permissions
  127. .Select(x => x.Metadata)
  128. .OrderByDescending(x => x.Type)
  129. .ThenBy(x => x.Name)
  130. .ToList();
  131. var permissionStatusModels = permissions.Select(x => BackOfficeRequestContext.Application.FrameworkContext.TypeMappers.Map<PermissionStatusModel>(x)).ToList();
  132. //TODO: There is currently a bug with hive id when returned by relations where the ProviderGroupRoot is null, so we have to create a similar hive id to do comparisons with
  133. //var userGroupId = new HiveId((Uri)null, model.Id.ProviderId, model.Id.Value);
  134. var userGroupId = model.Id;
  135. foreach (var permissionStatusModel in permissionStatusModels)
  136. {
  137. // Set status
  138. var permissionInheritKey = "__permission___" + permissionStatusModel.PermissionId + "_inherit";
  139. var permissionStatusKey = "__permission___" + permissionStatusModel.PermissionId + "_status";
  140. permissionStatusModel.Status = !string.IsNullOrWhiteSpace(Request.Form[permissionInheritKey])
  141. ? PermissionStatus.Inherit
  142. : !string.IsNullOrWhiteSpace(Request.Form[permissionStatusKey])
  143. ? (PermissionStatus)Enum.Parse(typeof(PermissionStatus), Request.Form[permissionStatusKey])
  144. : BackOfficeRequestContext.Application.Security.GetExplicitPermission(permissionStatusModel.PermissionId, new[] { userGroupId }, FixedHiveIds.SystemRoot).Status;
  145. }
  146. model.Permissions = permissionStatusModels;
  147. }
  148. /// <summary>
  149. /// Creates a blank user model based on the document type/entityschema for the user
  150. /// </summary>
  151. /// <returns></returns>
  152. private UserGroupEditorModel CreateNewUserGroup()
  153. {
  154. using (var uow = Hive.Create<ISecurityStore>())
  155. {
  156. var userSchema = uow.Repositories.Schemas.GetAll<EntitySchema>()
  157. .Where(x => x.Alias == UserGroupSchema.SchemaAlias)
  158. .Single();
  159. //get doc type model
  160. var docType = BackOfficeRequestContext.Application.FrameworkContext.TypeMappers.Map<EntitySchema, DocumentTypeEditorModel>(userSchema);
  161. //map (create) content model from doc type model
  162. return BackOfficeRequestContext.Application.FrameworkContext.TypeMappers.Map<DocumentTypeEditorModel, UserGroupEditorModel>(docType);
  163. }
  164. }
  165. protected ActionResult ProcessSubmit(UserGroupEditorModel model, UserGroup entity)
  166. {
  167. Mandate.ParameterNotNull(model, "model");
  168. //bind it's data
  169. model.BindModel(this);
  170. //if there's model errors, return the view
  171. if (!ModelState.IsValid)
  172. {
  173. AddValidationErrorsNotification();
  174. return View("Edit", model);
  175. }
  176. //persist the data
  177. using (var uow = Hive.Create<ISecurityStore>())
  178. {
  179. if (entity == null)
  180. {
  181. //map to new entity
  182. entity =
  183. BackOfficeRequestContext.Application.FrameworkContext.TypeMappers.Map
  184. <UserGroupEditorModel, UserGroup>(model);
  185. }
  186. else
  187. {
  188. //map to existing entity
  189. BackOfficeRequestContext.Application.FrameworkContext.TypeMappers.Map(model, entity);
  190. }
  191. uow.Repositories.AddOrUpdate(entity);
  192. // Save permissions
  193. var metaDataumList = new List<RelationMetaDatum>();
  194. foreach (var permissionModel in model.Permissions)
  195. {
  196. var permission = BackOfficeRequestContext.RegisteredComponents.Permissions.SingleOrDefault(x => x.Metadata.Id == permissionModel.PermissionId);
  197. if (permission == null)
  198. throw new NullReferenceException("Could not find permission with id " + permissionModel.PermissionId);
  199. metaDataumList.Add(BackOfficeRequestContext.Application.FrameworkContext.TypeMappers.Map<RelationMetaDatum>(permissionModel));
  200. }
  201. // Change permissions relation
  202. uow.Repositories.ChangeOrCreateRelationMetadata(entity.Id, FixedHiveIds.SystemRoot, FixedRelationTypes.PermissionRelationType, metaDataumList.ToArray());
  203. uow.Complete();
  204. Notifications.Add(new NotificationMessage(
  205. "UserGroup.Save.Message".Localize(this),
  206. "UserGroup.Save.Title".Localize(this),
  207. NotificationType.Success));
  208. //add path for entity for SupportsPathGeneration (tree syncing) to work
  209. GeneratePathsForCurrentEntity(uow.Repositories.GetEntityPaths<TypedEntity>(entity.Id, FixedRelationTypes.DefaultRelationType));
  210. return RedirectToAction("Edit", new { id = entity.Id });
  211. }
  212. }
  213. #endregion
  214. }
  215. }