Yair Zaslavsky has uploaded a new change for review. Change subject: aaa: Introducing some changes to directory utils ......................................................................
aaa: Introducing some changes to directory utils Topic: AAA Change-Id: I7bb54ae17616a239879a168b7415fb96250ba50d Signed-off-by: Yair Zaslavsky <yzasl...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/aaa/DirectoryUtils.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddGroupCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddUserCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/DbUserCacheManager.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/LoginBaseCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DbUser.java 6 files changed, 70 insertions(+), 50 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/14/29914/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/aaa/DirectoryUtils.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/aaa/DirectoryUtils.java index a98c863..334e018 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/aaa/DirectoryUtils.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/aaa/DirectoryUtils.java @@ -5,11 +5,13 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Set; import org.ovirt.engine.api.extensions.ExtMap; import org.ovirt.engine.api.extensions.aaa.Authz; +import org.ovirt.engine.api.extensions.aaa.Authz.GroupRecord; +import org.ovirt.engine.api.extensions.aaa.Authz.PrincipalRecord; import org.ovirt.engine.core.common.businessentities.DbGroup; +import org.ovirt.engine.core.common.businessentities.DbUser; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.DbGroupDAO; @@ -17,15 +19,13 @@ public class DirectoryUtils { - public static HashSet<Guid> getGroupIdsFromUser(DirectoryUser directoryUser) { + public static HashSet<Guid> getGroupIdsFromPrincipal(String authz, ExtMap principal) { HashSet<Guid> results = new HashSet<Guid>(); DbGroupDAO dao = DbFacade.getInstance().getDbGroupDao(); - if (directoryUser.getGroups() != null) { - for (DirectoryGroup group : directoryUser.getGroups()) { - DbGroup dbGroup = dao.getByExternalId(group.getDirectoryName(), group.getId()); - if (dbGroup != null) { - results.add(dbGroup.getId()); - } + for (ExtMap group : principal.get(PrincipalRecord.GROUPS, Collections.<ExtMap> emptyList())) { + DbGroup dbGroup = dao.getByExternalId(authz, group.<String> get(GroupRecord.ID)); + if (dbGroup != null) { + results.add(dbGroup.getId()); } } return results; @@ -67,7 +67,7 @@ final boolean groupsResolving, final boolean groupsResolvingRecursive ) { - return mapPrincipalRecords( + return mapPrincipalRecordsToDirectoryUsers( AuthzUtils.getName(extension), AuthzUtils.findPrincipalsByIds( extension, @@ -117,7 +117,7 @@ final List<String> ids, final boolean resolveGroups, final boolean resolveGroupsRecursive) { - return mapGroupRecords(AuthzUtils.getName(extension), + return mapGroupRecordsToDirectoryGroups(AuthzUtils.getName(extension), AuthzUtils.findGroupRecordsByIds( extension, namespace, @@ -127,7 +127,11 @@ ); } - public static DirectoryUser mapPrincipalRecord(final String authzName, final ExtMap principalRecord) { + public static DbUser mapPrincipalRecordToDbUser(final String authzName, final ExtMap principalRecord) { + return new DbUser(mapPrincipalRecordToDirectoryUser(authzName, principalRecord)); + } + + public static DirectoryUser mapPrincipalRecordToDirectoryUser(final String authzName, final ExtMap principalRecord) { DirectoryUser directoryUser = null; if (principalRecord != null) { directoryUser = new DirectoryUser( @@ -145,7 +149,7 @@ List<ExtMap> groups = principalRecord.<List<ExtMap>> get(Authz.PrincipalRecord.GROUPS); if (groups != null) { for (ExtMap group : groups) { - directoryGroups.add(mapGroupRecord(authzName, group)); + directoryGroups.add(mapGroupRecordToDirectoryGroup(authzName, group)); } } directoryUser.setGroups(directoryGroups); @@ -153,7 +157,7 @@ return directoryUser; } - public static DirectoryGroup mapGroupRecord(final String authzName, final ExtMap group) { + public static DirectoryGroup mapGroupRecordToDirectoryGroup(final String authzName, final ExtMap group) { DirectoryGroup directoryGroup = null; if (group != null) { directoryGroup = new DirectoryGroup( @@ -163,24 +167,35 @@ group.<String> get(Authz.GroupRecord.NAME) ); for (ExtMap memberOf : group.<List<ExtMap>> get(Authz.GroupRecord.GROUPS, Collections.<ExtMap> emptyList())) { - directoryGroup.getGroups().add(mapGroupRecord(authzName, memberOf)); + directoryGroup.getGroups().add(mapGroupRecordToDirectoryGroup(authzName, memberOf)); } } return directoryGroup; } - public static List<DirectoryGroup> mapGroupRecords(final String authzName, final List<ExtMap> groups) { + public static DbGroup mapGroupRecordToDbGroup(String directory, ExtMap groupRecord) { + return new DbGroup(mapGroupRecordToDirectoryGroup(directory, groupRecord)); + } + + + public static void flatGroups(ExtMap principal) { + List<ExtMap> accumulator = new ArrayList<>(); + flatGroups(accumulator, principal.get(GroupRecord.GROUPS, Collections.<ExtMap> emptyList())); + principal.put(GroupRecord.GROUPS, accumulator); + } + + public static List<DirectoryGroup> mapGroupRecordsToDirectoryGroups(final String authzName, final List<ExtMap> groups) { List<DirectoryGroup> results = new ArrayList<>(); for (ExtMap group : groups) { - results.add(mapGroupRecord(authzName, group)); + results.add(mapGroupRecordToDirectoryGroup(authzName, group)); } return results; } - public static List<DirectoryUser> mapPrincipalRecords(final String authzName, final List<ExtMap> users) { + public static List<DirectoryUser> mapPrincipalRecordsToDirectoryUsers(final String authzName, final List<ExtMap> users) { List<DirectoryUser> results = new ArrayList<>(); for (ExtMap user : users) { - results.add(mapPrincipalRecord(authzName, user)); + results.add(mapPrincipalRecordToDirectoryUser(authzName, user)); } return results; } @@ -192,7 +207,7 @@ boolean groupsResolving, boolean groupsResolvingRecursive ) { - return mapPrincipalRecords(AuthzUtils.getName(extension), AuthzUtils.queryPrincipalRecords(extension, + return mapPrincipalRecordsToDirectoryUsers(AuthzUtils.getName(extension), AuthzUtils.queryPrincipalRecords(extension, namespace, filter, groupsResolving, @@ -208,16 +223,17 @@ ) { List<DirectoryGroup> directoryGroups = new ArrayList<>(); for (ExtMap group : AuthzUtils.queryPrincipalRecords(extension, namespace, filter, groupsResolving, groupsResolvingRecursive)) { - directoryGroups.add(mapGroupRecord(AuthzUtils.getName(extension), group)); + directoryGroups.add(mapGroupRecordToDirectoryGroup(AuthzUtils.getName(extension), group)); } return directoryGroups; } - private static void flatGroups(Set<DirectoryGroup> accumulator, List<DirectoryGroup> groupsFrom) { - for (DirectoryGroup group : groupsFrom) { - flatGroups(accumulator, group.getGroups()); + private static void flatGroups(List<ExtMap> accumulator, List<ExtMap> groupsFrom) { + for (ExtMap group : groupsFrom) { + flatGroups(accumulator, group.get(GroupRecord.GROUPS, Collections.<ExtMap> emptyList())); accumulator.add(group); } } + } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddGroupCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddGroupCommand.java index 35efe86..2012841 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddGroupCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddGroupCommand.java @@ -4,8 +4,10 @@ import java.util.Collections; import java.util.List; +import org.ovirt.engine.api.extensions.ExtMap; import org.ovirt.engine.api.extensions.aaa.Authz; -import org.ovirt.engine.core.aaa.DirectoryGroup; +import org.ovirt.engine.api.extensions.aaa.Authz.GroupRecord; +import org.ovirt.engine.core.aaa.AuthzUtils; import org.ovirt.engine.core.aaa.DirectoryUtils; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.utils.PermissionSubject; @@ -24,7 +26,7 @@ // We save a reference to the directory group to avoid looking it up once when checking the conditions and another // time when actually adding the group to the database: - private DirectoryGroup directoryGroup; + private ExtMap groupRecord; public AddGroupCommand(T params) { this(params, null); @@ -53,8 +55,8 @@ boolean foundGroup = false; for (String namespace : getParameters().getNamespace() != null ? Arrays.asList(getParameters().getNamespace()) : authz.getContext().<List<String>> get(Authz.ContextKeys.AVAILABLE_NAMESPACES)) { - directoryGroup = DirectoryUtils.findDirectoryGroupById(authz, namespace, id, true, true); - if (directoryGroup != null) { + groupRecord = AuthzUtils.findGroupRecordsByIds(authz, namespace, Arrays.asList(id), true, true).get(0); + if (groupRecord != null) { foundGroup = true; break; } @@ -65,7 +67,7 @@ return false; } - addCustomValue("NewUserName", directoryGroup.getName()); + addCustomValue("NewUserName", groupRecord.<String> get(GroupRecord.NAME)); return true; } @@ -75,15 +77,15 @@ // First check if the group is already in the database, if it is we // need to update, if not we need to insert: DbGroupDAO dao = getAdGroupDAO(); - DbGroup dbGroup = dao.getByExternalId(directoryGroup.getDirectoryName(), directoryGroup.getId()); + DbGroup dbGroup = dao.getByExternalId(getParameters().getDirectory(), groupRecord.<String> get(GroupRecord.NAME)); if (dbGroup == null) { - dbGroup = new DbGroup(directoryGroup); + dbGroup = DirectoryUtils.mapGroupRecordToDbGroup(getParameters().getDirectory(), groupRecord); dbGroup.setId(Guid.newGuid()); dao.save(dbGroup); } else { Guid id = dbGroup.getId(); - dbGroup = new DbGroup(directoryGroup); + dbGroup = DirectoryUtils.mapGroupRecordToDbGroup(getParameters().getDirectory(), groupRecord); dbGroup.setId(id); dao.update(dbGroup); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddUserCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddUserCommand.java index 5e9fe93..182d5d2 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddUserCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddUserCommand.java @@ -5,8 +5,10 @@ import java.util.HashSet; import java.util.List; +import org.ovirt.engine.api.extensions.ExtMap; import org.ovirt.engine.api.extensions.aaa.Authz; -import org.ovirt.engine.core.aaa.DirectoryUser; +import org.ovirt.engine.api.extensions.aaa.Authz.PrincipalRecord; +import org.ovirt.engine.core.aaa.AuthzUtils; import org.ovirt.engine.core.aaa.DirectoryUtils; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.utils.PermissionSubject; @@ -23,7 +25,7 @@ public class AddUserCommand<T extends DirectoryIdParameters> extends CommandBase<T> { // We save a reference to the directory user to avoid looking it up once when checking the conditions and another // time when actually adding the user to the database: - private DirectoryUser directoryUser; + private ExtMap principal; public AddUserCommand(T params) { this(params, null); @@ -78,8 +80,8 @@ boolean foundUser = false; for (String namespace : getParameters().getNamespace() != null ? Arrays.asList(getParameters().getNamespace()) : authz.getContext().<List<String>> get(Authz.ContextKeys.AVAILABLE_NAMESPACES)) { - directoryUser = DirectoryUtils.findDirectoryUserById(authz, namespace, id, true, true); - if (directoryUser != null) { + principal = AuthzUtils.fetchPrincipalsByIdsRecursively(authz, namespace, Arrays.asList(id)).get(0); + if (principal != null) { foundUser = true; break; } @@ -95,7 +97,7 @@ // Populate information for the audit log: - addCustomValue("NewUserName", directoryUser.getName()); + addCustomValue("NewUserName", principal.<String> get(PrincipalRecord.NAME)); return true; @@ -106,17 +108,18 @@ DbUserDAO dao = getDbUserDAO(); // First check if the user is already in the database, if it is we need to update, if not we need to insert: - HashSet<Guid> groupIds = DirectoryUtils.getGroupIdsFromUser(directoryUser); - DbUser dbUser = dao.getByExternalId(directoryUser.getDirectoryName(), directoryUser.getId()); + DirectoryUtils.flatGroups(principal); + HashSet<Guid> groupIds = DirectoryUtils.getGroupIdsFromPrincipal(getParameters().getDirectory(), principal); + DbUser dbUser = dao.getByExternalId(getParameters().getDirectory(), principal.<String> get(PrincipalRecord.ID)); if (dbUser == null) { - dbUser = new DbUser(directoryUser); + dbUser = DirectoryUtils.mapPrincipalRecordToDbUser(getParameters().getDirectory(), principal); dbUser.setId(Guid.newGuid()); dbUser.setGroupIds(groupIds); dao.save(dbUser); } else { Guid id = dbUser.getId(); - dbUser = new DbUser(directoryUser); + dbUser = DirectoryUtils.mapPrincipalRecordToDbUser(getParameters().getDirectory(), principal); dbUser.setId(id); dbUser.setGroupIds(groupIds); dao.update(dbUser); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/DbUserCacheManager.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/DbUserCacheManager.java index b873251..b348104 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/DbUserCacheManager.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/DbUserCacheManager.java @@ -154,7 +154,8 @@ DirectoryUser directoryUser = index.get(dbUser.getExternalId()); if (directoryUser != null) { dbUser.setActive(false); - dbUser.setGroupIds(DirectoryUtils.getGroupIdsFromUser(directoryUser)); + // TODO: will be fixed in next patch in series + // dbUser.setGroupIds(DirectoryUtils.getGroupIdsFromUser(directoryUser)); dbUser = refreshUser(dbUser, directoryUser); if (dbUser != null) { refreshed.add(dbUser); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/LoginBaseCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/LoginBaseCommand.java index 94fdb64..3d145f2 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/LoginBaseCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/LoginBaseCommand.java @@ -17,13 +17,13 @@ import org.ovirt.engine.api.extensions.aaa.Authn; import org.ovirt.engine.api.extensions.aaa.Authn.AuthRecord; import org.ovirt.engine.api.extensions.aaa.Authz; +import org.ovirt.engine.api.extensions.aaa.Authz.PrincipalRecord; import org.ovirt.engine.api.extensions.aaa.Mapping; import org.ovirt.engine.core.aaa.AcctUtils; import org.ovirt.engine.core.aaa.AuthType; import org.ovirt.engine.core.aaa.AuthenticationProfile; import org.ovirt.engine.core.aaa.AuthenticationProfileRepository; import org.ovirt.engine.core.aaa.AuthzUtils; -import org.ovirt.engine.core.aaa.DirectoryUser; import org.ovirt.engine.core.aaa.DirectoryUtils; import org.ovirt.engine.core.bll.session.SessionDataContainer; import org.ovirt.engine.core.bll.utils.PermissionSubject; @@ -254,18 +254,18 @@ return false; } - DirectoryUser directoryUser = DirectoryUtils.mapPrincipalRecord(AuthzUtils.getName(profile.getAuthz()), principalRecord); // Check that the user exists in the database, if it doesn't exist then we need to add it now: DbUser dbUser = getDbUserDAO().getByExternalId( AuthzUtils.getName(profile.getAuthz()), - directoryUser.getId()); + principalRecord.<String> get(PrincipalRecord.ID)); if (dbUser == null) { - dbUser = new DbUser(directoryUser); + dbUser = DirectoryUtils.mapPrincipalRecordToDbUser(AuthzUtils.getName(profile.getAuthz()), principalRecord); dbUser.setId(Guid.newGuid()); } - dbUser.setGroupIds(DirectoryUtils.getGroupIdsFromUser(directoryUser)); + DirectoryUtils.flatGroups(principalRecord); + dbUser.setGroupIds(DirectoryUtils.getGroupIdsFromPrincipal(AuthzUtils.getName(profile.getAuthz()), principalRecord)); getDbUserDAO().saveOrUpdate(dbUser); // Check login permissions. We do it here and not via the diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DbUser.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DbUser.java index 170374b..5c701db 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DbUser.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DbUser.java @@ -251,7 +251,6 @@ public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((externalId == null) ? 0 : externalId.hashCode()); result = prime * result + ((department == null) ? 0 : department.hashCode()); result = prime * result + ((domain == null) ? 0 : domain.hashCode()); @@ -280,8 +279,7 @@ return false; } DbUser other = (DbUser) obj; - return (ObjectUtils.objectsEqual(id, other.id) - && ObjectUtils.objectsEqual(externalId, other.externalId) + return ObjectUtils.objectsEqual(externalId, other.externalId) && ObjectUtils.objectsEqual(department, other.department) && ObjectUtils.objectsEqual(domain, other.domain) && ObjectUtils.objectsEqual(namespace, other.namespace) @@ -293,7 +291,7 @@ && ObjectUtils.objectsEqual(role, other.role) && active == other.active && ObjectUtils.objectsEqual(lastName, other.lastName) - && ObjectUtils.objectsEqual(loginName, other.loginName)); + && ObjectUtils.objectsEqual(loginName, other.loginName); } -- To view, visit http://gerrit.ovirt.org/29914 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7bb54ae17616a239879a168b7415fb96250ba50d Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Yair Zaslavsky <yzasl...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches