Exemple #1
0
        private void butOK_Click(object sender, EventArgs e)
        {
            if (textUserName.Text == "")
            {
                OpenDental.MessageBox.Show(this, "Please enter a username.");
                return;
            }
            if (listUserGroup.SelectedItems.Count == 0)
            {
                OpenDental.MessageBox.Show(this, "Every user must be associated to at least one User Group.");
                return;
            }
            List <AlertSub> listAlertSubsCur = new List <AlertSub>();

            foreach (int index in listAlertSubMulti.SelectedIndices)
            {
                AlertSub alertSub = new AlertSub();
                alertSub.ClinicNum = 0;
                alertSub.UserNum   = Security.CurUser.UserNum;
                alertSub.Type      = (AlertType)index;
                listAlertSubsCur.Add(alertSub);
            }
            AlertSubs.Sync(listAlertSubsCur, _listAlertSubsOld);
            UserCur.IsHidden = checkIsHidden.Checked;
            UserCur.UserName = textUserName.Text;
            if (UserCur.UserNum == Security.CurUser.UserNum)
            {
                Security.CurUser.UserName = textUserName.Text;
                //They changed their logged in user's information.  Update for when they sync then attempt to connect to remote DB.
            }
            UserCur.EmployeeNum        = 0;
            UserCur.ProvNum            = 0;
            UserCur.ClinicNum          = 0;
            UserCur.ClinicIsRestricted = false;
            try{
                if (UserCur.IsNew)
                {
                    //also updates the user's UserNumCEMT to be the user's usernum.
                    long userNum = Userods.Insert(UserCur, listUserGroup.SelectedItems.OfType <ODBoxItem <UserGroup> >().Select(x => x.Tag.UserGroupNum).ToList(), true);
                }
                else
                {
                    Userods.Update(UserCur, listUserGroup.SelectedItems.OfType <ODBoxItem <UserGroup> >().Select(x => x.Tag.UserGroupNum).ToList());
                }
            }
            catch (Exception ex) {
                OpenDental.MessageBox.Show(ex.Message);
                return;
            }
            Cache.Refresh(InvalidType.Security);
            DialogResult = DialogResult.OK;
        }
Exemple #2
0
        private void FormCentralUserEdit_Load(object sender, EventArgs e)
        {
            checkIsHidden.Checked = UserCur.IsHidden;
            textUserName.Text     = UserCur.UserName;
            List <UserGroup> listUserGroups = UserGroups.GetDeepCopy();

            _isFillingList = true;
            for (int i = 0; i < listUserGroups.Count; i++)
            {
                UserGroup             groupCur     = listUserGroups[i];
                ODBoxItem <UserGroup> boxItemGroup = new ODBoxItem <UserGroup>(groupCur.Description, groupCur);
                listUserGroup.Items.Add(boxItemGroup);
                if (UserCur.IsInUserGroup(groupCur.UserGroupNum))
                {
                    listUserGroup.SetSelected(i, true);
                }
            }
            if (listUserGroup.SelectedIndex == -1)          //never allowed to delete last group, so this won't fail
            {
                listUserGroup.SelectedIndex = 0;
            }
            _isFillingList = false;
            securityTreeUser.FillTreePermissionsInitial();
            RefreshUserTree();
            if (UserCur.PasswordHash == "")
            {
                butPassword.Text = "Create Password";
            }
            _listAlertSubsOld = AlertSubs.GetAllForUser(Security.CurUser.UserNum);
            listAlertSubMulti.Items.Clear();
            string[] arrayAlertTypes = Enum.GetNames(typeof(AlertType));
            for (int i = 0; i < arrayAlertTypes.Length; i++)
            {
                listAlertSubMulti.Items.Add(arrayAlertTypes[i]);
                listAlertSubMulti.SetSelected(i, _listAlertSubsOld.Exists(x => x.Type == (AlertType)i));
            }
            if (UserCur.IsNew)
            {
                butUnlock.Visible = false;
            }
        }
