Juan Hernandez has uploaded a new change for review.

Change subject: core, restapi: Fix add permissions
......................................................................

core, restapi: Fix add permissions

The refactoring of the authentication mechanism introduced two different
identifiers for users and groups: one used internally by the engine and
one used by the external directory. The RESTAPI wasn't correctly
handling requests to add permissions when the provided identifier was
the internal one. The patch fixes the RESTAPI and the backend so that
they will accept both identifiers when adding users or groups.

Change-Id: I0d05c4bf4ebd242fd3a01a2f9a8d679f687c4982
Bug-Url: https://bugzilla.redhat.com/1064829
Signed-off-by: Juan Hernandez <[email protected]>
(cherry picked from commit 072cc1f4c3495b75f344688c9b28691875a12f88)
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddPermissionCommand.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbGroupDAO.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbGroupDAODbFacadeImpl.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAO.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAODbFacadeImpl.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedPermissionsResource.java
M 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GroupMapper.java
M 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermissionMapper.java
M 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/UserMapper.java
M 
backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/PermissionMapperTest.java
10 files changed, 335 insertions(+), 80 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/83/25083/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddPermissionCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddPermissionCommand.java
index 53c5b91..f330c8f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddPermissionCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddPermissionCommand.java
@@ -6,8 +6,10 @@
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.action.DirectoryIdParameters;
 import org.ovirt.engine.core.common.action.PermissionsOperationsParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.common.businessentities.DbGroup;
 import org.ovirt.engine.core.common.businessentities.DbUser;
 import org.ovirt.engine.core.common.businessentities.Permissions;
@@ -15,6 +17,7 @@
 import org.ovirt.engine.core.common.businessentities.RoleType;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.utils.ExternalId;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.utils.transaction.TransactionMethod;
 import org.ovirt.engine.core.utils.transaction.TransactionSupport;
@@ -84,54 +87,65 @@
         // Get the parameters:
         T parameters = getParameters();
 
