///<summary>Function used by threads to connect to remote databases and sync security lock settings.</summary> private static void ConnectAndSyncLocks(ODThread odThread) { CentralConnection connection = (CentralConnection)odThread.Parameters[0]; 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.GetString(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; } } //Push the preferences to the server. Prefs.UpdateStringNoCache(PrefName.SecurityLockDate, _securityLockDate); Prefs.UpdateIntNoCache(PrefName.SecurityLockDays, _securityLockDays); Prefs.UpdateBoolNoCache(PrefName.SecurityLockIncludesAdmin, _securityLockAdmin); Prefs.UpdateBoolNoCache(PrefName.CentralManagerSecurityLock, _securityCentralLock); Signalods.SetInvalidNoCache(InvalidType.Prefs); SecurityLogs.MakeLogEntryNoCache(Permissions.SecurityAdmin, 0, "Enterprise Management Tool updated security settings"); odThread.Tag = new List <string>() { "", "", "" }; //No errors. }
///<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. }