Exemple #3
0
        private void FormUserEdit_Load(object sender, System.EventArgs e)
        {
            checkIsHidden.Checked = UserCur.IsHidden;
            if (UserCur.UserNum != 0)
            {
                textUserNum.Text = UserCur.UserNum.ToString();
            }
            textUserName.Text   = UserCur.UserName;
            textDomainUser.Text = UserCur.DomainUser;
            if (!PrefC.GetBool(PrefName.DomainLoginEnabled))
            {
                labelDomainUser.Visible   = false;
                textDomainUser.Visible    = false;
                butPickDomainUser.Visible = false;
            }
            checkRequireReset.Checked = UserCur.IsPasswordResetRequired;
            _listUserGroups           = UserGroups.GetList();
            _isFillingList            = true;
            for (int i = 0; i < _listUserGroups.Count; i++)
            {
                listUserGroup.Items.Add(new ODBoxItem <UserGroup>(_listUserGroups[i].Description, _listUserGroups[i]));
                if (!_isFromAddUser && UserCur.IsInUserGroup(_listUserGroups[i].UserGroupNum))
                {
                    listUserGroup.SetSelected(i, true);
                }
                if (_isFromAddUser && _listUserGroups[i].UserGroupNum == PrefC.GetLong(PrefName.DefaultUserGroup))
                {
                    listUserGroup.SetSelected(i, true);
                }
            }
            if (listUserGroup.SelectedIndex == -1)          //never allowed to delete last group, so this won't fail
            {
                listUserGroup.SelectedIndex = 0;
            }
            _isFillingList = false;
            securityTreeUser.FillTreePermissionsInitial();
            RefreshUserTree();
            listEmployee.Items.Clear();
            listEmployee.Items.Add(Lan.g(this, "none"));
            listEmployee.SelectedIndex = 0;
            _listEmployees             = Employees.GetDeepCopy(true);
            for (int i = 0; i < _listEmployees.Count; i++)
            {
                listEmployee.Items.Add(Employees.GetNameFL(_listEmployees[i]));
                if (UserCur.EmployeeNum == _listEmployees[i].EmployeeNum)
                {
                    listEmployee.SelectedIndex = i + 1;
                }
            }
            listProv.Items.Clear();
            listProv.Items.Add(Lan.g(this, "none"));
            listProv.SelectedIndex = 0;
            _listProviders         = Providers.GetDeepCopy(true);
            for (int i = 0; i < _listProviders.Count; i++)
            {
                listProv.Items.Add(_listProviders[i].GetLongDesc());
                if (UserCur.ProvNum == _listProviders[i].ProvNum)
                {
                    listProv.SelectedIndex = i + 1;
                }
            }
            _listClinics           = Clinics.GetDeepCopy(true);
            _listUserAlertTypesOld = AlertSubs.GetAllForUser(UserCur.UserNum);
            List <long> listSubscribedClinics;
            bool        isAllClinicsSubscribed = false;

            if (_listUserAlertTypesOld.Select(x => x.ClinicNum).Contains(-1))             //User subscribed to all clinics
            {
                isAllClinicsSubscribed = true;
                listSubscribedClinics  = _listClinics.Select(x => x.ClinicNum).Distinct().ToList();
            }
            else
            {
                listSubscribedClinics = _listUserAlertTypesOld.Select(x => x.ClinicNum).Distinct().ToList();
            }
            List <long> listAlertCatNums = _listUserAlertTypesOld.Select(x => x.AlertCategoryNum).Distinct().ToList();

            listAlertSubMulti.Items.Clear();
            _listAlertCategories = AlertCategories.GetDeepCopy();
            List <long> listUserAlertCatNums = _listUserAlertTypesOld.Select(x => x.AlertCategoryNum).ToList();

            foreach (AlertCategory cat in _listAlertCategories)
            {
                int index = listAlertSubMulti.Items.Add(Lan.g(this, cat.Description));
                listAlertSubMulti.SetSelected(index, listUserAlertCatNums.Contains(cat.AlertCategoryNum));
            }
            if (!PrefC.HasClinicsEnabled)
            {
                tabClinics.Enabled = false;              //Disables all controls in the clinics tab.  Tab is still selectable.
                listAlertSubsClinicsMulti.Visible = false;
                labelAlertClinic.Visible          = false;
            }
            else
            {
                listClinic.Items.Clear();
                listClinic.Items.Add(Lan.g(this, "All"));
                listAlertSubsClinicsMulti.Items.Add(Lan.g(this, "All"));
                listAlertSubsClinicsMulti.Items.Add(Lan.g(this, "Headquarters"));
                if (UserCur.ClinicNum == 0)               //Unrestricted
                {
                    listClinic.SetSelected(0, true);
                    checkClinicIsRestricted.Enabled = false; //We don't really need this checkbox any more but it's probably better for users to keep it....
                }
                if (isAllClinicsSubscribed)                  //They are subscribed to all clinics
                {
                    listAlertSubsClinicsMulti.SetSelected(0, true);
                }
                else if (listSubscribedClinics.Contains(0))                 //They are subscribed to Headquarters
                {
                    listAlertSubsClinicsMulti.SetSelected(1, true);
                }
                List <UserClinic> listUserClinics = UserClinics.GetForUser(UserCur.UserNum);
                for (int i = 0; i < _listClinics.Count; i++)
                {
                    listClinic.Items.Add(_listClinics[i].Abbr);
                    listClinicMulti.Items.Add(_listClinics[i].Abbr);
                    listAlertSubsClinicsMulti.Items.Add(_listClinics[i].Abbr);
                    if (UserCur.ClinicNum == _listClinics[i].ClinicNum)
                    {
                        listClinic.SetSelected(i + 1, true);
                    }
                    if (UserCur.ClinicNum != 0 && listUserClinics.Exists(x => x.ClinicNum == _listClinics[i].ClinicNum))
                    {
                        listClinicMulti.SetSelected(i, true);                       //No "All" option, don't select i+1
                    }
                    if (!isAllClinicsSubscribed && _listUserAlertTypesOld.Exists(x => x.ClinicNum == _listClinics[i].ClinicNum))
                    {
                        listAlertSubsClinicsMulti.SetSelected(i + 2, true);                     //All+HQ
                    }
                }
                checkClinicIsRestricted.Checked = UserCur.ClinicIsRestricted;
            }
            if (string.IsNullOrEmpty(UserCur.PasswordHash))
            {
                butPassword.Text = Lan.g(this, "Create Password");
            }
            if (!PrefC.IsODHQ)
            {
                butJobRoles.Visible = false;
            }
            if (IsNew)
            {
                butUnlock.Visible = false;
            }
            _listDoseSpotUserPrefOld = UserOdPrefs.GetByUserAndFkeyAndFkeyType(UserCur.UserNum,
                                                                               Programs.GetCur(ProgramName.eRx).ProgramNum, UserOdFkeyType.Program,
                                                                               Clinics.GetForUserod(Security.CurUser, true).Select(x => x.ClinicNum)
                                                                               .Union(new List <long>()
            {
                0
            })                                                //Always include 0 clinic, this is the default, NOT a headquarters only value.
                                                                               .Distinct()
                                                                               .ToList());
            _listDoseSpotUserPrefNew = _listDoseSpotUserPrefOld.Select(x => x.Clone()).ToList();
            _doseSpotUserPrefDefault = _listDoseSpotUserPrefNew.Find(x => x.ClinicNum == 0);
            if (_doseSpotUserPrefDefault == null)
            {
                _doseSpotUserPrefDefault = DoseSpot.GetDoseSpotUserIdFromPref(UserCur.UserNum, 0);
                _listDoseSpotUserPrefNew.Add(_doseSpotUserPrefDefault);
            }
            textDoseSpotUserID.Text = _doseSpotUserPrefDefault.ValueString;
            if (_isFromAddUser && !Security.IsAuthorized(Permissions.SecurityAdmin, true))
            {
                butPassword.Visible       = false;
                checkRequireReset.Checked = true;
                checkRequireReset.Enabled = false;
                butUnlock.Visible         = false;
                butJobRoles.Visible       = false;
            }
            if (!PrefC.HasClinicsEnabled)
            {
                butDoseSpotAdditional.Visible = false;
            }
        }
