using System; using System.Data; using System.Web.UI.WebControls; using System.Collections; using CMS.CMSHelper; using CMS.ExtendedControls; using CMS.GlobalHelper; using CMS.SettingsProvider; using CMS.SiteProvider; using CMS.UIControls; public partial class CMSModules_Membership_Pages_Users_User_Edit_Roles : CMSUsersPage { #region "Protected variables" protected int siteId = 0; protected int userId = 0; protected UserInfo ui = null; protected string currentValues = string.Empty; #endregion #region "Events" /// /// Page_load event. /// protected void Page_Load(object sender, EventArgs e) { // Check permissions and UI elements CurrentUserInfo user = CMSContext.CurrentUser; if (user != null) { if (!user.IsAuthorizedPerUIElement("CMS.Administration", "Roles")) { RedirectToCMSDeskUIElementAccessDenied("CMS.Administration", "Roles"); } if (!CMSContext.CurrentUser.IsAuthorizedPerResource("CMS.Roles", "Read")) { RedirectToAccessDenied("CMS.Roles", "Read"); } } ScriptHelper.RegisterJQuery(Page); // Get user id and site Id from query userId = QueryHelper.GetInteger("userid", 0); // Show contentplaceholder where site selector can be shown CurrentMaster.DisplaySiteSelectorPanel = true; if ((SiteID > 0) && !CMSContext.CurrentUser.IsGlobalAdministrator) { plcSites.Visible = false; CurrentMaster.DisplaySiteSelectorPanel = false; } if (userId > 0) { // Check that only global administrator can edit global administrator's accouns ui = UserInfoProvider.GetUserInfo(userId); CheckUserAvaibleOnSite(ui); EditedObject = ui; if (!CheckGlobalAdminEdit(ui)) { plcTable.Visible = false; ShowError(GetString("Administration-User_List.ErrorGlobalAdmin")); return; } // Set site selector siteSelector.DropDownSingleSelect.AutoPostBack = true; siteSelector.AllowAll = false; siteSelector.AllowEmpty = false; // Global roles only for global admin if (CMSContext.CurrentUser.UserSiteManagerAdmin) { siteSelector.AllowGlobal = true; } // Only sites assigned to user siteSelector.UserId = userId; siteSelector.OnlyRunningSites = false; siteSelector.UniSelector.OnSelectionChanged += new EventHandler(UniSelector_OnSelectionChanged); if (!RequestHelper.IsPostBack()) { siteId = CMSContext.CurrentSiteID; // If user is member of current site if (UserSiteInfoProvider.GetUserSiteInfo(userId, siteId) != null) { // Force uniselector to preselect current site siteSelector.Value = siteId; } // Force to load data siteSelector.UpdateWhereCondition(); siteSelector.Reload(true); } // Get truly selected item siteId = ValidationHelper.GetInteger(siteSelector.Value, 0); } usRoles.OnSelectionChanged += new EventHandler(usRoles_OnSelectionChanged); string siteIDWhere = (siteId <= 0) ? " SiteID IS NULL " : " SiteID =" + siteId; usRoles.WhereCondition = siteIDWhere + " AND RoleGroupID IS NULL"; usRoles.SelectItemPageUrl = "~/CMSModules/Membership/Pages/Users/User_Edit_Add_Item_Dialog.aspx"; usRoles.ListingWhereCondition = siteIDWhere + " AND RoleGroupID IS NULL AND UserID=" + userId; usRoles.ReturnColumnName = "RoleID"; usRoles.DynamicColumnName = false; usRoles.GridName = "User_Role_List.xml"; usRoles.AdditionalColumns = "ValidTo"; usRoles.OnAdditionalDataBound += new CMSAdminControls_UI_UniSelector_UniSelector.AdditionalDataBoundEventHandler(usMemberships_OnAdditionalDataBound); // Exclude generic roles string genericWhere = null; ArrayList genericRoles = RoleInfoProvider.GetGenericRoles(); if (genericRoles.Count != 0) { foreach (string role in genericRoles) { genericWhere += "'" + role.Replace("'", "''") + "',"; } genericWhere = genericWhere.TrimEnd(','); usRoles.WhereCondition += " AND ( RoleName NOT IN (" + genericWhere + ") )"; } // Get the active roles for this site DataSet ds = UserRoleInfoProvider.GetUserRoles("UserID = " + userId + " AND RoleID IN (SELECT RoleID FROM CMS_Role WHERE SiteID IS NULL OR SiteID = " + siteId + ")", null, 0, "RoleID"); if (!DataHelper.DataSourceIsEmpty(ds)) { currentValues = TextHelper.Join(";", SystemDataHelper.GetStringValues(ds.Tables[0], "RoleID")); } // If not postback or site selection changed if (!RequestHelper.IsPostBack() || (siteId != Convert.ToInt32(ViewState["rolesOldSiteId"]))) { // Set values usRoles.Value = currentValues; } // Store selected site id ViewState["rolesOldSiteId"] = siteId; string script = "function setNewDateTime(date) {$j('#" + hdnDate.ClientID + "').val(date);}"; ScriptHelper.RegisterClientScriptBlock(Page, typeof(string), "key", ScriptHelper.GetScript(script)); string eventTarget = Request["__EVENTTARGET"]; string eventArgument = Request["__EVENTARGUMENT"]; if (eventTarget == ucCalendar.DateTimeTextBox.UniqueID) { if (!CMSContext.CurrentUser.IsAuthorizedPerResource("CMS.Users", "ManageUserRoles")) { RedirectToAccessDenied("CMS.Users", "Manage user roles"); } int id = ValidationHelper.GetInteger(hdnDate.Value, 0); if (id != 0) { DateTime dt = ValidationHelper.GetDateTime(eventArgument, DateTimeHelper.ZERO_TIME); UserRoleInfo uri = UserRoleInfoProvider.GetUserRoleInfo(userId, id); if (uri != null) { uri.ValidTo = dt; UserRoleInfoProvider.SetUserRoleInfo(uri); // Invalidate user UserInfoProvider.InvalidateUser(userId); ShowChangesSaved(); } } } } /// /// Callback event for create calendar icon. /// /// Sender object /// Event source name /// Event parameter /// Value from basic external data bound event private object usMemberships_OnAdditionalDataBound(object sender, string sourceName, object parameter, string val) { switch (sourceName.ToLowerCSafe()) { case "calendar": DataRowView drv = (parameter as DataRowView); string itemID = drv[usRoles.ReturnColumnName].ToString(); string imageID = "img_" + itemID; string date = drv["ValidTo"].ToString(); string postback = ControlsHelper.GetPostBackEventReference(ucCalendar.DateTimeTextBox, "#").Replace("'#'", "$j('#" + ucCalendar.DateTimeTextBox.ClientID + "').val()"); string onClick = String.Empty; ucCalendar.DateTimeTextBox.Attributes["OnChange"] = postback; if (!ucCalendar.UseCustomCalendar) { onClick = " onClick=\" $j('#" + hdnDate.ClientID + "').val('" + itemID + "');" + ucCalendar.GenerateNonCustomCalendarImageEvent() + "\""; } else { onClick = " onClick=\" $j('#" + hdnDate.ClientID + "').val('" + itemID + "'); var dt = $j('#" + ucCalendar.DateTimeTextBox.ClientID + "'); dt.val('" + date + "'); dt.cmsdatepicker('setLocation','" + imageID + "'); dt.cmsdatepicker('show');\""; } val = "\"""; break; } return val; } protected void Page_PreRender(object sender, EventArgs e) { // Display message if user has no site if ((!siteSelector.UniSelector.HasData) && (!CMSContext.CurrentUser.IsGlobalAdministrator)) { ShowError(GetString("Administration-User_Edit_Roles.UserWithNoSites")); } } /// /// Handles site selection change event. /// protected void UniSelector_OnSelectionChanged(object sender, EventArgs e) { pnlUpdate.Update(); } protected void usRoles_OnSelectionChanged(object sender, EventArgs e) { SaveData(); } #endregion #region "Methods" /// /// Check whether current user is allowed to modify another user. /// /// Modified user /// "" or error message. protected static string ValidateGlobalAndDeskAdmin(UserInfo ui) { string result = String.Empty; if (CMSContext.CurrentUser.IsGlobalAdministrator) { return result; } if (ui == null) { result = ResHelper.GetString("Administration-User.WrongUserId"); } else { if (ui.IsGlobalAdministrator) { result = ResHelper.GetString("Administration-User.NotAllowedToModify"); } } return result; } /// /// Saves data. /// private void SaveData() { // Check "modify" permission if (!CMSContext.CurrentUser.IsAuthorizedPerResource("CMS.Users", "ManageUserRoles")) { RedirectToAccessDenied("CMS.Users", "Manage user roles"); } bool saved = false; string result = ValidateGlobalAndDeskAdmin(ui); if (result != String.Empty) { ShowError(result); return; } // Remove old items string newValues = ValidationHelper.GetString(usRoles.Value, null); string items = DataHelper.GetNewItemsInList(newValues, currentValues); if (!String.IsNullOrEmpty(items)) { string[] newItems = items.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); if (newItems != null) { // Add all new items to site foreach (string item in newItems) { int roleID = ValidationHelper.GetInteger(item, 0); UserRoleInfoProvider.RemoveUserFromRole(userId, roleID); } saved = true; } } // Add new items items = DataHelper.GetNewItemsInList(currentValues, newValues); if (!String.IsNullOrEmpty(items)) { string[] newItems = items.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); if (newItems != null) { DateTime dt = ValidationHelper.GetDateTime(hdnDate.Value, DateTimeHelper.ZERO_TIME); // Add all new items to site foreach (string item in newItems) { int roleID = ValidationHelper.GetInteger(item, 0); UserRoleInfoProvider.AddUserToRole(userId, roleID, dt); } saved = true; } } if (saved) { ShowChangesSaved(); usRoles.Reload(true); } } protected override void OnPreRender(EventArgs e) { if (RequestHelper.IsPostBack()) { pnlBasic.Update(); } base.OnPreRender(e); } #endregion }