private Boolean DoSync(IEnumerable <AttributeHolder> attributeHolders, IList <User> users, IList <PersonGroup> groups) { _hapagHelper.Init(); var usersThatNeedsSave = new HashSet <User.UserNameEqualityUser>(); foreach (var toIntegrate in attributeHolders) { var personId = (String)toIntegrate.GetAttribute(PersonIdColumn); var personGroupString = toIntegrate.GetAttribute(PersonGroupColumn); var user = users.FirstOrDefault(u => u.MaximoPersonId.Equals(personId, StringComparison.CurrentCultureIgnoreCase)); var personGroup = groups.FirstOrDefault(p => p.Name.Equals(personGroupString)); if (user == null) { if ("true".Equals(MetadataProvider.GlobalProperty("ldap.allownonmaximousers"))) { Log.Info("creating missing user with personId" + personId); //if this flag is true, let´s create a user on our side so that we can associate the right roles to it user = UserManager.CreateMissingDBUser(personId, false); users.Add(user); } else { Log.Warn(String.Format(UserNotFound, personId)); continue; } } if (personGroup == null) { Log.Warn(String.Format(PersonGroupNotFound, personGroupString)); continue; } if (user.PersonGroups == null) { user.PersonGroups = new HashedSet <PersonGroupAssociation>(); } var association = new PersonGroupAssociation { Delegate = false, PersonGroup = personGroup, User = user }; var addedGroup = user.PersonGroups.Add(association); var addedRole = _hapagHelper.AddHapagMatchingRolesAndProfiles(personGroup, user); if (addedGroup || addedRole) { usersThatNeedsSave.Add(new User.UserNameEqualityUser(user)); } } foreach (var user in usersThatNeedsSave) { var realUser = user.user; DAO.Save(realUser); SecurityFacade.ClearUserFromCache(realUser.UserName); } return(true); }
public void SyncUser(InMemoryUser user) { _hapagHelper.Init(); if (user.MaximoPersonId == null) { return; } //this will ensure correct XITC groups _personGroupSyncManager.Sync(); Log.DebugFormat("starting sync for user {0}", user.Login); var entityMetadata = MetadataProvider.Entity(EntityName); var searchDTO = GetPersonGroupSearchDTO(); searchDTO.AppendSearchEntry(PersonIdColumn, user.MaximoPersonId); var result = EntityRepository.Get(entityMetadata, searchDTO); var hasDeletedAssociation = false; var hasNewAssociation = false; var toDelete = new HashedSet <PersonGroupAssociation>(); var groupsToAdd = new List <string>(); foreach (var personGroup in user.PersonGroups) { if ( !result.Any( a => ((string)a.GetAttribute(PersonGroupColumn)).Equals(personGroup.PersonGroup.Name, StringComparison.CurrentCultureIgnoreCase))) { //this means that the persongroup was removed from the user on maximo, it would not be fetched by the rowstamp sync job hasDeletedAssociation = true; toDelete.Add(personGroup); } } foreach (var attributeHolder in result) { if (!user.PersonGroups.Any(p => p.PersonGroup.Name.Equals(attributeHolder.GetAttribute(PersonGroupColumn)))) { hasNewAssociation = true; groupsToAdd.Add((string)attributeHolder.GetAttribute(PersonGroupColumn)); } } if (hasDeletedAssociation) { foreach (var personGroupAssociation in toDelete) { DAO.Delete(personGroupAssociation); user.PersonGroups.Remove(personGroupAssociation); } } if (!hasNewAssociation && HasMissingRoles(user)) { //here we´re handling exceptional scenarios where theorically there are no new associations on maximo side, but anyway we have missing roles on swdb side. //this could happen due to the presence of legacy-created users groupsToAdd = new List <string>(user.PersonGroups.Select(p => p.GroupName)); hasNewAssociation = true; } if (hasNewAssociation) { Log.DebugFormat("new association found for user {0}", user.Login); //run jobs now to avoid out of synch users var groups = DAO.FindByQuery <PersonGroup>(PersonGroup.PersonGroupByNames, groupsToAdd); foreach (var personGroup in groups) { var personGroupAssociation = new PersonGroupAssociation { Delegate = false, User = user.DBUser, PersonGroup = personGroup }; user.PersonGroups.Add(personGroupAssociation); if (user.DBUser.PersonGroups == null) { user.DBUser.PersonGroups = new HashedSet <PersonGroupAssociation>(); } user.DBUser.PersonGroups.Add(personGroupAssociation); _hapagHelper.AddHapagMatchingRolesAndProfiles(personGroup, user.DBUser); } user.DBUser = DAO.Save(user.DBUser); user = new InMemoryUser(user.DBUser, user.DBUser.Profiles, user.TimezoneOffset); } user = _hapagHelper.HandleSsotuiModulesMerge(user); user = _hapagHelper.HandleTomItomModulesMerge(user); user = _hapagHelper.RemoveOrphanEntities(user); if (hasDeletedAssociation || hasNewAssociation) { _locationManager.FillUserLocations(user, true); } user = _hapagHelper.HandleExternalUser(user); SecurityFacade.ClearUserFromCache(user.Login, user); }