/*
* Data Hub Service (DHuS) - For Space data distribution.
* Copyright (C) 2013,2014,2015 Serco (http://serco.com/) and Gael System (http://www.gael.fr) consortium
*
* This file is part of DHuS software sources.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.gael.dhus.server.http.webapp.stub.controller.admin;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import fr.gael.dhus.database.dao.UserDao;
import fr.gael.dhus.database.object.Role;
import fr.gael.dhus.database.object.User;
import fr.gael.dhus.database.object.restriction.AccessRestriction;
import fr.gael.dhus.database.object.restriction.LockedAccessRestriction;
import fr.gael.dhus.messaging.mail.MailServer;
import fr.gael.dhus.server.http.webapp.stub.controller.stub_share.RoleData;
import fr.gael.dhus.server.http.webapp.stub.controller.stub_share.UserData;
import fr.gael.dhus.server.http.webapp.stub.controller.stub_share.exceptions.UserServiceException;
import fr.gael.dhus.server.http.webapp.stub.controller.stub_share.exceptions.UserServiceMailingException;
import fr.gael.dhus.service.exception.EmailNotSentException;
import fr.gael.dhus.spring.context.ApplicationContextProvider;
import fr.gael.dhus.system.config.ConfigurationManager;
@RestController
public class AdminUserController {
private static Log logger = LogFactory.getLog (AdminUserController.class);
@Autowired
private UserDao userDao;
@Autowired
private ConfigurationManager cfgManager;
@Autowired
private MailServer mailer;
/**
* List of users
*
* @return ResponseEntity with list of users
*/
@RequestMapping (value = "/admin/users")
public ResponseEntity<?> usersList (@RequestParam(value="filter", defaultValue="") String filter, @RequestParam(value="offset", defaultValue="0")int start, @RequestParam(value="limit", defaultValue="")int count) throws UserServiceException {
fr.gael.dhus.service.UserService userService = ApplicationContextProvider
.getBean (fr.gael.dhus.service.UserService.class);
try
{
Iterator<User> it = userService.getUsersByFilter (filter, start);
List<UserData> userDatas = convertUserToUserData (it, count);
return new ResponseEntity<>(userDatas, HttpStatus.OK);
}
catch (AccessDeniedException e){
return new ResponseEntity<>("{\"code\":\"unauthorized\"}", HttpStatus.FORBIDDEN);
}
catch (Exception e)
{
e.printStackTrace ();
throw new UserServiceException(e.getMessage());
}
}
/**
* Count of users list items
*
* @return ResponseEntity with the count of users list items
*/
@RequestMapping (value = "/admin/users/count")
public ResponseEntity<?> usersListCount (@RequestParam(value="filter", defaultValue="") String filter) throws UserServiceException
{
fr.gael.dhus.service.UserService userService = ApplicationContextProvider
.getBean(fr.gael.dhus.service.UserService.class);
try
{
return new ResponseEntity<>("{\"count\":"+userService.countByFilter(filter)+"}", HttpStatus.OK);
}
catch (AccessDeniedException e) {
return new ResponseEntity<>("{\"code\":\"unauthorized\"}", HttpStatus.FORBIDDEN);
}
catch (Exception e)
{
e.printStackTrace ();
throw new UserServiceException(e.getMessage());
}
}
/**
* CREATE new user
*
* @param userData body of POST request with the fields to create a new user
* @return ResponseEntity with esit
*/
@RequestMapping (value = "/admin/users", method= RequestMethod.POST)
public ResponseEntity<?> createUser (@RequestBody UserData userData) throws UserServiceException,
UserServiceMailingException
{
int responseCode=0;
fr.gael.dhus.service.UserService userService = ApplicationContextProvider
.getBean(fr.gael.dhus.service.UserService.class);
System.out.println("userData: "+ userData);
User user = new User ();
user.setUsername (userData.getUsername ());
user.generatePassword ();
user.setFirstname (userData.getFirstname ());
user.setLastname (userData.getLastname ());
user.setAddress (userData.getAddress ());
user.setEmail (userData.getEmail ());
user.setPhone (userData.getPhone ());
List<Role> roles = new ArrayList<Role>();
System.out.println("Roles: " + roles);
for (RoleData role : userData.getRoles())
{
roles.add (Role.valueOf (role.name ()));
}
user.setRoles (roles);
user.setCountry (userService.getCountry (Long.parseLong (userData.getCountry ())).getName ());
user.setUsage (userData.getUsage ());
user.setSubUsage (userData.getSubUsage ());
user.setDomain (userData.getDomain ());
user.setSubDomain (userData.getSubDomain ());
if (userData.getLockedReason () != null)
{
LockedAccessRestriction lock = new LockedAccessRestriction ();
if ( !userData.getLockedReason ().trim ().isEmpty ())
{
lock.setBlockingReason (userData.getLockedReason ());
}
user.addRestriction (lock);
}
try
{
userService.createUser (user);
}
catch (EmailNotSentException e)
{
e.printStackTrace ();
return new ResponseEntity<>("{\"code\":\"email_not_sent\"}", HttpStatus.INTERNAL_SERVER_ERROR);
}
catch (AccessDeniedException e) {
return new ResponseEntity<>("{\"code\":\"unauthorized\"}", HttpStatus.FORBIDDEN);
}
catch (Exception e)
{
e.printStackTrace ();
throw new UserServiceException(e.getMessage());
}
return new ResponseEntity<>("{\"code\":\""+responseCode+"\"}", HttpStatus.OK);
}
/**
* READ user details
*
* @param id id of user
* @return ResponseEntity with User instance
*/
@RequestMapping (value = "/admin/users/{userid}", method= RequestMethod.GET)
public ResponseEntity<?> readUser (@PathVariable(value="userid") String uuid) throws UserServiceException{
fr.gael.dhus.service.UserService userService = ApplicationContextProvider
.getBean(fr.gael.dhus.service.UserService.class);
try
{
User user = userService.getUser (uuid);
LockedAccessRestriction lock = null;
for (AccessRestriction restriction : userService
.getRestrictions (user.getUUID()))
{
if (restriction instanceof LockedAccessRestriction)
{
lock = (LockedAccessRestriction) restriction;
}
}
List<RoleData> roles = new ArrayList<RoleData>();
for (Role role : user.getRoles())
{
roles.add (RoleData.valueOf (role.name ()));
}
UserData userData =
new UserData (user.getUUID (), user.getUsername (),
user.getFirstname (), user.getLastname (), user.getEmail (),
roles, user.getPhone (),
user.getAddress (), lock == null ? null : lock.getBlockingReason (),
user.getCountry (), user.getUsage (), user.getSubUsage (),
user.getDomain (), user.getSubDomain ());
return new ResponseEntity<>(userData, HttpStatus.OK);
}
catch (AccessDeniedException e) {
return new ResponseEntity<>("{\"code\":\"unauthorized\"}" , HttpStatus.FORBIDDEN);
}
catch (Exception e)
{
e.printStackTrace ();
throw new UserServiceException(e.getMessage());
}
}
/**
* UPDATE user
*
* @param userid id of user
* @param userData body of PUT request with the fields to update of user
* @return ResponseEntity with esit
*/
@RequestMapping (value = "/admin/users/{uuid}", method= RequestMethod.PUT)
public ResponseEntity<?> updateUser (@RequestBody UserData userData, @PathVariable(value="uuid") String uuid)throws UserServiceException,
UserServiceMailingException{
fr.gael.dhus.service.UserService userService = ApplicationContextProvider
.getBean (fr.gael.dhus.service.UserService.class);
User user = new User ();
user.setUUID (uuid);
user.setUsername(userData.getUsername());
user.setFirstname (userData.getFirstname ());
user.setLastname (userData.getLastname ());
user.setAddress (userData.getAddress ());
user.setEmail (userData.getEmail ());
user.setPhone (userData.getPhone ());
List<Role> roles = new ArrayList<Role>();
for (RoleData role : userData.getRoles())
{
roles.add (Role.valueOf (role.name ()));
}
user.setRoles (roles);
user.setCountry (userService.getCountry (Long.parseLong (userData.getCountry ())).getName ());
user.setUsage (userData.getUsage ());
user.setSubUsage (userData.getSubUsage ());
user.setDomain (userData.getDomain ());
user.setSubDomain (userData.getSubDomain ());
if (userData.getLockedReason () != null)
{
LockedAccessRestriction lock = new LockedAccessRestriction ();
if ( !userData.getLockedReason ().trim ().isEmpty ())
{
lock.setBlockingReason (userData.getLockedReason ());
}
user.addRestriction (lock);
}
try
{
userService.updateUser (user);
}
catch (EmailNotSentException e)
{
e.printStackTrace ();
return new ResponseEntity<>("{\"code\":\"email_not_sent\"}" , HttpStatus.INTERNAL_SERVER_ERROR);
}
catch (AccessDeniedException e) {
return new ResponseEntity<>("{\"code\":\"unauthorized\"}", HttpStatus.FORBIDDEN);
}
catch (Exception e)
{
e.printStackTrace();
throw new UserServiceException(e.getMessage());
}
return new ResponseEntity<>("{\"code\":\"OK\"}", HttpStatus.OK);
}
/**
* DELETE user
*
* @param userid id of user
* @return ResponseEntity with esit
*/
@RequestMapping (value = "/admin/users/{uuid}", method= RequestMethod.DELETE)
public ResponseEntity<?> deleteUser (@PathVariable(value="uuid") String uuid) throws UserServiceMailingException, UserServiceException {
fr.gael.dhus.service.UserService userService = ApplicationContextProvider
.getBean (fr.gael.dhus.service.UserService.class);
try
{
userService.deleteUser (uuid);
}
catch (EmailNotSentException e)
{
e.printStackTrace ();
return new ResponseEntity<>("{\"code\":\"email_not_sent\"}" , HttpStatus.INTERNAL_SERVER_ERROR);
}
catch (AccessDeniedException e) {
return new ResponseEntity<>("{\"code\":\"unauthorized\"}", HttpStatus.FORBIDDEN);
}
catch (Exception e)
{
e.printStackTrace ();
throw new UserServiceException(e.getMessage());
}
return new ResponseEntity<>("{\"code\":\"OK\"}", HttpStatus.OK);
}
private List<UserData> convertUserToUserData (Iterator<User> it, int max)
{
int n = 0;
List<UserData> user_data_list = new ArrayList<> ();
while (n < max && it.hasNext ())
{
User user = it.next ();
Set<AccessRestriction> restrictions = user.getRestrictions ();
String reason = null;
if (!restrictions.isEmpty ())
{
reason = restrictions.toArray (
new AccessRestriction[restrictions.size ()])[0]
.getBlockingReason ();
}
List<RoleData> roles = new ArrayList<> ();
for (Role role : user.getRoles ())
{
roles.add (RoleData.valueOf (role.name ()));
}
UserData user_data = new UserData (user.getUUID(),
user.getUsername (), user.getFirstname (),
user.getLastname (), user.getEmail (), roles,
user.getPhone (), user.getAddress (), reason,
user.getCountry (), user.getUsage (), user.getSubUsage (),
user.getDomain (), user.getSubDomain ());
user_data_list.add (user_data);
n++;
}
return user_data_list;
}
}