2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.servlets;
23 import com.jcabi.aspects.Loggable;
24 import fj.data.Either;
25 import io.swagger.annotations.*;
26 import org.openecomp.sdc.be.config.BeEcompErrorManager;
27 import org.openecomp.sdc.be.dao.api.ActionStatus;
28 import org.openecomp.sdc.be.model.User;
29 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
30 import org.openecomp.sdc.be.user.UserBusinessLogic;
31 import org.openecomp.sdc.common.api.Constants;
32 import org.openecomp.sdc.common.log.wrappers.Logger;
33 import org.openecomp.sdc.exception.ResponseFormat;
35 import javax.inject.Singleton;
36 import javax.servlet.ServletContext;
37 import javax.servlet.http.HttpServletRequest;
39 import javax.ws.rs.core.Context;
40 import javax.ws.rs.core.MediaType;
41 import javax.ws.rs.core.Response;
42 import java.io.UnsupportedEncodingException;
43 import java.net.URLDecoder;
44 import java.util.ArrayList;
45 import java.util.List;
46 @Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
48 @Api(value = "User Administration", description = "User admininstarator operations")
50 public class UserAdminServlet extends BeGenericServlet {
52 private static final String UTF_8 = "UTF-8";
53 private static final String START_HANDLE_REQUEST_OF = "Start handle request of {}";
54 private static final String ROLE_DELIMITER = ",";
55 private static final Logger log = Logger.getLogger(UserAdminServlet.class);
57 /***************************************
59 *************************************************************/
61 /* User by userId CRUD start */
63 /////////////////////////////////////////////////////////////////////////////////////////////////////
64 // retrieve all user details
67 @Consumes(MediaType.APPLICATION_JSON)
68 @Produces(MediaType.APPLICATION_JSON)
69 @ApiOperation(value = "retrieve user details", httpMethod = "GET", notes = "Returns user details according to userId", response = User.class)
70 @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns user Ok"), @ApiResponse(code = 404, message = "User not found"), @ApiResponse(code = 405, message = "Method Not Allowed"),
71 @ApiResponse(code = 500, message = "Internal Server Error") })
72 public Response get(@ApiParam(value = "userId of user to get", required = true) @PathParam("userId") final String userId, @Context final HttpServletRequest request) {
74 String url = request.getMethod() + " " + request.getRequestURI();
75 log.debug("(get) Start handle request of {}", url);
77 UserBusinessLogic userAdminManager = getUserAdminManager(request.getSession().getServletContext());
80 Either<User, ActionStatus> either = userAdminManager.getUser(userId, false);
82 if (either.isRight()) {
83 return buildErrorResponse(getComponentsUtils().getResponseFormatByUserId(either.right().value(), userId));
85 if (either.left().value() != null) {
86 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
88 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
91 } catch (Exception e) {
92 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get User");
93 log.debug("get user failed with unexpected error: {}", e.getMessage(), e);
94 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
99 @Path("/{userId}/role")
100 @Consumes(MediaType.APPLICATION_JSON)
101 @Produces(MediaType.APPLICATION_JSON)
102 @ApiOperation(value = "retrieve user role", notes = "Returns user role according to userId", response = String.class)
103 @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns user role Ok"), @ApiResponse(code = 404, message = "User not found"), @ApiResponse(code = 405, message = "Method Not Allowed"),
104 @ApiResponse(code = 500, message = "Internal Server Error") })
105 public Response getRole(@ApiParam(value = "userId of user to get", required = true) @PathParam("userId") final String userId, @Context final HttpServletRequest request) {
107 String url = request.getMethod() + " " + request.getRequestURI();
108 log.debug("(getRole) Start handle request of {}", url);
110 UserBusinessLogic userAdminManager = getUserAdminManager(request.getSession().getServletContext());
113 Either<User, ActionStatus> either = userAdminManager.getUser(userId, false);
114 if (either.isRight()) {
115 return buildErrorResponse(getComponentsUtils().getResponseFormatByUserId(either.right().value(), userId));
117 if (either.left().value() != null) {
118 String roleJson = "{ \"role\" : \"" + either.left().value().getRole() + "\" }";
119 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), roleJson);
121 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
124 } catch (Exception e) {
125 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get User Role");
126 log.debug("Get user role failed with unexpected error: {}", e);
127 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
131 /////////////////////////////////////////////////////////////////////////////////////////////////////
134 @Path("/{userId}/role")
135 @Consumes(MediaType.APPLICATION_JSON)
136 @Produces(MediaType.APPLICATION_JSON)
137 @ApiOperation(value = "update user role", notes = "Update user role", response = User.class)
138 @ApiResponses(value = { @ApiResponse(code = 200, message = "Update user OK"), @ApiResponse(code = 400, message = "Invalid Content."), @ApiResponse(code = 403, message = "Missing information/Restricted operation"),
139 @ApiResponse(code = 404, message = "User not found"), @ApiResponse(code = 405, message = "Method Not Allowed"), @ApiResponse(code = 409, message = "User already exists"), @ApiResponse(code = 500, message = "Internal Server Error") })
140 public Response updateUserRole(@ApiParam(value = "userId of user to get", required = true) @PathParam("userId") final String userIdUpdateUser, @Context final HttpServletRequest request,
141 @ApiParam(value = "json describe the update role", required = true) String data, @HeaderParam(value = Constants.USER_ID_HEADER) String modifierUserId) {
143 ServletContext context = request.getSession().getServletContext();
145 String url = request.getMethod() + " " + request.getRequestURI();
146 log.debug(START_HANDLE_REQUEST_OF, url);
149 User modifier = new User();
150 modifier.setUserId(modifierUserId);
151 log.debug("modifier id is {}", modifierUserId);
153 Response response = null;
156 UserBusinessLogic businessLogic = getUserAdminManager(context);
157 User updateInfoUser = getComponentsUtils().convertJsonToObject(data, modifier, User.class, AuditingActionEnum.UPDATE_USER).left().value();
158 Either<User, ResponseFormat> updateUserResponse = businessLogic.updateUserRole(modifier, userIdUpdateUser, updateInfoUser.getRole());
160 if (updateUserResponse.isRight()) {
161 log.debug("failed to update user role");
162 response = buildErrorResponse(updateUserResponse.right().value());
165 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), updateUserResponse.left().value());
168 } catch (Exception e) {
169 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Update User Metadata");
170 log.debug("Update User Role failed with exception", e);
171 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
177 /* User role CRUD end */
179 /* New user CRUD start */
181 @Consumes(MediaType.APPLICATION_JSON)
182 @Produces(MediaType.APPLICATION_JSON)
183 @ApiOperation(value = "add user", httpMethod = "POST", notes = "Provision new user", response = User.class)
184 @ApiResponses(value = { @ApiResponse(code = 201, message = "New user created"), @ApiResponse(code = 400, message = "Invalid Content."), @ApiResponse(code = 403, message = "Missing information"),
185 @ApiResponse(code = 405, message = "Method Not Allowed"), @ApiResponse(code = 409, message = "User already exists"), @ApiResponse(code = 500, message = "Internal Server Error") })
186 public Response createUser(@Context final HttpServletRequest request, @ApiParam(value = "json describe the user", required = true) String newUserData, @HeaderParam(value = Constants.USER_ID_HEADER) String modifierAttId) {
188 ServletContext context = request.getSession().getServletContext();
190 String url = request.getMethod() + " " + request.getRequestURI();
191 log.debug(START_HANDLE_REQUEST_OF, url);
194 User modifier = new User();
195 modifier.setUserId(modifierAttId);
196 log.debug("modifier id is {}", modifierAttId);
198 Response response = null;
201 UserBusinessLogic businessLogic = getUserAdminManager(context);
202 User newUserInfo = getComponentsUtils().convertJsonToObject(newUserData, modifier, User.class, AuditingActionEnum.ADD_USER).left().value();
203 Either<User, ResponseFormat> createUserResponse = businessLogic.createUser(modifier, newUserInfo);
205 if (createUserResponse.isRight()) {
206 log.debug("failed to create user");
207 response = buildErrorResponse(createUserResponse.right().value());
210 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.CREATED), createUserResponse.left().value());
213 } catch (Exception e) {
214 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Update User Metadata");
215 log.debug("Create User failed with exception", e);
216 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
222 /* New user CRUD end */
224 /* User authorization start */
226 /////////////////////////////////////////////////////////////////////////////////////////////////////
227 // User Authorization
230 @Consumes(MediaType.APPLICATION_JSON)
231 @Produces(MediaType.APPLICATION_JSON)
233 @ApiOperation(value = "authorize", notes = "authorize user", response = User.class)
234 @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns user Ok"), @ApiResponse(code = 403, message = "Restricted Access"), @ApiResponse(code = 500, message = "Internal Server Error") })
235 public Response authorize(@Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId, @HeaderParam("HTTP_CSP_FIRSTNAME") String firstName, @HeaderParam("HTTP_CSP_LASTNAME") String lastName,
236 @HeaderParam("HTTP_CSP_EMAIL") String email) {
239 userId = userId != null ? URLDecoder.decode(userId, UTF_8) : null;
240 firstName = firstName != null ? URLDecoder.decode(firstName, UTF_8) : null;
241 lastName = lastName != null ? URLDecoder.decode(lastName, UTF_8) : null;
242 email = email != null ? URLDecoder.decode(email, UTF_8) : null;
243 } catch (UnsupportedEncodingException e) {
244 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Authorize User - decode headers");
245 ResponseFormat errorResponseWrapper = getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR);
246 log.error("#authorize - authorization decoding failed with error: ", e);
247 return buildErrorResponse(errorResponseWrapper);
250 ServletContext context = request.getSession().getServletContext();
251 String url = request.getMethod() + " " + request.getRequestURI();
252 log.debug(START_HANDLE_REQUEST_OF, url);
254 User authUser = new User();
255 authUser.setUserId(userId);
256 authUser.setFirstName(firstName);
257 authUser.setLastName(lastName);
258 authUser.setEmail(email);
259 log.debug("auth user id is {}", userId);
261 Response response = null;
263 UserBusinessLogic userAdminManager = getUserAdminManager(context);
264 Either<User, ResponseFormat> authorize = userAdminManager.authorize(authUser);
266 if (authorize.isRight()) {
267 log.debug("authorize user failed");
268 response = buildErrorResponse(authorize.right().value());
271 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), authorize.left().value());
274 } catch (Exception e) {
275 log.debug("authorize user failed with unexpected error: {}", e);
276 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
280 /* User authorization end */
284 @Consumes(MediaType.APPLICATION_JSON)
285 @Produces(MediaType.APPLICATION_JSON)
286 @ApiOperation(value = "retrieve all administrators", httpMethod = "GET", notes = "Returns all administrators", response = User.class)
287 @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns user Ok"), @ApiResponse(code = 405, message = "Method Not Allowed"), @ApiResponse(code = 500, message = "Internal Server Error") })
288 public Response getAdminsUser(@Context final HttpServletRequest request) {
290 String url = request.getMethod() + " " + request.getRequestURI();
291 log.debug("(get) Start handle request of {}", url);
293 UserBusinessLogic userAdminManager = getUserAdminManager(request.getSession().getServletContext());
296 Either<List<User>, ResponseFormat> either = userAdminManager.getAllAdminUsers();
298 if (either.isRight()) {
299 log.debug("Failed to get all admin users");
300 return buildErrorResponse(either.right().value());
302 if (either.left().value() != null) {
303 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
305 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
308 } catch (Exception e) {
309 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get All Administrators");
310 log.debug("get all admins failed with unexpected error: {}", e);
311 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
317 @Consumes(MediaType.APPLICATION_JSON)
318 @Produces(MediaType.APPLICATION_JSON)
319 @ApiOperation(value = "Retrieve the list of all active ASDC users or only group of users having specific roles.", httpMethod = "GET", notes = "Returns list of users with the specified roles, or all of users in the case of empty 'roles' header", response = User.class)
320 @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns users Ok"), @ApiResponse(code = 204, message = "No provisioned ASDC users of requested role"), @ApiResponse(code = 403, message = "Restricted Access"),
321 @ApiResponse(code = 400, message = "Missing content"), @ApiResponse(code = 500, message = "Internal Server Error") })
322 public Response getUsersList(@Context final HttpServletRequest request, @ApiParam(value = "Any active user's USER_ID ") @HeaderParam(Constants.USER_ID_HEADER) final String userId,
323 @ApiParam(value = "TESTER,DESIGNER,PRODUCT_STRATEGIST,OPS,PRODUCT_MANAGER,GOVERNOR, ADMIN OR all users by not typing anything") @QueryParam("roles") final String roles) {
325 ServletContext context = request.getSession().getServletContext();
326 String url = request.getMethod() + " " + request.getRequestURI();
327 log.debug("Start handle request of {} modifier id is {}", url, userId);
329 List<String> rolesList = new ArrayList<>();
330 if (roles != null && !roles.trim().isEmpty()) {
331 String[] rolesArr = roles.split(ROLE_DELIMITER);
332 for (String role : rolesArr) {
333 rolesList.add(role.trim());
338 UserBusinessLogic userAdminManager = getUserAdminManager(context);
339 Either<List<User>, ResponseFormat> either = userAdminManager.getUsersList(userId, rolesList, roles);
341 if (either.isRight()) {
342 log.debug("Failed to get ASDC users");
343 return buildErrorResponse(either.right().value());
345 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
347 } catch (Exception e) {
348 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get ASDC users");
349 log.debug("get users failed with unexpected error: {}", e);
350 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
355 /////////////////////////////////////////////////////////////////////////////////////////////////////
359 @Consumes(MediaType.APPLICATION_JSON)
360 @Produces(MediaType.APPLICATION_JSON)
361 @ApiOperation(value = "delete user", notes = "Delete user", response = User.class)
362 @ApiResponses(value = { @ApiResponse(code = 200, message = "Update deleted OK"), @ApiResponse(code = 400, message = "Invalid Content."), @ApiResponse(code = 403, message = "Missing information"),
363 @ApiResponse(code = 404, message = "User not found"), @ApiResponse(code = 405, message = "Method Not Allowed"), @ApiResponse(code = 409, message = "Restricted operation"), @ApiResponse(code = 500, message = "Internal Server Error") })
364 public Response deActivateUser(@ApiParam(value = "userId of user to get", required = true) @PathParam("userId") final String userId, @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userIdHeader) {
366 ServletContext context = request.getSession().getServletContext();
367 String url = request.getMethod() + " " + request.getRequestURI();
368 log.debug("Start handle request of {} modifier id is {}", url, userIdHeader);
370 User modifier = new User();
371 modifier.setUserId(userIdHeader);
373 Response response = null;
375 UserBusinessLogic userAdminManager = getUserAdminManager(context);
376 Either<User, ResponseFormat> deactiveUserResponse = userAdminManager.deActivateUser(modifier, userId);
378 if (deactiveUserResponse.isRight()) {
379 log.debug("Failed to deactivate user");
380 response = buildErrorResponse(deactiveUserResponse.right().value());
383 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), deactiveUserResponse.left().value());
386 } catch (Exception e) {
387 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get ASDC users");
388 log.debug("deactivate user failed with unexpected error: {}", e);
389 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));