/* * 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; } }