Exemple #4
0
        private void butOK_Click(object sender, System.EventArgs e)
        {
            if (textUserName.Text == "")
            {
                MsgBox.Show(this, "Please enter a username.");
                return;
            }
            if (!_isFromAddUser && IsNew && PrefC.GetBool(PrefName.PasswordsMustBeStrong) && string.IsNullOrWhiteSpace(_passwordTyped))
            {
                MsgBox.Show(this, "Password may not be blank when the strong password feature is turned on.");
                return;
            }
            if (PrefC.HasClinicsEnabled && listClinic.SelectedIndex == -1)
            {
                MsgBox.Show(this, "This user does not have a User Default Clinic set.  Please choose one to continue.");
                return;
            }
            if (listUserGroup.SelectedIndices.Count == 0)
            {
                MsgBox.Show(this, "Users must have at least one user group associated. Please select a user group to continue.");
                return;
            }
            if (_isFromAddUser && !Security.IsAuthorized(Permissions.SecurityAdmin, true) &&
                (listUserGroup.SelectedItems.Count != 1 || listUserGroup.GetSelected <UserGroup>().UserGroupNum != PrefC.GetLong(PrefName.DefaultUserGroup)))
            {
                MsgBox.Show(this, "This user must be assigned to the default user group.");
                for (int i = 0; i < listUserGroup.Items.Count; i++)
                {
                    if (((ODBoxItem <UserGroup>)listUserGroup.Items[i]).Tag.UserGroupNum == PrefC.GetLong(PrefName.DefaultUserGroup))
                    {
                        listUserGroup.SetSelected(i, true);
                    }
                    else
                    {
                        listUserGroup.SetSelected(i, false);
                    }
                }
                return;
            }
            List <UserClinic> listUserClinics = new List <UserClinic>();

            if (PrefC.HasClinicsEnabled && checkClinicIsRestricted.Checked)             //They want to restrict the user to certain clinics or clinics are enabled.
            {
                for (int i = 0; i < listClinicMulti.SelectedIndices.Count; i++)
                {
                    listUserClinics.Add(new UserClinic(_listClinics[listClinicMulti.SelectedIndices[i]].ClinicNum, UserCur.UserNum));
                }
                //If they set the user up with a default clinic and it's not in the restricted list, return.
                if (!listUserClinics.Exists(x => x.ClinicNum == _listClinics[listClinic.SelectedIndex - 1].ClinicNum))
                {
                    MsgBox.Show(this, "User cannot have a default clinic that they are not restricted to.");
                    return;
                }
            }
            if (!PrefC.HasClinicsEnabled || listClinic.SelectedIndex == 0)
            {
                UserCur.ClinicNum = 0;
            }
            else
            {
                UserCur.ClinicNum = _listClinics[listClinic.SelectedIndex - 1].ClinicNum;
            }
            UserCur.ClinicIsRestricted      = checkClinicIsRestricted.Checked;     //This is kept in sync with their choice of "All".
            UserCur.IsHidden                = checkIsHidden.Checked;
            UserCur.IsPasswordResetRequired = checkRequireReset.Checked;
            UserCur.UserName                = textUserName.Text;
            if (listEmployee.SelectedIndex == 0)
            {
                UserCur.EmployeeNum = 0;
            }
            else
            {
                UserCur.EmployeeNum = _listEmployees[listEmployee.SelectedIndex - 1].EmployeeNum;
            }
            if (listProv.SelectedIndex == 0)
            {
                Provider prov = Providers.GetProv(UserCur.ProvNum);
                if (prov != null)
                {
                    prov.IsInstructor = false;                  //If there are more than 1 users associated to this provider, they will no longer be an instructor.
                    Providers.Update(prov);
                }
                UserCur.ProvNum = 0;
            }
            else
            {
                Provider prov = Providers.GetProv(UserCur.ProvNum);
                if (prov != null)
                {
                    if (prov.ProvNum != _listProviders[listProv.SelectedIndex - 1].ProvNum)
                    {
                        prov.IsInstructor = false;                      //If there are more than 1 users associated to this provider, they will no longer be an instructor.
                    }
                    Providers.Update(prov);
                }
                UserCur.ProvNum = _listProviders[listProv.SelectedIndex - 1].ProvNum;
            }
            try{
                if (IsNew)
                {
                    Userods.Insert(UserCur, listUserGroup.SelectedItems.OfType <ODBoxItem <UserGroup> >().Select(x => x.Tag.UserGroupNum).ToList());
                    //Set the userodprefs to the new user's UserNum that was just retreived from the database.
                    _listDoseSpotUserPrefNew.ForEach(x => x.UserNum = UserCur.UserNum);
                    listUserClinics.ForEach(x => x.UserNum          = UserCur.UserNum);         //Set the user clinic's UserNum to the one we just inserted.
                    SecurityLogs.MakeLogEntry(Permissions.AddNewUser, 0, "New user '" + UserCur.UserName + "' added");
                }
                else
                {
                    List <UserGroup> listNewUserGroups = listUserGroup.SelectedItems.OfType <ODBoxItem <UserGroup> >().Select(x => x.Tag).ToList();
                    List <UserGroup> listOldUserGroups = UserCur.GetGroups();
                    Userods.Update(UserCur, listNewUserGroups.Select(x => x.UserGroupNum).ToList());
                    //if this is the current user, update the user, credentials, etc.
                    if (UserCur.UserNum == Security.CurUser.UserNum)
                    {
                        Security.CurUser = UserCur.Copy();
                        if (_passwordTyped != null)
                        {
                            Security.PasswordTyped = _passwordTyped;                           //update the password typed for middle tier refresh
                        }
                    }
                    //Log changes to the User's UserGroups.
                    Func <List <UserGroup>, List <UserGroup>, List <UserGroup> > funcGetMissing = (listCur, listCompare) => {
                        List <UserGroup> retVal = new List <UserGroup>();
                        foreach (UserGroup group in listCur)
                        {
                            if (listCompare.Exists(x => x.UserGroupNum == group.UserGroupNum))
                            {
                                continue;
                            }
                            retVal.Add(group);
                        }
                        return(retVal);
                    };
                    List <UserGroup> listRemovedGroups = funcGetMissing(listOldUserGroups, listNewUserGroups);
                    List <UserGroup> listAddedGroups   = funcGetMissing(listNewUserGroups, listOldUserGroups);
                    if (listRemovedGroups.Count > 0)                   //Only log if there are items in the list
                    {
                        SecurityLogs.MakeLogEntry(Permissions.SecurityAdmin, 0, "User " + UserCur.UserName +
                                                  " removed from User group(s): " + string.Join(", ", listRemovedGroups.Select(x => x.Description).ToArray()) + " by: " + Security.CurUser.UserName);
                    }
                    if (listAddedGroups.Count > 0)                   //Only log if there are items in the list.
                    {
                        SecurityLogs.MakeLogEntry(Permissions.SecurityAdmin, 0, "User " + UserCur.UserName +
                                                  " added to User group(s): " + string.Join(", ", listAddedGroups.Select(x => x.Description).ToArray()) + " by: " + Security.CurUser.UserName);
                    }
                }
                if (UserClinics.Sync(listUserClinics, UserCur.UserNum))                //Either syncs new list, or clears old list if no longer restricted.
                {
                    DataValid.SetInvalid(InvalidType.UserClinics);
                }
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message);
                return;
            }
            //DoseSpot User ID Insert/Update/Delete
            if (_doseSpotUserPrefDefault.ValueString != textDoseSpotUserID.Text)
            {
                if (string.IsNullOrWhiteSpace(textDoseSpotUserID.Text))
                {
                    UserOdPrefs.DeleteMany(_doseSpotUserPrefDefault.UserNum, _doseSpotUserPrefDefault.Fkey, UserOdFkeyType.Program);
                }
                else
                {
                    _doseSpotUserPrefDefault.ValueString = textDoseSpotUserID.Text.Trim();
                    UserOdPrefs.Upsert(_doseSpotUserPrefDefault);
                }
            }
            DataValid.SetInvalid(InvalidType.Security);
            //List of AlertTypes that are selected.
            List <long> listUserAlertCats = new List <long>();

            foreach (int index in listAlertSubMulti.SelectedIndices)
            {
                listUserAlertCats.Add(_listAlertCategories[index].AlertCategoryNum);
            }
            List <long> listClinics = new List <long>();

            foreach (int index in listAlertSubsClinicsMulti.SelectedIndices)
            {
                if (index == 0)               //All
                {
                    listClinics.Add(-1);      //Add All
                    break;
                }
                if (index == 1)               //HQ
                {
                    listClinics.Add(0);
                    continue;
                }
                Clinic clinic = _listClinics[index - 2];            //Subtract 2 for 'All' and 'HQ'
                listClinics.Add(clinic.ClinicNum);
            }
            List <AlertSub> _listUserAlertTypesNew = _listUserAlertTypesOld.Select(x => x.Copy()).ToList();

            //Remove AlertTypes that have been deselected through either deslecting the type or clinic.
            _listUserAlertTypesNew.RemoveAll(x => !listUserAlertCats.Contains(x.AlertCategoryNum));
            if (PrefC.HasClinicsEnabled)
            {
                _listUserAlertTypesNew.RemoveAll(x => !listClinics.Contains(x.ClinicNum));
            }
            foreach (long alertCatNum in listUserAlertCats)
            {
                if (!PrefC.HasClinicsEnabled)
                {
                    if (!_listUserAlertTypesOld.Exists(x => x.AlertCategoryNum == alertCatNum))                   //Was not subscribed to type.
                    {
                        _listUserAlertTypesNew.Add(new AlertSub(UserCur.UserNum, 0, alertCatNum));
                    }
                }
                else                  //Clinics enabled.
                {
                    foreach (long clinicNumCur in listClinics)
                    {
                        if (!_listUserAlertTypesOld.Exists(x => x.ClinicNum == clinicNumCur && x.AlertCategoryNum == alertCatNum))                     //Was not subscribed to type.
                        {
                            _listUserAlertTypesNew.Add(new AlertSub(UserCur.UserNum, clinicNumCur, alertCatNum));
                            continue;
                        }
                    }
                }
            }
            AlertSubs.Sync(_listUserAlertTypesNew, _listUserAlertTypesOld);
            UserOdPrefs.Sync(_listDoseSpotUserPrefNew, _listDoseSpotUserPrefOld);
            DialogResult = DialogResult.OK;
        }
        ///<summary>Generic function that launches different thread methods depending on how isSyncUsers and isSyncLocks are set.  Set only one or the other to true.</summary>
        private static string SyncAll(List <CentralConnection> listConns, bool isSyncUsers, bool isSyncLocks)
        {
            //Get CEMT users, groups, and associated permissions
            ListSyncErrors       = new List <string>();
            _listCEMTUsers       = Userods.GetUsersForCEMT();
            _securityLockDate    = PrefC.GetDate(PrefName.SecurityLockDate).ToShortDateString();
            _securityLockDays    = PrefC.GetInt(PrefName.SecurityLockDays);
            _securityLockAdmin   = PrefC.GetBool(PrefName.SecurityLockIncludesAdmin);
            _securityCentralLock = PrefC.GetBool(PrefName.CentralManagerSecurityLock);
            _syncCode            = PrefC.GetString(PrefName.CentralManagerSyncCode);
            _listAlertSubs       = AlertSubs.GetAll();
            List <CentralUserData> listCentralUserData = new List <CentralUserData>();
            List <UserGroup>       listUserGroups      = UserGroups.GetCEMTGroups();

            foreach (UserGroup userGroup in listUserGroups)             //for each CEMT user group
            //get all usergroupattaches, userods, and grouppermissions.
            {
                List <UserGroupAttach> listUserGroupAttaches = UserGroupAttaches.GetForUserGroup(userGroup.UserGroupNum);
                List <Userod>          listUserOds           = Userods.GetForGroup(userGroup.UserGroupNum);
                List <GroupPermission> listGroupPermissions  = GroupPermissions.GetPerms(userGroup.UserGroupNum);
                //then create a new CentralUserData and add it to the list.
                listCentralUserData.Add(new CentralUserData(userGroup, listUserOds, listGroupPermissions, listUserGroupAttaches));
            }
            string failedConns     = "";
            string nameConflicts   = "";
            string failedSyncCodes = "";

            for (int i = 0; i < listConns.Count; i++)
            {
                List <CentralUserData> listCentralDataForThreads = new List <CentralUserData>();
                for (int j = 0; j < listCentralUserData.Count; j++)
                {
                    listCentralDataForThreads.Add(listCentralUserData[j].Copy());
                }
                ODThread odThread = null;
                if (isSyncUsers)
                {
                    odThread = new ODThread(ConnectAndSyncUsers, new object[] { listConns[i], listCentralDataForThreads });
                    odThread.AddExceptionHandler(new ODThread.ExceptionDelegate(SyncExceptionHelper));
                }
                else if (isSyncLocks)
                {
                    odThread = new ODThread(ConnectAndSyncLocks, new object[] { listConns[i] });
                    odThread.AddExceptionHandler(new ODThread.ExceptionDelegate(SyncExceptionHelper));
                }
                else
                {
                    odThread = new ODThread(ConnectAndSyncAll, new object[] { listConns[i], listCentralDataForThreads });
                    odThread.AddExceptionHandler(new ODThread.ExceptionDelegate(SyncExceptionHelper));
                }
                odThread.GroupName = "Sync";
                odThread.Start(false);
            }
            ODThread.JoinThreadsByGroupName(Timeout.Infinite, "Sync");
            List <ODThread> listComplThreads = ODThread.GetThreadsByGroupName("Sync");

            for (int i = 0; i < listComplThreads.Count; i++)
            {
                if (listComplThreads[i].Tag == null)
                {
                    continue;                    //Failed due to lacking credentials
                }
                failedConns     += ((List <string>)listComplThreads[i].Tag)[0];
                nameConflicts   += ((List <string>)listComplThreads[i].Tag)[1];
                failedSyncCodes += ((List <string>)listComplThreads[i].Tag)[2];
                listComplThreads[i].QuitAsync();
            }
            string errorText = "";

            if (failedConns == "" && nameConflicts == "" && failedSyncCodes == "")
            {
                errorText += "Done";
            }
            if (failedConns != "")
            {
                errorText = "Failed Connections:\r\n" + failedConns + "Please try these connections again.\r\n";
            }
            if (nameConflicts != "")
            {
                errorText += "Name Conflicts:\r\n" + nameConflicts + "Please rename users and try again.\r\n";
            }
            if (failedSyncCodes != "")
            {
                errorText += "Incorrect Sync Codes:\r\n" + failedSyncCodes + "\r\n";
            }
            return(errorText);
        }
        ///<summary>Function used by threads to connect to remote databases and sync user settings.</summary>
        private static void ConnectAndSyncUsers(ODThread odThread)
        {
            CentralConnection      connection          = (CentralConnection)odThread.Parameters[0];
            List <CentralUserData> listCentralUserData = (List <CentralUserData>)odThread.Parameters[1];
            string serverName = "";

            if (connection.ServiceURI != "")
            {
                serverName = connection.ServiceURI;
            }
            else
            {
                serverName = connection.ServerName + ", " + connection.DatabaseName;
            }
            if (!CentralConnectionHelper.UpdateCentralConnection(connection, false))            //No updating the cache since we're going to be connecting to multiple remote servers at the same time.
            {
                odThread.Tag = new List <string>()
                {
                    serverName + "\r\n", "", ""
                };
                connection.ConnectionStatus = "OFFLINE";
                return;
            }
            string remoteSyncCode = PrefC.GetStringNoCache(PrefName.CentralManagerSyncCode);

            if (remoteSyncCode != _syncCode)
            {
                if (remoteSyncCode == "")
                {
                    Prefs.UpdateStringNoCache(PrefName.CentralManagerSyncCode, _syncCode);                   //Lock in the sync code for the remote server.
                }
                else
                {
                    odThread.Tag = new List <string>()
                    {
                        serverName + "\r\n", "", remoteSyncCode
                    };
                    return;
                }
            }
            //Get remote users, usergroups, associated permissions, and alertsubs
            List <Userod> listRemoteUsers = Userods.GetUsersNoCache();

            #region Detect Conflicts
            //User conflicts
            bool   nameConflict  = false;
            string nameConflicts = "";
            for (int i = 0; i < _listCEMTUsers.Count; i++)
            {
                for (int j = 0; j < listRemoteUsers.Count; j++)
                {
                    if (listRemoteUsers[j].UserName == _listCEMTUsers[i].UserName && listRemoteUsers[j].UserNumCEMT == 0)                 //User doesn't belong to CEMT
                    {
                        nameConflicts += listRemoteUsers[j].UserName + " already exists in " + serverName + "\r\n";
                        nameConflict   = true;
                        break;
                    }
                }
            }
            if (nameConflict)
            {
                odThread.Tag = new List <string>()
                {
                    serverName + "\r\n", nameConflicts, ""
                };
                return;                //Skip on to the next connection.
            }
            #endregion Detect Conflicts
            List <UserGroup> listRemoteCEMTUserGroups = UserGroups.GetCEMTGroupsNoCache();
            List <UserGroup> listCEMTUserGroups       = new List <UserGroup>();
            List <AlertSub>  listRemoteAlertSubs      = AlertSubs.GetAll();
            List <Clinic>    listRemoteClinics        = Clinics.GetClinicsNoCache();
            List <AlertSub>  listAlertSubsToInsert    = new List <AlertSub>();
            for (int i = 0; i < listCentralUserData.Count; i++)
            {
                listCEMTUserGroups.Add(listCentralUserData[i].UserGroup.Copy());
            }
            //SyncUserGroups returns the list of UserGroups for deletion so it can be used after syncing Users and GroupPermissions.
            List <UserGroup> listRemoteCEMTUserGroupsForDeletion = CentralUserGroups.Sync(listCEMTUserGroups, listRemoteCEMTUserGroups);
            listRemoteCEMTUserGroups = UserGroups.GetCEMTGroupsNoCache();
            for (int i = 0; i < listCentralUserData.Count; i++)
            {
                List <GroupPermission> listGroupPerms = new List <GroupPermission>();
                for (int j = 0; j < listRemoteCEMTUserGroups.Count; j++)
                {
                    if (listCentralUserData[i].UserGroup.UserGroupNumCEMT == listRemoteCEMTUserGroups[j].UserGroupNumCEMT)
                    {
                        for (int k = 0; k < listCentralUserData[i].ListGroupPermissions.Count; k++)
                        {
                            listCentralUserData[i].ListGroupPermissions[k].UserGroupNum = listRemoteCEMTUserGroups[j].UserGroupNum;                          //fixing primary keys to be what's in remote db
                        }
                        listGroupPerms = GroupPermissions.GetPermsNoCache(listRemoteCEMTUserGroups[j].UserGroupNum);
                    }
                }
                CentralUserods.Sync(listCentralUserData[i].ListUsers, listRemoteUsers);
                CentralGroupPermissions.Sync(listCentralUserData[i].ListGroupPermissions, listGroupPerms);
            }
            //Sync usergroup attaches
            SyncUserGroupAttaches(listCentralUserData);
            for (int j = 0; j < listRemoteCEMTUserGroupsForDeletion.Count; j++)
            {
                UserGroups.DeleteNoCache(listRemoteCEMTUserGroupsForDeletion[j]);
            }
            if (_listAlertSubs.Count > 0)
            {
                listRemoteUsers = Userods.GetUsersNoCache();              //Refresh users so we can do alertsubs.
            }
            //For each AlertSub, make a copy of that AlertSub for each Clinic.
            foreach (AlertSub alertSub in _listAlertSubs)
            {
                foreach (Clinic clinic in listRemoteClinics)
                {
                    AlertSub alert = new AlertSub();
                    alert.ClinicNum = clinic.ClinicNum;
                    alert.Type      = alertSub.Type;
                    alert.UserNum   = listRemoteUsers.Find(x => x.UserName == _listCEMTUsers.Find(y => y.UserNum == alertSub.UserNum).UserName).UserNum;
                    listAlertSubsToInsert.Add(alert);
                }
            }
            AlertSubs.DeleteAndInsertForSuperUsers(_listCEMTUsers, listAlertSubsToInsert);
            //Refresh server's cache of userods
            Signalods.SetInvalidNoCache(InvalidType.Security);
            SecurityLogs.MakeLogEntryNoCache(Permissions.SecurityAdmin, 0, "Enterprise Management Tool synced users.");
            odThread.Tag = new List <string>()
            {
                "", "", ""
            };                                                       //No errors.
        }
