/**
* Abiquo community edition
* cloud management application for hybrid clouds
* Copyright (C) 2008-2010 - Abiquo Holdings S.L.
*
* This application is free software; you can redistribute it and/or
* modify it under the terms of the GNU LESSER GENERAL PUBLIC
* LICENSE as published by the Free Software Foundation under
* version 3 of the License
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* LESSER GENERAL PUBLIC LICENSE v.3 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package com.abiquo.api.resources;
import static com.abiquo.api.common.Assert.assertErrors;
import static com.abiquo.api.common.UriTestResolver.resolveRoleURI;
import static com.abiquo.api.common.UriTestResolver.resolveUsersURI;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.codec.binary.Hex;
import org.apache.wink.client.ClientResponse;
import org.apache.wink.common.internal.utils.UriHelper;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.abiquo.api.exceptions.APIError;
import com.abiquo.model.enumerator.Privileges;
import com.abiquo.model.rest.RESTLink;
import com.abiquo.model.transport.LinksDto;
import com.abiquo.server.core.enterprise.Enterprise;
import com.abiquo.server.core.enterprise.Privilege;
import com.abiquo.server.core.enterprise.Role;
import com.abiquo.server.core.enterprise.User;
import com.abiquo.server.core.enterprise.UserDto;
import com.abiquo.server.core.enterprise.UsersDto;
public class UsersResourceIT extends AbstractJpaGeneratorIT
{
private static final String SYSADMIN = "sysadmin";
private static final String ENTADMIN = "entadmin";
private static final String USER = "user";
@BeforeMethod
public void setupSysadmin()
{
Enterprise ent = enterpriseGenerator.createUniqueInstance();
Role role = roleGenerator.createInstanceSysAdmin();
User user = userGenerator.createInstance(ent, role, SYSADMIN, SYSADMIN);
List<Object> entitiesToPersist = new ArrayList<Object>();
entitiesToPersist.add(ent);
for (Privilege p : role.getPrivileges())
{
entitiesToPersist.add(p);
}
entitiesToPersist.add(role);
entitiesToPersist.add(user);
setup(entitiesToPersist.toArray());
}
@Test
public void getUsersList() throws Exception
{
User user = userGenerator.createUniqueInstance();
List<Object> entitiesToSetup = new ArrayList<Object>();
for (Privilege p : user.getRole().getPrivileges())
{
entitiesToSetup.add(p);
}
entitiesToSetup.add(user.getRole());
entitiesToSetup.add(user.getEnterprise());
entitiesToSetup.add(user);
setup(entitiesToSetup.toArray());
ClientResponse response =
get(resolveUsersURI(user.getEnterprise().getId()), SYSADMIN, SYSADMIN, UsersDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
UsersDto entity = response.getEntity(UsersDto.class);
assertNotNull(entity);
assertNotNull(entity.getCollection());
assertEquals(entity.getCollection().size(), 1);
}
@Test
public void getUsersListFilteredByID() throws Exception
{
Enterprise e1 = enterpriseGenerator.createUniqueInstance();
Enterprise e2 = enterpriseGenerator.createUniqueInstance();
Role r = roleGenerator.createUniqueInstance();
User u1 = userGenerator.createInstance(e1, r, "p1", "u1", "s1", "e1", "neck");
User u2 = userGenerator.createInstance(e2, r, "p2", "u2", "s2", "e2", "nack");
List<Object> entitiesToPersist = new ArrayList<Object>();
entitiesToPersist.add(e1);
entitiesToPersist.add(e2);
for (Privilege p : r.getPrivileges())
{
entitiesToPersist.add(p);
}
entitiesToPersist.add(r);
entitiesToPersist.add(u1);
entitiesToPersist.add(u2);
setup(entitiesToPersist.toArray());
String uri = resolveUsersURI("_");
uri =
UriHelper.appendQueryParamsToPath(uri,
Collections.singletonMap("orderBy", new String[] {"nick"}), false);
uri =
UriHelper.appendQueryParamsToPath(uri,
Collections.singletonMap("filter", new String[] {u1.getNick()}), false);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, UsersDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
UsersDto entity = response.getEntity(UsersDto.class);
assertNotNull(entity);
assertNotNull(entity.getCollection());
assertEquals(entity.getCollection().size(), 1);
UserDto u = entity.getCollection().iterator().next();
org.testng.Assert.assertEquals(u.getNick(), "neck");
}
@Test
public void getUsersListDescOrder() throws Exception
{
User user = userGenerator.createUniqueInstance();
User user2 = userGenerator.createInstance(user.getEnterprise(), user.getRole());
List<Object> entitiesToSetup = new ArrayList<Object>();
for (Privilege p : user.getRole().getPrivileges())
{
entitiesToSetup.add(p);
}
entitiesToSetup.add(user.getRole());
entitiesToSetup.add(user.getEnterprise());
entitiesToSetup.add(user);
entitiesToSetup.add(user2);
setup(entitiesToSetup.toArray());
String uri = resolveUsersURI(user.getEnterprise().getId());
uri =
UriHelper.appendQueryParamsToPath(uri,
Collections.singletonMap("desc", new String[] {"true"}), false);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, UsersDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
UsersDto entity = response.getEntity(UsersDto.class);
assertNotNull(entity);
assertNotNull(entity.getCollection());
assertEquals(entity.getCollection().size(), 2);
}
@Test
public void checkGetUserPermissions() throws Exception
{
// Create an enterprise with a user and an enterprise admin
Enterprise ent = enterpriseGenerator.createUniqueInstance();
Role userRole = roleGenerator.createInstance();
Role entRole = roleGenerator.createInstanceEnterpriseAdmin();
User entUser = userGenerator.createInstance(ent, entRole, ENTADMIN, ENTADMIN);
User user = userGenerator.createInstance(ent, userRole, USER, USER);
List<Object> entitiesToPersist = new ArrayList<Object>();
entitiesToPersist.add(ent);
for (Privilege p : entRole.getPrivileges())
{
entitiesToPersist.add(p);
}
if (userRole.getPrivileges() != null)
{
for (Privilege p : userRole.getPrivileges())
{
entitiesToPersist.add(p);
}
}
entitiesToPersist.add(entRole);
entitiesToPersist.add(userRole);
entitiesToPersist.add(entUser);
entitiesToPersist.add(user);
setup(entitiesToPersist.toArray());
// Test the get response depending on the user who performs the request
String wildwardURI = resolveUsersURI("_");
assertUsersCount(get(wildwardURI, SYSADMIN, SYSADMIN, UsersDto.MEDIA_TYPE), 3);
assertUsersCount(get(wildwardURI, ENTADMIN, ENTADMIN, UsersDto.MEDIA_TYPE), 2);
assertUsersCount(get(wildwardURI, USER, USER, UsersDto.MEDIA_TYPE), 1);
String uri = resolveUsersURI(ent.getId());
assertUsersCount(get(uri, SYSADMIN, SYSADMIN, UsersDto.MEDIA_TYPE), 2);
assertUsersCount(get(uri, ENTADMIN, ENTADMIN, UsersDto.MEDIA_TYPE), 2);
assertUsersCount(get(uri, USER, USER, UsersDto.MEDIA_TYPE), 1);
}
@Test
public void checkGetUserPermissionsInvalidEnterprise() throws Exception
{
// Create an enterprise with a user and an enterprise admin
Enterprise ent = enterpriseGenerator.createUniqueInstance();
Enterprise ent2 = enterpriseGenerator.createUniqueInstance();
Role userRole = roleGenerator.createInstance();
Role entRole = roleGenerator.createInstanceEnterpriseAdmin();
User entUser = userGenerator.createInstance(ent, entRole, ENTADMIN, ENTADMIN);
User user = userGenerator.createInstance(ent, userRole, USER, USER);
List<Object> entitiesToPersist = new ArrayList<Object>();
entitiesToPersist.add(ent);
entitiesToPersist.add(ent2);
for (Privilege p : entRole.getPrivileges())
{
entitiesToPersist.add(p);
}
if (userRole.getPrivileges() != null)
{
for (Privilege p : userRole.getPrivileges())
{
entitiesToPersist.add(p);
}
}
entitiesToPersist.add(entRole);
entitiesToPersist.add(userRole);
entitiesToPersist.add(entUser);
entitiesToPersist.add(user);
setup(entitiesToPersist.toArray());
// Test the get response depending on the user who performs the request
String uri = resolveUsersURI(ent2.getId());
assertUsersCount(get(uri, SYSADMIN, SYSADMIN, UsersDto.MEDIA_TYPE), 0);
assertAccessDenied(get(uri, ENTADMIN, ENTADMIN, UsersDto.MEDIA_TYPE ));
assertAccessDenied(get(uri, USER, USER, UsersDto.MEDIA_TYPE));
}
@Test
public void createUsers()
{
User user = userGenerator.createUniqueInstance();
List<Object> entitiesToSetup = new ArrayList<Object>();
for (Privilege p : user.getRole().getPrivileges())
{
entitiesToSetup.add(p);
}
entitiesToSetup.add(user.getRole());
entitiesToSetup.add(user.getEnterprise());
entitiesToSetup.add(user);
setup(entitiesToSetup.toArray());
UserDto dto = getValidUser(user);
ClientResponse response =
post(resolveUsersURI(user.getEnterprise().getId()), dto, SYSADMIN, SYSADMIN);
dto.setPassword(encrypt(dto.getPassword()));
assertEquals(response.getStatusCode(), 201);
assertUserResponse(dto, response);
}
@Test
public void createUsersWithPasswordNullRises400()
{
User user = userGenerator.createUniqueInstance();
List<Object> entitiesToSetup = new ArrayList<Object>();
for (Privilege p : user.getRole().getPrivileges())
{
entitiesToSetup.add(p);
}
entitiesToSetup.add(user.getRole());
entitiesToSetup.add(user.getEnterprise());
entitiesToSetup.add(user);
setup(entitiesToSetup.toArray());
UserDto dto = getValidUser(user);
dto.setPassword(null);
ClientResponse response =
post(resolveUsersURI(user.getEnterprise().getId()), dto, SYSADMIN, SYSADMIN);
assertErrors(response, 400, APIError.USER_PASSWORD_IS_NECESSARY);
}
@Test
public void createUsersWithAvailableDatacenters()
{
User user = userGenerator.createUniqueInstance();
List<Object> entitiesToSetup = new ArrayList<Object>();
Privilege pToRemove = null;
for (Privilege p : user.getRole().getPrivileges())
{
if (!p.getName().equals(Privileges.USERS_PROHIBIT_VDC_RESTRICTION.name()))
{
entitiesToSetup.add(p);
}
else
{
pToRemove = p;
}
}
if (pToRemove != null)
{
user.getRole().getPrivileges().remove(pToRemove);
}
entitiesToSetup.add(user.getRole());
entitiesToSetup.add(user.getEnterprise());
entitiesToSetup.add(user);
setup(entitiesToSetup.toArray());
UserDto dto = getValidUser(user);
dto.setAvailableVirtualDatacenters("1,2");
ClientResponse response =
post(resolveUsersURI(user.getEnterprise().getId()), dto, SYSADMIN, SYSADMIN);
assertEquals(response.getStatusCode(), 201);
dto.setPassword(encrypt(dto.getPassword()));
assertUserResponse(dto, response);
UserDto entityPost = response.getEntity(UserDto.class);
assertEquals(entityPost.getAvailableVirtualDatacenters(),
dto.getAvailableVirtualDatacenters());
}
@Test
public void findUsersConnected()
{
User user = userGenerator.createUserWithSession();
User withoutSession = userGenerator.createInstance(user.getEnterprise(), user.getRole());
List<Object> entitiesToSetup = new ArrayList<Object>();
for (Privilege p : user.getRole().getPrivileges())
{
entitiesToSetup.add(p);
}
entitiesToSetup.add(user.getRole());
entitiesToSetup.add(user.getEnterprise());
entitiesToSetup.add(user);
entitiesToSetup.add(withoutSession);
setup(entitiesToSetup.toArray());
String uri = resolveUsersURI(user.getEnterprise().getId());
uri =
UriHelper.appendQueryParamsToPath(uri,
Collections.singletonMap("connected", new String[] {"true"}), false);
ClientResponse response = get(uri, SYSADMIN, SYSADMIN, UsersDto.MEDIA_TYPE);
assertEquals(response.getStatusCode(), 200);
UsersDto entity = response.getEntity(UsersDto.class);
assertEquals(entity.getCollection().size(), 1);
}
private UserDto getValidUser(final User user)
{
UserDto dto = new UserDto();
dto.setActive(1);
dto.setEmail("earl.hickey@abiquo.com");
dto.setLocale("EN");
dto.setName("Earl");
dto.setPassword("karma");
dto.setSurname("Hickey");
dto.setNick("ehickey");
dto.setDescription("user description");
dto.addLink(new RESTLink(RoleResource.ROLE, resolveRoleURI(user.getRole().getId())));
return dto;
}
private void assertUserResponse(final UserDto dto, final ClientResponse response)
{
UserDto entityPost = response.getEntity(UserDto.class);
assertNotNull(entityPost);
assertEquals(dto.isActive(), entityPost.isActive());
assertEquals(dto.getEmail(), entityPost.getEmail());
assertEquals(dto.getLocale(), entityPost.getLocale());
assertEquals(dto.getName(), entityPost.getName());
assertEquals(dto.getPassword(), entityPost.getPassword());
assertEquals(dto.getSurname(), entityPost.getSurname());
assertEquals(dto.getNick(), entityPost.getNick());
assertEquals(entityPost.getDescription(), dto.getDescription());
}
private void assertUsersCount(final ClientResponse response, final int userCount)
{
assertEquals(response.getStatusCode(), 200);
UsersDto entity = response.getEntity(UsersDto.class);
assertNotNull(entity);
assertNotNull(entity.getCollection());
assertEquals(entity.getCollection().size(), userCount);
}
private void assertAccessDenied(final ClientResponse response)
{
assertEquals(response.getStatusCode(), 403);
}
private String encrypt(final String toEncrypt)
{
MessageDigest messageDigest = null;
try
{
messageDigest = MessageDigest.getInstance("MD5");
}
catch (NoSuchAlgorithmException e)
{
}
messageDigest.reset();
messageDigest.update(toEncrypt.getBytes(Charset.forName("UTF8")));
final byte[] resultByte = messageDigest.digest();
return new String(Hex.encodeHex(resultByte));
}
@Override
protected ClientResponse get(final String uri, final String username, final String password)
{
return super.get(uri, username, password, LinksDto.MEDIA_TYPE,
LinksDto.MEDIA_TYPE);
}
}