using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using VEPROMS.CSLA.Library; using Volian.Base.Library; using Volian.Controls.Library; using System.Linq; namespace VEPROMS { //C2024-047 Redesign PROMS Security Dialog public partial class dlgManageSecurity : Form { #region Log4Net private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endregion #region Main Form / Shared Code private GroupInfoList myGroupInfoList; private UserInfoList myUserInfoList; private List myMembershipInfoList; private Folder myFolder; public dlgManageSecurity() { InitializeComponent(); } private void dlgManageSecurity_Load(object sender, EventArgs e) { //load all folders myFolder = Folder.Get(1); //Default to Users Tab tcSecurity.SelectedIndex = 2; } //This is called when the Index Changes for main tab Control //it loads info for the current tab private void changedTab(object sender, EventArgs e) { LoadRefreshGroupUsers(); switch (tcSecurity.SelectedIndex) { //Manage Folders case 0: SetupFolderOptions(); break; //Manage Groups case 1: SetupGroups(); break; //Manage Users (note that this is the default) case 2: SetupUserOptions(); break; //Default Options tab case 3: SetupDefaultGroupOptions(); break; } } //Loads a refreshed list of Groups and Users private void LoadRefreshGroupUsers() { GroupInfoList.Reset(); myGroupInfoList = GroupInfoList.Get(); UserInfoList.Reset(); myUserInfoList = UserInfoList.Get(); } #endregion #region Manage Folders //Sets up Folders private void SetupFolderOptions() { if (tvFolders.Nodes.Count == 0) { FolderInfo fi = FolderInfo.Get(1); LoadChildFolders(fi, null); } } //loads child folders in tree view private void LoadChildFolders(FolderInfo fi, TreeNode tn) { if (tn == null) { tn = tvFolders.Nodes.Add(fi.Name); tn.Tag = fi; } else { tn = tn.Nodes.Add(fi.Name); tn.Tag = fi; } if (fi.ChildFolderCount > 0) { foreach (FolderInfo fic in fi.SortedChildFolders) { LoadChildFolders(fic, tn); } } } //Handles Creating a New Group private void createGroupMenuItem(object sender, EventArgs e) { try { ToolStripDropDownItem tsddi = sender as ToolStripDropDownItem; TreeNode tn = tvFolders.SelectedNode; FolderInfo fi = tn.Tag as FolderInfo; AddNewGroup(tsddi.Text, fi); } catch (Exception ex) { _MyLog.Warn("createGroupMenuItem", ex); } } private void AddNewGroup(string txt, FolderInfo fi) { txt = txt.Replace("Create", "").Replace(" a ", "").Replace("Group", "").Trim(); RoleInfoList ril = RoleInfoList.Get(); // B2022-080: cannot add a new group in Proms security. if the sql database's 'Roles' table was not initialized with the default roles, such as Set Administrator, // Writer, Reviewer, RO Editor, the Adding of new groups won't work. Databases should have this loaded by default. // Promsfixes has queries that insert these, but only gets run if there are no assignments (see commands under --define Roles) if (ril == null || ril.Count < 2) { MessageBox.Show("Roles table is missing entries.\r\nPlease contact Volian to create other groups.", "Cannot create groups", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } foreach (var ri in ril.Where(ri => ri.Name == txt)) { string gin = string.Format("{0}s - {1}", ri.Name, fi.Name); if (!myGroupInfoList.Any(gi => gi.GroupName == gin)) { Group group = Group.MakeGroup(gin, null, null); Assignment.MakeAssignment(group, Role.Get(ri.RID), Folder.Get(fi.FolderID), null); } } LoadRefreshGroupUsers(); } private void tvFolders_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { tvFolders.SelectedNode = e.Node; } #endregion #region Manage Groups //Sets up Group Options private void SetupGroups() { cbGroupSelection.Items.Clear(); foreach (GroupInfo gi in myGroupInfoList) cbGroupSelection.Items.Add(gi.GroupName); cbGroupSelection.SelectedIndex = 0; } private void cbGroupSelection_SelectedIndexChanged(object sender, EventArgs e) => updateMembershipLists(); //Updates the lists of members / nonMembers private void updateMembershipLists() { myMembershipInfoList = new List(); if (cbGroupSelection.SelectedIndex > -1) { GroupInfo gi = myGroupInfoList[cbGroupSelection.SelectedIndex]; gi.RefreshGroupMemberships(); if (gi.GroupMembershipCount > 0) myMembershipInfoList.AddRange(gi.GroupMemberships.Where(mi => mi.EndDate == null || mi.EndDate == string.Empty).OrderBy(x => x.MyUserUserID)); } lstMembers.DataSource = myMembershipInfoList; lstMembers.ValueMember = "UID"; lstMembers.DisplayMember = "MyUserUserID"; //set NonMembers to Users that are not in Members lstNonMembers.DataSource = myUserInfoList.Select(x => x.UserID).Except(myMembershipInfoList.Select(x => x.MyUser.UserID)).ToList(); } //Add a Member to a Group private void addMember_Click(object sender, EventArgs e) { int groupIndex = cbGroupSelection.SelectedIndex; string selectedUserID = lstNonMembers.SelectedValue.ToString(); int selectedUID = UserInfo.GetByUserID(selectedUserID).UID; GroupInfo gi = myGroupInfoList[groupIndex]; User selectedUser = User.Get(selectedUID); Membership.MakeMembership(selectedUser, Group.Get(gi.GID), null, ""); updateMembershipLists(); lstNonMembers.SelectedIndex = -1; int index = lstMembers.FindString(selectedUserID); lstMembers.SetSelected(index, true); } //Remove a Member From a Group private void removeMember_Click(object sender, EventArgs e) { if (lstMembers.SelectedIndex > -1) { MembershipInfo mi = (MembershipInfo)lstMembers.SelectedItem; string selectedUserID = mi.MyUserUserID; string msg = "Are you sure you want to remove this Group Member?"; if (MessageBox.Show(this, msg, "Confirm Group Member Removal", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes) { if (mi.MyGroup.GroupName == "Administrators" && mi.MyGroup.GroupMemberships.Count(mm => mm.EndDate == null || mm.EndDate == string.Empty) == 1) { MessageBox.Show("You must have at least 1 user assigned to the Administrators group", "One Administrator Required", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } Membership m = Membership.Get(mi.UGID); m.EndDate = DateTime.Now.ToShortDateString(); m.Save(); updateMembershipLists(); lstMembers.SelectedIndex = -1; lstNonMembers.SelectedItem = selectedUserID; } } } //Deletes the Currently Selected Group private void deleteGroup_Click(object sender, EventArgs e) { if (cbGroupSelection.SelectedIndex < 0) { MessageBox.Show("You must select a group to delete", "No Group Selected", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } GroupInfo gi = myGroupInfoList[cbGroupSelection.SelectedIndex]; if(myFolder.FolderConfig.Security_Group == gi.GID) { MessageBox.Show("Cannot Delete Default Group", "Attempt to Delete Default", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } bool deleteOK = true; if (gi.GroupMembershipCount > 0 && gi.GroupMemberships.Any(mi => mi.EndDate == null || mi.EndDate == string.Empty)) deleteOK = false; if (!deleteOK) { MessageBox.Show("There are still users who are members of this group. You need to delete all members in order to delete this group.", "Group Has Members", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (MessageBox.Show("Are you sure you want to delete this group?", "Confirm Deleting Group", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes) { Group.Delete(gi.GID); LoadRefreshGroupUsers(); SetupGroups(); } } #endregion #region Manage Users //Sets up UserOptions private void SetupUserOptions() { lstUsers.Items.Clear(); foreach (UserInfo ui in myUserInfoList) lstUsers.Items.Add(ui.UserID); lstUsers.SelectedIndex = -1; lstGroups.DataSource = null; } #region Manage Users - User Options //Build Membership list based on selected user private void lstUsers_SelectedIndexChanged(object sender, EventArgs e) { myMembershipInfoList = new List(); if (lstUsers.SelectedIndex > -1) { UserInfo ui = myUserInfoList[lstUsers.SelectedIndex]; if (ui.UserMembershipCount > 0) { myMembershipInfoList.AddRange(ui.UserMemberships.Where(mi => mi.EndDate == null || mi.EndDate == string.Empty)); } } lstGroups.DataSource = myMembershipInfoList; lstGroups.ValueMember = "UGID"; lstGroups.DisplayMember = "MyGroupName"; } //Select User and set up Mouse Click Menus based on //where click in User Box private void lstUsers_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { int k = lstUsers.IndexFromPoint(e.Location); if (k >= 0) { lstUsers.SelectedIndex = k; editUserToolStripMenuItem.Visible = deleteUserToolStripMenuItem.Visible = true; } else { addUserToolStripMenuItem.Visible = true; editUserToolStripMenuItem.Visible = deleteUserToolStripMenuItem.Visible = false; } cmUsers.Show(lstUsers, e.Location); } else if (e.Button == MouseButtons.Left) { int k = lstUsers.IndexFromPoint(e.Location); if (k >= 0) { lstUsers.SelectedIndex = k; } } } //Adds a new User private void addUserToolStripMenuItem_Click(object sender, EventArgs e) { User u = User.MakeUser("[Enter New UserID]", "", "", "", "", "", "", "", "", "", "", DateTime.Now, ""); frmManageUser frm = new frmManageUser("add"); frm.MyUser = u; if (frm.ShowDialog(this) == DialogResult.OK) { u = frm.MyUser; u.Save(); Membership.MakeMembership(u, Group.Get(myFolder.FolderConfig.Security_Group), "", ""); //Update the User list to reflect the added user LoadRefreshGroupUsers(); SetupUserOptions(); lstUsers.SelectedItem = u.UserID; } else { u.Delete(); } } //Edit a User's details private void editUserToolStripMenuItem_Click(object sender, EventArgs e) { if (lstUsers.SelectedIndex == -1) { MessageBox.Show("You must select a user to edit", "No User Selected", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } UserInfo ui = myUserInfoList[lstUsers.SelectedIndex]; using (User u = User.Get(ui.UID)) { frmManageUser frm = new frmManageUser("edit"); frm.MyUser = u; if (frm.ShowDialog(this) == DialogResult.OK) { frm.MyUser.Save(); //Update the User list to reflect the edited user //this is done in case the UserID is updated so the list updates to reflect that LoadRefreshGroupUsers(); SetupUserOptions(); lstUsers.SelectedItem = u.UserID; } } } //Delete a User private void deleteUserToolStripMenuItem_Click(object sender, EventArgs e) { if (lstUsers.SelectedIndex == -1) { MessageBox.Show("You must select a user to delete", "No User Selected", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } UserInfo ui = myUserInfoList[lstUsers.SelectedIndex]; SessionInfoList sil = SessionInfoList.Get(); foreach (SessionInfo si in sil) { if (si.UserID == ui.UserID && (si.DTSEnd == null)) { MessageBox.Show("The user selected has an active session. You may not delete the user at this time.", "User Active Session", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } } int nummemberships = ui.UserMemberships.Count(mi => mi.EndDate == null || mi.EndDate == string.Empty); string mem_text = nummemberships > 0 ? "\r\nNote that this will remove all memberships that this user has." : ""; if (MessageBox.Show($"Are you sure you want to delete this user?{mem_text}", "Confirm Deleting User", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes) { foreach (MembershipInfo minfo in ui.UserMemberships.Where(mi => mi.EndDate == null || mi.EndDate == string.Empty)) { Membership m = Membership.Get(minfo.UGID); m.EndDate = DateTime.Now.ToShortDateString(); m.Save(); } User.Delete(ui.UID); //Update the User list to reflect the deleted user LoadRefreshGroupUsers(); SetupUserOptions(); lstUsers.SelectedIndex = -1; lstGroups.DataSource = null; } } #endregion #region Manage Users - Member Options //Adds Context Menu for when a Group is selected private void lstGroups_MouseUp(object sender, MouseEventArgs e) { cmMembers.Items.Clear(); lstGroups.SelectedIndex = -1; if (e.Button == MouseButtons.Right) { int k = lstGroups.IndexFromPoint(e.Location); if (k >= 0) { lstGroups.SelectedIndex = k; cmMembers.Items.Add(this.removeMemberToolStripMenuItem); } var groupsCanAddTo = myGroupInfoList.Select(x => new { x.GroupName, x.GID }).Except(myMembershipInfoList.Select(x => new { x.MyGroup.GroupName, x.GID })); foreach (var possiblegroup in groupsCanAddTo) { ToolStripMenuItemwithValue AddToMenuItem = new ToolStripMenuItemwithValue($"Add as Member to Group: {possiblegroup.GroupName}", possiblegroup.GID); AddToMenuItem.Click += addMemberToolStripMenuItem_Click; cmMembers.Items.Add(AddToMenuItem); } cmMembers.Show(lstGroups, e.Location); } else if (e.Button == MouseButtons.Left) { int k = lstGroups.IndexFromPoint(e.Location); if (k >= 0) { lstGroups.SelectedIndex = k; } } } //Adds a User to a Group private void addMemberToolStripMenuItem_Click(object sender, EventArgs e) { ToolStripMenuItemwithValue item = (ToolStripMenuItemwithValue)sender; int userIndex = lstUsers.SelectedIndex; UserInfo ui = myUserInfoList[userIndex]; Membership.MakeMembership(User.Get(ui.UID), Group.Get((int) item.Value), null, ""); //Update the Group list to reflect the added group LoadRefreshGroupUsers(); lstUsers_SelectedIndexChanged(sender, e); } //Removes a User from a Group private void removeMemberToolStripMenuItem_Click(object sender, EventArgs e) { MembershipInfo mi = (MembershipInfo)lstGroups.SelectedItem; string msg = "Are you sure you want to remove this Group Member?"; if (MessageBox.Show(this, msg, "Confirm Group Member Removal", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes) { if (mi.MyGroup.GroupName == "Administrators" && mi.MyGroup.GroupMemberships.Count(mm => mm.EndDate == null || mm.EndDate == string.Empty) == 1) { MessageBox.Show("You must have at least 1 user assigned to the Administrators group", "One Administrator Required", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } Membership m = Membership.Get(mi.UGID); m.EndDate = DateTime.Now.ToShortDateString(); m.Save(); //Update the Group list to reflect the removed group LoadRefreshGroupUsers(); lstUsers_SelectedIndexChanged(sender, e); } } #endregion #endregion #region Default Options //Sets up Default Group options for Default Tab private void SetupDefaultGroupOptions() { pnlGroups.Controls.Clear(); foreach (GroupInfo gi in myGroupInfoList) { RadioButton rb = new RadioButton(); rb.Text = gi.GroupName; rb.Parent = pnlGroups; rb.Dock = DockStyle.Top; rb.Tag = gi; rb.CheckedChanged -= new EventHandler(rb_CheckedChanged); rb.CheckedChanged += new EventHandler(rb_CheckedChanged); pnlGroups.Controls.Add(rb); rb.BringToFront(); if (myFolder.FolderConfig.Security_Group == 0 && gi.GID == 1) { myFolder.FolderConfig.Security_Group = gi.GID; rb.Checked = true; myFolder.Save(); } else if (myFolder.FolderConfig.Security_Group == gi.GID) { rb.Checked = true; } } } //Handles changing the default group private void rb_CheckedChanged(object sender, EventArgs e) { RadioButton rb = sender as RadioButton; GroupInfo gi = rb.Tag as GroupInfo; label8.Text = gi.GroupAssignments[0].MyRole.Title + " for " + gi.GroupAssignments[0].MyFolder.Name; myFolder.FolderConfig.Security_Group = gi.GID; myFolder.Save(); } #endregion } }