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 javax.inject.Inject;
27 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
28 import org.openecomp.sdc.be.components.impl.GroupBusinessLogic;
29 import org.openecomp.sdc.be.config.BeEcompErrorManager;
30 import org.openecomp.sdc.be.dao.api.ActionStatus;
31 import org.openecomp.sdc.be.impl.ComponentsUtils;
32 import org.openecomp.sdc.be.model.User;
33 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
34 import org.openecomp.sdc.be.user.UserBusinessLogic;
35 import org.openecomp.sdc.common.api.Constants;
36 import org.openecomp.sdc.common.log.wrappers.Logger;
37 import org.openecomp.sdc.exception.ResponseFormat;
39 import javax.inject.Singleton;
40 import javax.servlet.ServletContext;
41 import javax.servlet.http.HttpServletRequest;
43 import javax.ws.rs.core.Context;
44 import javax.ws.rs.core.MediaType;
45 import javax.ws.rs.core.Response;
46 import java.io.UnsupportedEncodingException;
47 import java.net.URLDecoder;
48 import java.util.ArrayList;
49 import java.util.List;
51 @Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
53 @Api(value = "User Administration", description = "User admininstarator operations")
55 public class UserAdminServlet extends BeGenericServlet {
57 private static final String UTF_8 = "UTF-8";
58 private static final String START_HANDLE_REQUEST_OF = "Start handle request of {}";
59 private static final String ROLE_DELIMITER = ",";
60 private static final Logger log = Logger.getLogger(UserAdminServlet.class);
61 private final UserBusinessLogic userBusinessLogic;
64 public UserAdminServlet(UserBusinessLogic userBusinessLogic,
65 ComponentsUtils componentsUtils) {
66 super(userBusinessLogic, componentsUtils);
67 this.userBusinessLogic = userBusinessLogic;
70 /***************************************
72 *************************************************************/
74 /* User by userId CRUD start */
76 /////////////////////////////////////////////////////////////////////////////////////////////////////
77 // retrieve all user details
80 @Consumes(MediaType.APPLICATION_JSON)
81 @Produces(MediaType.APPLICATION_JSON)
82 @ApiOperation(value = "retrieve user details", httpMethod = "GET", notes = "Returns user details according to userId", response = User.class)
83 @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns user Ok"), @ApiResponse(code = 404, message = "User not found"), @ApiResponse(code = 405, message = "Method Not Allowed"),
84 @ApiResponse(code = 500, message = "Internal Server Error") })
85 public Response get(@ApiParam(value = "userId of user to get", required = true) @PathParam("userId") final String userId, @Context final HttpServletRequest request) {
87 String url = request.getMethod() + " " + request.getRequestURI();
88 log.debug("(get) Start handle request of {}", url);
91 Either<User, ActionStatus> either = userBusinessLogic.getUser(userId, false);
93 if (either.isRight()) {
94 return buildErrorResponse(getComponentsUtils().getResponseFormatByUserId(either.right().value(), userId));
96 if (either.left().value() != null) {
97 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
99 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
102 } catch (Exception e) {
103 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get User");
104 log.debug("get user failed with unexpected error: {}", e.getMessage(), e);
105 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
110 @Path("/{userId}/role")
111 @Consumes(MediaType.APPLICATION_JSON)
112 @Produces(MediaType.APPLICATION_JSON)
113 @ApiOperation(value = "retrieve user role", notes = "Returns user role according to userId", response = String.class)
114 @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns user role Ok"), @ApiResponse(code = 404, message = "User not found"), @ApiResponse(code = 405, message = "Method Not Allowed"),
115 @ApiResponse(code = 500, message = "Internal Server Error") })
116 public Response getRole(@ApiParam(value = "userId of user to get", required = true) @PathParam("userId") final String userId, @Context final HttpServletRequest request) {
118 String url = request.getMethod() + " " + request.getRequestURI();
119 log.debug("(getRole) Start handle request of {}", url);
122 Either<User, ActionStatus> either = userBusinessLogic.getUser(userId, false);
123 if (either.isRight()) {
124 return buildErrorResponse(getComponentsUtils().getResponseFormatByUserId(either.right().value(), userId));
126 if (either.left().value() != null) {
127 String roleJson = "{ \"role\" : \"" + either.left().value().getRole() + "\" }";
128 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), roleJson);
130 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
133 } catch (Exception e) {
134 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get User Role");
135 log.debug("Get user role failed with unexpected error: {}", e);
136 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
140 /////////////////////////////////////////////////////////////////////////////////////////////////////
143 @Path("/{userId}/role")
144 @Consumes(MediaType.APPLICATION_JSON)
145 @Produces(MediaType.APPLICATION_JSON)
146 @ApiOperation(value = "update user role", notes = "Update user role", response = User.class)
147 @ApiResponses(value = { @ApiResponse(code = 200, message = "Update user OK"), @ApiResponse(code = 400, message = "Invalid Content."), @ApiResponse(code = 403, message = "Missing information/Restricted operation"),
148 @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") })
149 public Response updateUserRole(@ApiParam(value = "userId of user to get", required = true) @PathParam("userId") final String userIdUpdateUser, @Context final HttpServletRequest request,
150 @ApiParam(value = "json describe the update role", required = true) String data, @HeaderParam(value = Constants.USER_ID_HEADER) String modifierUserId) {
152 String url = request.getMethod() + " " + request.getRequestURI();
153 log.debug(START_HANDLE_REQUEST_OF, url);
156 User modifier = new User();
157 modifier.setUserId(modifierUserId);
158 log.debug("modifier id is {}", modifierUserId);
160 Response response = null;
163 User updateInfoUser = getComponentsUtils().convertJsonToObject(data, modifier, User.class, AuditingActionEnum.UPDATE_USER).left().value();
164 Either<User, ResponseFormat> updateUserResponse = userBusinessLogic.updateUserRole(modifier, userIdUpdateUser, updateInfoUser.getRole());
166 if (updateUserResponse.isRight()) {
167 log.debug("failed to update user role");
168 response = buildErrorResponse(updateUserResponse.right().value());
171 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), updateUserResponse.left().value());
174 } catch (Exception e) {
175 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Update User Metadata");
176 log.debug("Update User Role failed with exception", e);
177 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
183 /* User role CRUD end */
185 /* New user CRUD start */
187 @Consumes(MediaType.APPLICATION_JSON)
188 @Produces(MediaType.APPLICATION_JSON)
189 @ApiOperation(value = "add user", httpMethod = "POST", notes = "Provision new user", response = User.class)
190 @ApiResponses(value = { @ApiResponse(code = 201, message = "New user created"), @ApiResponse(code = 400, message = "Invalid Content."), @ApiResponse(code = 403, message = "Missing information"),
191 @ApiResponse(code = 405, message = "Method Not Allowed"), @ApiResponse(code = 409, message = "User already exists"), @ApiResponse(code = 500, message = "Internal Server Error") })
192 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) {
194 String url = request.getMethod() + " " + request.getRequestURI();
195 log.debug(START_HANDLE_REQUEST_OF, url);
198 User modifier = new User();
199 modifier.setUserId(modifierAttId);
200 log.debug("modifier id is {}", modifierAttId);
202 Response response = null;
205 User newUserInfo = getComponentsUtils().convertJsonToObject(newUserData, modifier, User.class, AuditingActionEnum.ADD_USER).left().value();
206 Either<User, ResponseFormat> createUserResponse = userBusinessLogic.createUser(modifier, newUserInfo);
208 if (createUserResponse.isRight()) {
209 log.debug("failed to create user");
210 response = buildErrorResponse(createUserResponse.right().value());
213 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.CREATED), createUserResponse.left().value());
216 } catch (Exception e) {
217 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Update User Metadata");
218 log.debug("Create User failed with exception", e);
219 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
225 /* New user CRUD end */
227 /* User authorization start */
229 /////////////////////////////////////////////////////////////////////////////////////////////////////
230 // User Authorization
233 @Consumes(MediaType.APPLICATION_JSON)
234 @Produces(MediaType.APPLICATION_JSON)
236 @ApiOperation(value = "authorize", notes = "authorize user", response = User.class)
237 @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns user Ok"), @ApiResponse(code = 403, message = "Restricted Access"), @ApiResponse(code = 500, message = "Internal Server Error") })
238 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,
239 @HeaderParam("HTTP_CSP_EMAIL") String email) {
242 userId = userId != null ? URLDecoder.decode(userId, UTF_8) : null;
243 firstName = firstName != null ? URLDecoder.decode(firstName, UTF_8) : null;
244 lastName = lastName != null ? URLDecoder.decode(lastName, UTF_8) : null;
245 email = email != null ? URLDecoder.decode(email, UTF_8) : null;
246 } catch (UnsupportedEncodingException e) {
247 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Authorize User - decode headers");
248 ResponseFormat errorResponseWrapper = getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR);
249 log.error("#authorize - authorization decoding failed with error: ", e);
250 return buildErrorResponse(errorResponseWrapper);
253 String url = request.getMethod() + " " + request.getRequestURI();
254 log.debug(START_HANDLE_REQUEST_OF, url);
256 User authUser = new User();
257 authUser.setUserId(userId);
258 authUser.setFirstName(firstName);
259 authUser.setLastName(lastName);
260 authUser.setEmail(email);
261 log.debug("auth user id is {}", userId);
263 Response response = null;
265 Either<User, ResponseFormat> authorize = userBusinessLogic.authorize(authUser);
267 if (authorize.isRight()) {
268 log.debug("authorize user failed");
269 response = buildErrorResponse(authorize.right().value());
272 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), authorize.left().value());
275 } catch (Exception e) {
276 log.debug("authorize user failed with unexpected error: {}", e);
277 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
281 /* User authorization end */
285 @Consumes(MediaType.APPLICATION_JSON)
286 @Produces(MediaType.APPLICATION_JSON)
287 @ApiOperation(value = "retrieve all administrators", httpMethod = "GET", notes = "Returns all administrators", response = User.class)
288 @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns user Ok"), @ApiResponse(code = 405, message = "Method Not Allowed"), @ApiResponse(code = 500, message = "Internal Server Error") })
289 public Response getAdminsUser(@Context final HttpServletRequest request) {
291 String url = request.getMethod() + " " + request.getRequestURI();
292 log.debug("(get) Start handle request of {}", url);
295 Either<List<User>, ResponseFormat> either = userBusinessLogic.getAllAdminUsers();
297 if (either.isRight()) {
298 log.debug("Failed to get all admin users");
299 return buildErrorResponse(either.right().value());
301 if (either.left().value() != null) {
302 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
304 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
307 } catch (Exception e) {
308 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get All Administrators");
309 log.debug("get all admins failed with unexpected error: {}", e);
310 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
316 @Consumes(MediaType.APPLICATION_JSON)
317 @Produces(MediaType.APPLICATION_JSON)
318 @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)
319 @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"),
320 @ApiResponse(code = 400, message = "Missing content"), @ApiResponse(code = 500, message = "Internal Server Error") })
321 public Response getUsersList(@Context final HttpServletRequest request, @ApiParam(value = "Any active user's USER_ID ") @HeaderParam(Constants.USER_ID_HEADER) final String userId,
322 @ApiParam(value = "TESTER,DESIGNER,PRODUCT_STRATEGIST,OPS,PRODUCT_MANAGER,GOVERNOR, ADMIN OR all users by not typing anything") @QueryParam("roles") final String roles) {
324 String url = request.getMethod() + " " + request.getRequestURI();
325 log.debug("Start handle request of {} modifier id is {}", url, userId);
327 List<String> rolesList = new ArrayList<>();
328 if (roles != null && !roles.trim().isEmpty()) {
329 String[] rolesArr = roles.split(ROLE_DELIMITER);
330 for (String role : rolesArr) {
331 rolesList.add(role.trim());
336 Either<List<User>, ResponseFormat> either = userBusinessLogic.getUsersList(userId, rolesList, roles);
338 if (either.isRight()) {
339 log.debug("Failed to get ASDC users");
340 return buildErrorResponse(either.right().value());
342 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
344 } catch (Exception e) {
345 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get ASDC users");
346 log.debug("get users failed with unexpected error: {}", e);
347 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
352 /////////////////////////////////////////////////////////////////////////////////////////////////////
356 @Consumes(MediaType.APPLICATION_JSON)
357 @Produces(MediaType.APPLICATION_JSON)
358 @ApiOperation(value = "delete user", notes = "Delete user", response = User.class)
359 @ApiResponses(value = { @ApiResponse(code = 200, message = "Update deleted OK"), @ApiResponse(code = 400, message = "Invalid Content."), @ApiResponse(code = 403, message = "Missing information"),
360 @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") })
361 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) {
363 String url = request.getMethod() + " " + request.getRequestURI();
364 log.debug("Start handle request of {} modifier id is {}", url, userIdHeader);
366 User modifier = new User();
367 modifier.setUserId(userIdHeader);
369 Response response = null;
371 Either<User, ResponseFormat> deactiveUserResponse = userBusinessLogic.deActivateUser(modifier, userId);
373 if (deactiveUserResponse.isRight()) {
374 log.debug("Failed to deactivate user");
375 response = buildErrorResponse(deactiveUserResponse.right().value());
378 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), deactiveUserResponse.left().value());
381 } catch (Exception e) {
382 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get ASDC users");
383 log.debug("deactivate user failed with unexpected error: {}", e);
384 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));