-        // The user or group given in the parameters may haven't been added to
-        // the database yet, this will be the case if they don't have an
-        // internal identifier, if this is the case then they need to be
-        // added to the database now, before the permission:
+        // The user or group given in the parameters may haven't been added to 
the database yet, if this is the case
+        // then they need to be added to the database now, before the 
permission:
         DbUser user = parameters.getUser();
         if (user != null) {
-            user.setId(Guid.newGuid());
-            DbUser userFromDb = 
getDbUserDAO().getByExternalId(user.getDomain(), user.getExternalId());
-            if (userFromDb == null) {
-                getDbUserDAO().save(user);
-            } else {
-                user = userFromDb;
+            Guid id = user.getId();
+            String directory = user.getDomain();
+            ExternalId externalId = user.getExternalId();
+            DbUser existing = getDbUserDAO().getByIdOrExternalId(id, 
directory, externalId);
+            if (existing != null) {
+                user = existing;
+            }
+            else {
+                user = addUser(id, directory, externalId);
+                if (user == null) {
+                    setSucceeded(false);
+                    return;
+                }
             }
         }
         DbGroup group = parameters.getGroup();
         if (group != null) {
-            group.setId(Guid.newGuid());
-            DbGroup groupFromDb = 
getAdGroupDAO().getByExternalId(group.getDomain(), group.getExternalId());
-            if (groupFromDb == null) {
-                getAdGroupDAO().save(group);
-            } else {
-                group = groupFromDb;
+            Guid id = group.getId();
+            String directory = group.getDomain();
+            ExternalId externalId = group.getExternalId();
+            DbGroup existing = getAdGroupDAO().getByIdOrExternalId(id, 
directory, externalId);
+            if (existing != null) {
+                group = existing;
+            }
+            else {
+                group = addGroup(id, directory, externalId);
+                if (group == null) {
+                    setSucceeded(false);
+                    return;
+                }
             }
         }
 
-        // The identifier of the owner of the permission can come from the 
parameters directly or from the user/group
-        // objects:
-        Guid ownerId = parameters.getPermission().getad_element_id();
-        if (ownerId == null) {
-            if (user != null) {
-                ownerId = user.getId();
-            }
-            if (ownerId == null) {
-                if (group != null) {
-                    ownerId = group.getId();
-                }
-            }
+        // The identifier of the principal of the permission can come from the 
parameters directly or from the
+        // user/group objects:
+        Guid principalId;
+        if (user != null) {
+            principalId = user.getId();
+        }
+        else if (group != null) {
+            principalId = group.getId();
+        }
+        else {
+            principalId = parameters.getPermission().getad_element_id();
         }
 
         final Permissions paramPermission = parameters.getPermission();
 
         Permissions permission =
-                
getPermissionDAO().getForRoleAndAdElementAndObject(paramPermission.getrole_id(),
 ownerId,
+                
getPermissionDAO().getForRoleAndAdElementAndObject(paramPermission.getrole_id(),
 principalId,
                         paramPermission.getObjectId());
 
         if (permission == null) {
             paramPermission.setId(Guid.newGuid());
-            paramPermission.setad_element_id(ownerId);
+            paramPermission.setad_element_id(principalId);
 
             TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
                 @Override
@@ -185,4 +199,79 @@
         }
         return permissionsSubject;
     }
+
+    private DbUser addUser(Guid id, String directory, ExternalId externalId) {
+        // Try to add the user with the external id:
+        if (directory != null && externalId != null) {
+            DirectoryIdParameters parameters = new DirectoryIdParameters();
+            parameters.setDirectory(directory);
+            parameters.setId(externalId);
+            VdcReturnValueBase result = 
getBackend().runInternalAction(VdcActionType.AddUser, parameters);
+            if (result.getCanDoAction()) {
+                id = (Guid) result.getActionReturnValue();
+                if (id != null) {
+                    return getDbUserDAO().get(id);
+                }
+                return null;
+            }
+        }
+
+        // In older versions of the engine the internal id and external id 
were the same, thus we need to try again
+        // using the internal id as if it were an external id:
+        if (directory != null && id != null) {
+            externalId = ExternalId.fromHex(id.toString());
+            DirectoryIdParameters parameters = new DirectoryIdParameters();
+            parameters.setDirectory(directory);
+            parameters.setId(externalId);
+            VdcReturnValueBase result = 
getBackend().runInternalAction(VdcActionType.AddUser, parameters);
+            if (result.getCanDoAction()) {
+                id = (Guid) result.getActionReturnValue();
+                if (id != null) {
+                    return getDbUserDAO().get(id);
+                }
+                return null;
+            }
+        }
+
+        // There is no such user in the directory:
+        return null;
+    }
+
+    private DbGroup addGroup(Guid id, String directory, ExternalId externalId) 
{
+        // Try to add the user with the external id:
+        if (directory != null && externalId != null) {
+            DirectoryIdParameters parameters = new DirectoryIdParameters();
+            parameters.setDirectory(directory);
+            parameters.setId(externalId);
+            VdcReturnValueBase result = 
getBackend().runInternalAction(VdcActionType.AddGroup, parameters);
+            if (result.getCanDoAction()) {
+                id = (Guid) result.getActionReturnValue();
+                if (id != null) {
+                    return getAdGroupDAO().get(id);
+                }
+                return null;
+            }
+        }
+
+        // In older versions of the engine the internal id and external id 
were the same, thus we need to try again
+        // using the internal id as if it were an external id:
+        if (directory != null && id != null) {
+            externalId = ExternalId.fromHex(id.toString());
+            DirectoryIdParameters parameters = new DirectoryIdParameters();
+            parameters.setDirectory(directory);
+            parameters.setId(externalId);
+            VdcReturnValueBase result = 
getBackend().runInternalAction(VdcActionType.AddGroup, parameters);
+            if (result.getCanDoAction()) {
+                id = (Guid) result.getActionReturnValue();
+                if (id != null) {
+                    return getAdGroupDAO().get(id);
+                }
+                return null;
+            }
+        }
+
+        // There is no such group in the directory:
+        return null;
+    }
+
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbGroupDAO.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbGroupDAO.java
index 74d7ba0..745b55f 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbGroupDAO.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbGroupDAO.java
@@ -31,6 +31,17 @@
     DbGroup getByExternalId(String domain, ExternalId externalId);
 
     /**
+     * Retrieves a group that matches either the internal or external 
identifiers given.
+     *
+     * @param id the internal identifier
+     * @param domain the name of the domain
+     * @param externalId the external identifier
+     * @return a reference to the group or <code>null</code> if no such group
+     *   can be found in the database
+     */
+    DbGroup getByIdOrExternalId(Guid id, String domain, ExternalId externalId);
+
+    /**
      * Retrieves the group with the specified name.
      *
      * @param name
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbGroupDAODbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbGroupDAODbFacadeImpl.java
index 3f1d34d..0140bff 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbGroupDAODbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbGroupDAODbFacadeImpl.java
@@ -33,6 +33,38 @@
                        .addValue("external_id", externalId.getBytes()));
     }
 
+
+    @Override
+    public DbGroup getByIdOrExternalId(Guid id, String domain, ExternalId 
externalId) {
+        // Check if there is a user with the given internal identifier:
+        if (id != null) {
+            DbGroup existing = get(id);
+            if (existing != null) {
+                return existing;
+            }
+        }
+
+        // Check if there is an existing user for the given external 
identifier:
+        if (domain != null && externalId != null) {
+            DbGroup existing = getByExternalId(domain, externalId);
+            if (existing != null) {
+                return existing;
+            }
+        }
+
+        // In older versions of the engine the internal and external 
identifiers were the same, so we also need to check
+        // if the internal id is really an external id:
+        if (domain != null && id != null) {
+            externalId = ExternalId.fromHex(id.toString());
+            DbGroup existing = getByExternalId(domain, externalId);
+            if (existing != null) {
+                return existing;
+            }
+        }
+
+        // There is no such existing user:
+        return null;
+    }
     @Override
     public DbGroup getByName(String name) {
         return getCallsHandler().executeRead("GetGroupByName",
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAO.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAO.java
index a50c4cd..f674ac2 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAO.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAO.java
@@ -42,6 +42,17 @@
     DbUser getByExternalId(String domain, ExternalId externalId);
 
     /**
+     * Retrieves a user that matches either the internal or external 
identifiers given.
+     *
+     * @param id the internal identifier
+     * @param domain the name of the domain
+     * @param externalId the external identifier
+     * @return a reference to the user or <code>null</code> if no such user
+     *   can be found in the database
+     */
+    DbUser getByIdOrExternalId(Guid id, String domain, ExternalId externalId);
+
+    /**
      * Retrieves all users associated with the specified virtual machine.
      *
      * @param id
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAODbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAODbFacadeImpl.java
index 27e143c..9ea9614 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAODbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAODbFacadeImpl.java
@@ -90,6 +90,38 @@
     }
 
     @Override
+    public DbUser getByIdOrExternalId(Guid id, String domain, ExternalId 
externalId) {
+        // Check if there is a user with the given internal identifier:
+        if (id != null) {
+            DbUser existing = get(id);
+            if (existing != null) {
+                return existing;
+            }
+        }
+
+        // Check if there is an existing user for the given external 
identifier:
+        if (domain != null && externalId != null) {
+            DbUser existing = getByExternalId(domain, externalId);
+            if (existing != null) {
+                return existing;
+            }
+        }
+
+        // In older versions of the engine the internal and external 
identifiers were the same, so we also need to check
+        // if the internal id is really an external id:
+        if (domain != null && id != null) {
+            externalId = ExternalId.fromHex(id.toString());
+            DbUser existing = getByExternalId(domain, externalId);
+            if (existing != null) {
+                return existing;
+            }
+        }
+
+        // There is no such existing user:
+        return null;
+    }
+
+    @Override
     public List<DbUser> getAllForVm(Guid id) {
         MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource()
                 .addValue("vm_guid", id);
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedPermissionsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedPermissionsResource.java
index 583c920..78607e2 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedPermissionsResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedPermissionsResource.java
@@ -17,6 +17,8 @@
 import org.ovirt.engine.api.model.User;
 import org.ovirt.engine.api.resource.AssignedPermissionsResource;
 import org.ovirt.engine.api.resource.PermissionResource;
+import org.ovirt.engine.api.restapi.types.GroupMapper;
+import org.ovirt.engine.api.restapi.types.UserMapper;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.PermissionsOperationsParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
@@ -100,11 +102,9 @@
                            isPrincipalSubCollection()
                            ? new String[] {"role.id", 
"dataCenter|cluster|host|storageDomain|vm|vmpool|template.id"}
                            : new String[] {"role.id", "user|group.id"});
-        Permissions entity = map(permission, 
getPermissionsTemplate(permission));
-        return performCreate(VdcActionType.AddPermission,
-                               getPrincipal(entity, permission),
-                               new 
QueryIdResolver<Guid>(VdcQueryType.GetPermissionById,
-                                                   IdQueryParameters.class));
+        PermissionsOperationsParameters parameters = getParameters(permission);
+        QueryIdResolver<Guid> resolver = new 
QueryIdResolver<>(VdcQueryType.GetPermissionById, IdQueryParameters.class);
+        return performCreate(VdcActionType.AddPermission, parameters, 
resolver);
     }
 
     @Override
@@ -189,27 +189,67 @@
     }
 
     /**
-     * @pre completeness of "user|group.id" already validated if not
-     * user sub-collection
+     * Find the user or group that the permissions applies to.
+     *
+     * @param permission the incoming permission model
+     * @return the user or group that the permission applies to
      */
-    protected PermissionsOperationsParameters getPrincipal(Permissions entity, 
Permission permission) {
-        PermissionsOperationsParameters ret = null;
-        if (isUserSubCollection() || permission.isSetUser()) {
-            DbUser user = new DbUser();
-            user.setId(isUserSubCollection()
-                           ? targetId
-                           : asGuid(permission.getUser().getId()));
-            user.setDomain(getCurrent().get(Principal.class).getDomain());
-            ret = new PermissionsOperationsParameters(entity, user);
-        } else if (isGroupSubCollection() || permission.isSetGroup()) {
-            DbGroup group = new DbGroup();
-            group.setId(isGroupSubCollection()
-                        ? targetId
-                        : asGuid(permission.getGroup().getId()));
-            group.setDomain(getCurrent().get(Principal.class).getDomain());
-            ret = new PermissionsOperationsParameters(entity, group);
+    private Object getPrincipal(Permission permission) {
+        if (isUserSubCollection()) {
+            DbUser dbUser = new DbUser();
+            dbUser.setId(targetId);
+            return dbUser;
         }
-        return ret;
+        if (isGroupSubCollection()) {
+            DbGroup dbGroup = new DbGroup();
+            dbGroup.setId(targetId);
+            return dbGroup;
+        }
+        if (permission.isSetUser()) {
+            User user = permission.getUser();
+            DbUser dbUser = UserMapper.map(user, null);
+            if (dbUser.getDomain() == null) {
+                
dbUser.setDomain(getCurrent().get(Principal.class).getDomain());
+            }
+            return dbUser;
+        }
+        if (permission.isSetGroup()) {
+            Group group = permission.getGroup();
+            DbGroup dbGroup = GroupMapper.map(group, null);
+            if (dbGroup.getDomain() == null) {
+                
dbGroup.setDomain(getCurrent().get(Principal.class).getDomain());
+            }
+            return dbGroup;
+        }
+        return null;
+    }
+
+    /**
+     * Create the parameters for the permissions operation.
+     *
+     * @param model the incoming permission
+     * @return the parameters for the operation
+     */
+    private PermissionsOperationsParameters getParameters(Permission model) {
+        Permissions entity = map(model, null);
+        if (!isPrincipalSubCollection()) {
+            entity.setObjectId(targetId);
+            entity.setObjectType(objectType);
+        }
+        PermissionsOperationsParameters parameters = new 
PermissionsOperationsParameters();
+        parameters.setPermission(entity);
+        Object principal = getPrincipal(model);
+        if (principal instanceof DbUser) {
+            DbUser user = (DbUser) principal;
+            entity.setad_element_id(user.getId());
+            parameters.setUser(user);
+        }
+        if (principal instanceof DbGroup) {
+            DbGroup group = (DbGroup) principal;
+            entity.setad_element_id(group.getId());
+            parameters.setGroup(group);
+        }
+        return parameters;
     }
 
     @Override
@@ -221,25 +261,6 @@
             permission.setGroup(new Group());
             permission.getGroup().setId(permission.getUser().getId());
             permission.setUser(null);
-        }
-        return permission;
-    }
-
-    protected Permissions getPermissionsTemplate(Permission perm) {
-        Permissions permission = new Permissions();
-        // allow the target Id to be implicit in the client-provided
-        // representation
-        if (isPrincipalSubCollection()) {
-            permission.setad_element_id(targetId);
-            permission.setObjectId(getMapper(Permission.class, 
Guid.class).map(perm, null));
-        } else {
-            if (perm.getUser()!=null) {
-                permission.setad_element_id(asGuid(perm.getUser().getId()));
-            } else { //if user is null, group is not null; this was validated 
before
-                permission.setad_element_id(asGuid(perm.getGroup().getId()));
-            }
-            permission.setObjectId(targetId);
-            permission.setObjectType(objectType);
         }
         return permission;
     }
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GroupMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GroupMapper.java
index 5e38e53..896d64e 100644
--- 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GroupMapper.java
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GroupMapper.java
@@ -4,7 +4,10 @@
 import org.ovirt.engine.api.model.Domain;
 import org.ovirt.engine.api.model.Group;
 import org.ovirt.engine.core.authentication.DirectoryGroup;
+import org.ovirt.engine.api.restapi.utils.GuidUtils;
+import org.ovirt.engine.api.restapi.utils.MalformedIdException;
 import org.ovirt.engine.core.common.businessentities.DbGroup;
+import org.ovirt.engine.core.common.utils.ExternalId;
 import org.ovirt.engine.core.compat.Guid;
 
 public class GroupMapper {
@@ -36,4 +39,34 @@
         return model;
     }
 
+    @Mapping(from = Group.class, to = DbGroup.class)
+    public static DbGroup map(Group model, DbGroup template) {
+        DbGroup entity = template != null? template: new DbGroup();
+        if (model.isSetName()) {
+            entity.setName(model.getName());
+        }
+        if (model.isSetId()) {
+            String id = model.getId();
+            try {
+                entity.setId(GuidUtils.asGuid(id));
+            }
+            catch (MalformedIdException exception) {
+                // The identifier won't be a UUID if the group comes from 
/domains/{domain:id}/groups.
+            }
+            if (!model.isSetExternalId()) {
+                entity.setExternalId(ExternalId.fromHex(id));
+            }
+        }
+        if (model.isSetExternalId()) {
+            entity.setExternalId(ExternalId.fromHex(model.getExternalId()));
+        }
+        if (model.isSetDomain()) {
+            Domain domain = model.getDomain();
+            if (domain.isSetName()) {
+                entity.setDomain(domain.getName());
+            }
+        }
+        return entity;
+    }
+
 }
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermissionMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermissionMapper.java
index 7f77304..6ed5373 100644
--- 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermissionMapper.java
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermissionMapper.java
@@ -27,11 +27,6 @@
         if (model.isSetRole() && model.getRole().isSetId()) {
             entity.setrole_id(GuidUtils.asGuid(model.getRole().getId()));
         }
-        if (model.isSetUser() && model.getUser().isSetId()) {
-            entity.setad_element_id(GuidUtils.asGuid(model.getUser().getId()));
-        } else if (model.isSetGroup() && model.getGroup().isSetId()) {
-            
entity.setad_element_id(GuidUtils.asGuid(model.getGroup().getId()));
-        }
         entity.setObjectId(map(model, template != null ? 
template.getObjectId() : null));
         entity.setObjectType(map(model, template != null ? 
template.getObjectType() : null));
         return entity;
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/UserMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/UserMapper.java
index 608dffa..46ec7a1 100644
--- 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/UserMapper.java
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/UserMapper.java
@@ -7,7 +7,10 @@
 import org.ovirt.engine.api.model.User;
 import org.ovirt.engine.core.authentication.DirectoryGroup;
 import org.ovirt.engine.core.authentication.DirectoryUser;
+import org.ovirt.engine.api.restapi.utils.GuidUtils;
+import org.ovirt.engine.api.restapi.utils.MalformedIdException;
 import org.ovirt.engine.core.common.businessentities.DbUser;
+import org.ovirt.engine.core.common.utils.ExternalId;
 import org.ovirt.engine.core.compat.Guid;
 
 public class UserMapper {
@@ -63,4 +66,34 @@
         return model;
     }
 
+    @Mapping(from = User.class, to = DbUser.class)
+    public static DbUser map(User model, DbUser template) {
+        DbUser entity = template != null? template: new DbUser();
+        if (model.isSetName()) {
+            entity.setLoginName(model.getName());
+        }
+        if (model.isSetId()) {
+            String id = model.getId();
+            try {
+                entity.setId(GuidUtils.asGuid(id));
+            }
+            catch (MalformedIdException exception) {
+                // The identifier won't be a UUID if the user comes from 
/domains/{domain:id}/users.
+            }
+            if (!model.isSetExternalId()) {
+                entity.setExternalId(ExternalId.fromHex(id));
+            }
+        }
+        if (model.isSetExternalId()) {
+            entity.setExternalId(ExternalId.fromHex(model.getExternalId()));
+        }
+        if (model.isSetDomain()) {
+            Domain domain = model.getDomain();
+            if (domain.isSetName()) {
+                entity.setDomain(domain.getName());
+            }
+        }
+        return entity;
+    }
+
 }
diff --git 
a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/PermissionMapperTest.java
 
b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/PermissionMapperTest.java
index 61be5b9..8382653 100644
--- 
a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/PermissionMapperTest.java
+++ 
b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/PermissionMapperTest.java
@@ -16,8 +16,6 @@
         assertEquals(model.getId(), transform.getId());
         assertTrue(transform.isSetRole());
         assertEquals(model.getRole().getId(), transform.getRole().getId());
-        assertTrue(transform.isSetUser());
-        assertEquals(model.getUser().getId(), transform.getUser().getId());
         assertTrue(transform.isSetDataCenter());
         assertEquals(model.getDataCenter().getId(), 
transform.getDataCenter().getId());
     }


-- 
To view, visit http://gerrit.ovirt.org/25083
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0d05c4bf4ebd242fd3a01a2f9a8d679f687c4982
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.4
Gerrit-Owner: Juan Hernandez <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to