using System; using System.Data; using System.Collections; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using CMS.CMSHelper; using CMS.ExtendedControls; using CMS.GlobalHelper; using CMS.ProjectManagement; using CMS.SettingsProvider; using CMS.SiteProvider; using CMS.UIControls; public partial class CMSModules_ProjectManagement_Controls_UI_Project_Security : CMSAdminEditControl, IPostBackEventHandler { #region "Variables" private int mProjectId; private bool mNoRolesAvailable = false; private bool process = true; private bool createMatrix = false; private bool stopProcessing = false; private bool mEnable = true; private string[] allowedPermissions = new string[4] { ProjectManagementPermissionType.READ, ProjectManagementPermissionType.CREATE, ProjectManagementPermissionType.MODIFY, ProjectManagementPermissionType.DELETE }; protected ProjectInfo project = null; protected ResourceInfo resProjects = null; /// /// OnPage changed event. /// public event EventHandler OnPageChanged; // HashTable holding information on all permissions that 'OnlyAuthorizedRoles' access is selected for private Hashtable onlyAuth = new Hashtable(); #endregion #region "Public properties" /// /// Gets or sets the ID of the project to edit. /// public int ProjectID { get { return mProjectId; } set { mProjectId = value; } } /// /// Indicates if the control should perform the operations. /// public override bool StopProcessing { get { return base.StopProcessing; } set { gridMatrix.StopProcessing = value; base.StopProcessing = value; } } /// /// Indicates whether permissions matrix is enabled. /// public bool Enable { get { return mEnable; } set { mEnable = value; } } #endregion #region "Page methods" /// /// Handles the Load event of the Page control. /// protected void Page_Load(object sender, EventArgs e) { gridMatrix.OnItemChanged += new UniMatrix.ItemChangedEventHandler(gridMatrix_OnItemChanged); gridMatrix.StopProcessing = true; gridMatrix.ColumnsPreferedOrder = string.Join(",", allowedPermissions); if (ProjectID > 0) { project = ProjectInfoProvider.GetProjectInfo(ProjectID); // Check whether the project still exists EditedObject = project; } // Handle page chnaged event gridMatrix.OnPageChanged += new EventHandler(gridMatrix_OnPageChanged); // Disable permission matrix if user has no MANAGE rights if (!ProjectInfoProvider.IsAuthorizedPerProject(ProjectID, PERMISSION_MANAGE, CMSContext.CurrentUser)) { Enable = false; gridMatrix.Enabled = false; lblError.Text = String.Format(GetString("CMSSiteManager.AccessDeniedOnPermissionName"), "Manage"); lblError.Visible = true; } } /// /// PreRender event handler. /// protected override void OnPreRender(EventArgs e) { LoadData(); if (ProjectID > 0) { gridMatrix.StopProcessing = true; ; if (!IsLiveSite && process) { gridMatrix.StopProcessing = stopProcessing; // Render permission matrix CreateMatrix(); } else if (createMatrix) { gridMatrix.StopProcessing = stopProcessing; CreateMatrix(); createMatrix = false; } else if (IsLiveSite && process && RequestHelper.IsPostBack()) { gridMatrix.StopProcessing = stopProcessing; CreateMatrix(); createMatrix = false; } } base.OnPreRender(e); } /// /// Load data. /// public void LoadData() { process = true; if (!Visible || StopProcessing) { EnableViewState = false; process = false; } IsLiveSite = false; if (ProjectID > 0) { // Get information on current project project = ProjectInfoProvider.GetProjectInfo(ProjectID); } // Get project resource resProjects = ResourceInfoProvider.GetResourceInfo("CMS.ProjectManagement"); if ((resProjects != null) && (project != null)) { QueryDataParameters parameters = new QueryDataParameters(); parameters.Add("@ID", resProjects.ResourceId); parameters.Add("@ProjectID", project.ProjectID); parameters.Add("@SiteID", CMSContext.CurrentSiteID); string where = ""; int groupId = project.ProjectGroupID; // Build where condition if (groupId > 0) { where = "RoleGroupID=" + groupId.ToString() + " AND PermissionDisplayInMatrix = 0"; } else { where = "RoleGroupID IS NULL AND PermissionDisplayInMatrix = 0"; } // Setup matrix control gridMatrix.IsLiveSite = IsLiveSite; gridMatrix.QueryParameters = parameters; gridMatrix.WhereCondition = where; gridMatrix.ContentBefore = ""; gridMatrix.ContentAfter = "
"; } } /// /// Page changed event habdler. /// private void gridMatrix_OnPageChanged(object sender, EventArgs e) { // Raise on page changed event if (OnPageChanged != null) { OnPageChanged(this, null); } } /// /// Clears the security matrix. /// public void Clear() { gridMatrix.ResetMatrix(); } #endregion #region "Page event handlers" /// /// On item changed event. /// protected void gridMatrix_OnItemChanged(object sender, int roleId, int permissionId, bool allow) { if (!CheckPermissions("CMS.ProjectManagement", PERMISSION_MANAGE)) { return; } // Delete permission hash tables ProjectInfoProvider.ClearProjectPermissionTable(ProjectID, CMSContext.CurrentUser); if (allow) { ProjectRolePermissionInfoProvider.AddRelationship(ProjectID, roleId, permissionId); } else { ProjectRolePermissionInfoProvider.RemoveRelationship(ProjectID, roleId, permissionId); } } #endregion #region "Private methods" /// /// Generates the permission matrix for the cutrrent project. /// private void CreateMatrix() { // Get project resource info if (resProjects == null) { resProjects = ResourceInfoProvider.GetResourceInfo("CMS.ProjectManagement"); } // Get project object if ((project == null) && (ProjectID > 0)) { project = ProjectInfoProvider.GetProjectInfo(ProjectID); } if ((resProjects != null) && (project != null)) { // Get permissions for the current project resource DataSet permissions = PermissionNameInfoProvider.GetResourcePermissions(resProjects.ResourceId); if (DataHelper.DataSourceIsEmpty(permissions)) { lblInfo.Text = GetString("general.emptymatrix"); } else { TableRow headerRow = new TableRow(); headerRow.CssClass = "UniGridHead"; TableCell newCell = new TableCell(); TableHeaderCell newHeaderCell = new TableHeaderCell(); newHeaderCell.Text = " "; newHeaderCell.Attributes["style"] = "width:200px;"; headerRow.Cells.Add(newHeaderCell); foreach (string permission in allowedPermissions) { DataRow[] drArray = permissions.Tables[0].DefaultView.Table.Select("PermissionName = '" + permission + "'"); if ((drArray != null) && (drArray.Length > 0)) { DataRow dr = drArray[0]; newHeaderCell = new TableHeaderCell(); newHeaderCell.Attributes["style"] = "text-align:center;white-space:nowrap;"; newHeaderCell.Text = dr["PermissionDisplayName"].ToString(); newHeaderCell.ToolTip = dr["PermissionDescription"].ToString(); newHeaderCell.HorizontalAlign = HorizontalAlign.Center; headerRow.Cells.Add(newHeaderCell); } else { throw new Exception("[Security matrix] Column '" + permission + "' cannot be found."); } } newHeaderCell = new TableHeaderCell(); newHeaderCell.Text = " "; headerRow.Cells.Add(newHeaderCell); tblMatrix.Rows.Add(headerRow); // Render project access permissions object[,] accessNames = new object[5,2]; accessNames[0, 0] = GetString("security.nobody"); accessNames[0, 1] = SecurityAccessEnum.Nobody; accessNames[1, 0] = GetString("security.allusers"); accessNames[1, 1] = SecurityAccessEnum.AllUsers; accessNames[2, 0] = GetString("security.authenticated"); accessNames[2, 1] = SecurityAccessEnum.AuthenticatedUsers; accessNames[3, 0] = GetString("security.groupmembers"); accessNames[3, 1] = SecurityAccessEnum.GroupMembers; accessNames[4, 0] = GetString("security.authorizedroles"); accessNames[4, 1] = SecurityAccessEnum.AuthorizedRoles; TableRow newRow = null; int rowIndex = 0; for (int access = 0; access <= accessNames.GetUpperBound(0); access++) { SecurityAccessEnum currentAccess = ((SecurityAccessEnum)accessNames[access, 1]); // If the security isn't displayed as part of group section if ((currentAccess == SecurityAccessEnum.GroupMembers) && (project.ProjectGroupID == 0)) { // Do not render this access item } else { // Generate cell holding access item name newRow = new TableRow(); newRow.CssClass = ((rowIndex % 2 == 0) ? "EvenRow" : "OddRow"); newCell = new TableCell(); newCell.Text = accessNames[access, 0].ToString(); newCell.Wrap = false; newCell.CssClass = "MatrixHeader"; newCell.Width = new Unit(28, UnitType.Percentage); newRow.Cells.Add(newCell); rowIndex++; // Render the permissions access items bool isAllowed = false; bool isDisabled = (!Enable); int permissionIndex = 0; for (int permission = 0; permission < (tblMatrix.Rows[0].Cells.Count - 2); permission++) { newCell = new TableCell(); // Check if the currently processed access is applied for permission isAllowed = CheckPermissionAccess(currentAccess, permission, tblMatrix.Rows[0].Cells[permission + 1].Text); // Disable column in roles grid if needed if ((currentAccess == SecurityAccessEnum.AuthorizedRoles) && !isAllowed) { gridMatrix.DisableColumn(permissionIndex); } // Insert the radio button for the current permission string permissionText = tblMatrix.Rows[0].Cells[permission + 1].Text; string elemId = ClientID + "_" + permission + "_" + access; newCell.Text = ""; newCell.Wrap = false; newCell.Width = new Unit(12, UnitType.Percentage); newCell.HorizontalAlign = HorizontalAlign.Center; newRow.Cells.Add(newCell); permissionIndex++; } newCell = new TableCell(); newCell.Text = " "; newRow.Cells.Add(newCell); // Add the access row to the table tblMatrix.Rows.Add(newRow); } } // Check if project has some roles assigned mNoRolesAvailable = !gridMatrix.HasData; // Get permission matrix for current project resource if (!mNoRolesAvailable) { // Security - Role separator newRow = new TableRow(); newCell = new TableCell(); newCell.Text = " "; newCell.Attributes.Add("colspan", Convert.ToString(tblMatrix.Rows[0].Cells.Count)); newRow.Controls.Add(newCell); tblMatrix.Rows.Add(newRow); // Security - Role separator text newRow = new TableRow(); newCell = new TableCell(); newCell.CssClass = "MatrixLabel"; newCell.Text = GetString("SecurityMatrix.RolesAvailability"); newCell.Attributes.Add("colspan", Convert.ToString(tblMatrix.Rows[0].Cells.Count)); newRow.Controls.Add(newCell); tblMatrix.Rows.Add(newRow); } } } } /// /// Indicates the permission acess. /// /// Currently processed integer representation of item from SecurityAccessEnum /// Currently processed integer representation of permission to check private bool CheckPermissionAccess(SecurityAccessEnum currentAccess, int currentPermission, string currentPermissionName) { bool result = false; if (project != null) { switch (currentPermission) { case 0: // Process 'AllowRead' permission and check by current access result = (project.AllowRead == currentAccess); break; case 1: // Set 'AttachCreate' permission and check by current access result = (project.AllowCreate == currentAccess); break; case 2: // Set 'AllowModify' permission and check by current access result = (project.AllowModify == currentAccess); break; case 3: // Set 'AllowDelete' permission and check by current access result = (project.AllowDelete == currentAccess); break; default: break; } } // Make note about type of permission with access set to 'OnlyAuthorizedRoles' if (result && (currentAccess == SecurityAccessEnum.AuthorizedRoles)) { onlyAuth[currentPermissionName] = true; } return result; } #endregion #region "PostBack event handler" public void RaisePostBackEvent(string eventArgument) { if (!CheckPermissions("CMS.ProjectManagement", PERMISSION_MANAGE)) { return; } string[] args = eventArgument.Split(';'); if (args.Length == 2) { // Get info on currently selected item int permission = ValidationHelper.GetInteger(args[0], 0); int access = ValidationHelper.GetInteger(args[1], 0); if (project != null) { // Update project permission access information switch (permission) { case 0: // Set 'AllowRead' permission to specified access project.AllowRead = (SecurityAccessEnum)access; break; case 1: // Set 'AttachCreate' permission to specified access project.AllowCreate = ((SecurityAccessEnum)access); break; case 2: // Set 'AllowModify' permission to specified access project.AllowModify = (SecurityAccessEnum)access; break; case 3: // Set 'AllowDelete' permission to specified access project.AllowDelete = ((SecurityAccessEnum)access); break; default: break; } // Delete permission hash tables ProjectInfoProvider.ClearProjectPermissionTable(ProjectID, CMSContext.CurrentUser); // Use try/catch due to license check try { // Save changes to the project ProjectInfoProvider.SetProjectInfo(project); } catch (Exception ex) { lblError.Visible = true; lblError.Text = ex.Message; } createMatrix = true; } } } /// /// Reloads data. /// public override void ReloadData() { base.ReloadData(); createMatrix = true; // Ensure viewstate EnableViewState = true; } #endregion }