Пример #1
0
        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);
        }
Пример #2
0
        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);
        }