Exemple #7
0
        public void AlertItems_GetUniqueAlerts_Addclinic()
        {
            //This test will check the funcionality of alert items which are marked to show in all clinics(AlertItem.ClinicNum==-1).
            //Expected behaviour is that a user subscribed to all alert categories, and all clinics(AlertSub.ClinicNum==-1),
            //will see the alert no matter which clinic they are in.
            //In addition, when a new clinic is added, the user will be able to see alerts in that new clinic without the need to reenter
            //FormUserEdit and select "All" again under clinics for alert subscriptions.
            //Clear AlertSub table.
            AlertSubT.ClearAlertSubTable();
            //Create Users
            Userod userAdmin  = UserodT.CreateUser();
            Userod userNormal = UserodT.CreateUser();
            //Create Clinics
            List <Clinic> listClinics = new List <Clinic>();

            for (int i = 0; i < 2; i++)
            {
                listClinics.Add(ClinicT.CreateClinic());
            }
            //Create AlertItems
            //First alert Item is an alert item for all clinics(ClinicNum==-1).
            CreateAlertItem(true);
            //Second AlertItem is an AlertItem for HQ(ClinicNum==0).
            CreateAlertItem(false);
            List <AlertCategory> listAlertCats   = AlertCategories.GetDeepCopy();
            List <AlertSub>      listAlertSubOld = new List <AlertSub>();
            List <AlertSub>      listAlertSubNew = new List <AlertSub>();

            foreach (AlertCategory alertCat in listAlertCats)
            {
                AlertSub alSub = new AlertSub(userAdmin.UserNum, -1, alertCat.AlertCategoryNum);
                listAlertSubNew.Add(alSub);
            }
            AlertSubs.Sync(listAlertSubNew, listAlertSubOld);
            //Check number of alerts which will display in headquarters clinic.
            //Call CheckUniqueAlerts for user subscribed to all alert categories
            List <List <AlertItem> > listUniqueAlertsAll = AlertItems.GetUniqueAlerts(userAdmin.UserNum, 0);
            List <List <AlertItem> > listUniqueAlertsOne = AlertItems.GetUniqueAlerts(userNormal.UserNum, 0);

            //Assert lists are correct
            //UserAdmin should see two alerts, one for the generic headquarters alert and one for the eConnector all clinics alert.
            Assert.AreEqual(2, listUniqueAlertsAll.Count());
            //UserNormal is not subscribed to any clinics or alert categories and should not see any alerts.
            Assert.AreEqual(0, listUniqueAlertsOne.Count());
            //Add clinic
            listClinics.Add(ClinicT.CreateClinic());
            //Check that alert for all clinics is included for userAdmin(subscribed to all clinics)
            listUniqueAlertsAll = AlertItems.GetUniqueAlerts(userAdmin.UserNum, listClinics.LastOrDefault().ClinicNum);
            Assert.AreEqual(1, listUniqueAlertsAll.Count());
            //Check new clinic for user who is not subscribed to all alerts.
            listUniqueAlertsOne = AlertItems.GetUniqueAlerts(userNormal.UserNum, listClinics.LastOrDefault().ClinicNum);
            Assert.AreEqual(0, listUniqueAlertsOne.Count());
            //Add new alert for new clinic only.
            CreateAlertItem(false, listClinics.LastOrDefault().ClinicNum);
            //Check that userAdmin sees new alert item in new clinic. Should have 2, one all clinic econnector alert and the new clinic specific alert.
            listUniqueAlertsAll = AlertItems.GetUniqueAlerts(userAdmin.UserNum, listClinics.LastOrDefault().ClinicNum);
            Assert.AreEqual(2, listUniqueAlertsAll.Count());
            //Check that userNormal sees no alerts in new clinic, as they are not subscribed to any alert categories, nor clinics.
            listUniqueAlertsOne = AlertItems.GetUniqueAlerts(userNormal.UserNum, listClinics.LastOrDefault().ClinicNum);
            Assert.AreEqual(0, listUniqueAlertsOne.Count());
        }