/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.ranger.common; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import org.apache.log4j.Logger; import org.apache.ranger.admin.client.datatype.RESTResponse; import org.apache.ranger.view.VXMessage; import org.apache.ranger.view.VXResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class RESTErrorUtil { private static final Logger logger = Logger.getLogger(RESTErrorUtil.class); @Autowired StringUtil stringUtil; public static final String TRUE = "true"; public WebApplicationException createRESTException(VXResponse gjResponse) { Response errorResponse = Response .status(javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST) .entity(gjResponse).build(); WebApplicationException restException = new WebApplicationException( errorResponse); restException.fillInStackTrace(); UserSessionBase userSession = ContextUtil.getCurrentUserSession(); String loginId = null; if (userSession != null) { loginId = userSession.getLoginId(); } logger.info("Request failed. loginId=" + loginId + ", logMessage=" + gjResponse.getMsgDesc(), restException); return restException; } public WebApplicationException generateRESTException(VXResponse gjResponse) { Response errorResponse = Response .status(gjResponse.getStatusCode()) .entity(gjResponse).build(); WebApplicationException restException = new WebApplicationException( errorResponse); restException.fillInStackTrace(); UserSessionBase userSession = ContextUtil.getCurrentUserSession(); String loginId = null; if (userSession != null) { loginId = userSession.getLoginId(); } logger.info("Request failed. loginId=" + loginId + ", logMessage=" + gjResponse.getMsgDesc(), restException); return restException; } /** * * @param logMessage * This is optional * @return */ public WebApplicationException create403RESTException(String logMessage) { Response errorResponse = Response.status( javax.servlet.http.HttpServletResponse.SC_FORBIDDEN).build(); WebApplicationException restException = new WebApplicationException( errorResponse); restException.fillInStackTrace(); // TODO:Future:Open: Need to log all these and add user to // block list if this is deliberate // Get user information UserSessionBase userSession = ContextUtil.getCurrentUserSession(); String loginId = null; if (userSession != null) { loginId = userSession.getLoginId(); } String requestInfo = ""; try { RequestContext reqContext = ContextUtil.getCurrentRequestContext(); if (reqContext != null) { requestInfo = reqContext.toString(); requestInfo += ", timeTaken=" + (System.currentTimeMillis() - reqContext .getStartTime()); } } catch (Throwable contextEx) { logger.error("Error getting request info", contextEx); } logger.error("Access restricted. loginId=" + loginId + ", logMessage=" + logMessage + ", requestInfo=" + requestInfo, restException); return restException; } public WebApplicationException createGrantRevokeRESTException(String logMessage) { RESTResponse resp = new RESTResponse(); resp.setMsgDesc(logMessage); Response errorResponse = Response.status( javax.servlet.http.HttpServletResponse.SC_FORBIDDEN).entity(resp).build(); WebApplicationException restException = new WebApplicationException( errorResponse); restException.fillInStackTrace(); UserSessionBase userSession = ContextUtil.getCurrentUserSession(); String loginId = null; if (userSession != null) { loginId = userSession.getLoginId(); } logger.info("Request failed. loginId=" + loginId + ", logMessage=" + logMessage, restException); return restException; } public Integer parseInt(String value, String errorMessage, MessageEnums messageEnum, Long objectId, String fieldName) { try { if (stringUtil.isEmpty(value)) { return null; } else { return Integer.valueOf(value.trim()); } } catch (Throwable t) { throw createRESTException(errorMessage, messageEnum, objectId, fieldName, value); } } public Integer parseInt(String value, int defaultValue, String errorMessage, MessageEnums messageEnum, Long objectId, String fieldName) { try { if (stringUtil.isEmpty(value)) { return Integer.valueOf(defaultValue); } else { return Integer.valueOf(value.trim()); } } catch (Throwable t) { throw createRESTException(errorMessage, messageEnum, objectId, fieldName, value); } } public Long parseLong(String value, Long defaultValue) { if (stringUtil.isEmpty(value)) { return defaultValue; } return Long.valueOf(value.trim()); } public Long parseLong(String value, String errorMessage, MessageEnums messageEnum, Long objectId, String fieldName) { try { if (stringUtil.isEmpty(value)) { return null; } else { return Long.valueOf(value.trim()); } } catch (Throwable t) { throw createRESTException(errorMessage, messageEnum, objectId, fieldName, value); } } public String validateString(String value, String regExStr, String errorMessage, MessageEnums messageEnum, Long objectId, String fieldName) { return validateString(value, regExStr, errorMessage, messageEnum, objectId, fieldName, false); } public String validateString(String value, String regExStr, String errorMessage, MessageEnums messageEnum, Long objectId, String fieldName, boolean isMandatory) { if (stringUtil.isEmpty(value)) { if (isMandatory) { throw createRESTException(errorMessage, MessageEnums.NO_INPUT_DATA, objectId, fieldName, null); } return null; } value = value.trim(); if (value.length() != 0) { if (!stringUtil.validateString(regExStr, value)) { throw createRESTException(errorMessage, messageEnum, objectId, fieldName, value); } return value; } else { return null; } } public String validateStringForUpdate(String value, String originalValue, String regExStr, String errorMessage, MessageEnums messageEnum, Long objectId, String fieldName) { return validateStringForUpdate(value, originalValue, regExStr, errorMessage, messageEnum, objectId, fieldName, false); } public String validateStringForUpdate(String value, String originalValue, String regExStr, String errorMessage, MessageEnums messageEnum, Long objectId, String fieldName, boolean isMandatory) { if (stringUtil.isEmpty(value)) { if (isMandatory) { throw createRESTException(errorMessage, MessageEnums.NO_INPUT_DATA, objectId, fieldName, null); } return null; } if (!value.equalsIgnoreCase(originalValue)) { return validateString(value, StringUtil.VALIDATION_NAME, errorMessage, messageEnum, objectId, fieldName); } else { return value; } } public void validateStringList(String value, String[] validValues, String errorMessage, Long objectId, String fieldName) { for (int i = 0; i < validValues.length; i++) { if (validValues[i].equals(value)) { return; } } throw createRESTException(errorMessage, MessageEnums.INVALID_INPUT_DATA, objectId, fieldName, value); } public void validateMinMax(int value, int minValue, int maxValue, String errorMessage, Long objectId, String fieldName) { if (value < minValue || value > maxValue) { throw createRESTException(errorMessage, MessageEnums.INPUT_DATA_OUT_OF_BOUND, objectId, fieldName, "" + value); } } public WebApplicationException createRESTException(String errorMessage, MessageEnums messageEnum, Long objectId, String fieldName, String logMessage) { List<VXMessage> messageList = new ArrayList<VXMessage>(); messageList.add(messageEnum.getMessage(objectId, fieldName)); VXResponse gjResponse = new VXResponse(); gjResponse.setStatusCode(VXResponse.STATUS_ERROR); gjResponse.setMsgDesc(errorMessage); gjResponse.setMessageList(messageList); WebApplicationException webAppEx = createRESTException(gjResponse); logger.info("Validation error:logMessage=" + logMessage + ", response=" + gjResponse, webAppEx); return webAppEx; } public WebApplicationException createRESTException(String errorMessage) { VXResponse gjResponse = new VXResponse(); gjResponse.setStatusCode(VXResponse.STATUS_ERROR); gjResponse.setMsgDesc(errorMessage); WebApplicationException webAppEx = createRESTException(gjResponse); logger.info("Operation error. response=" + gjResponse, webAppEx); return webAppEx; } public WebApplicationException createRESTException(String errorMessage, MessageEnums messageEnum) { List<VXMessage> messageList = new ArrayList<VXMessage>(); messageList.add(messageEnum.getMessage()); VXResponse gjResponse = new VXResponse(); gjResponse.setStatusCode(VXResponse.STATUS_ERROR); gjResponse.setMsgDesc(errorMessage); gjResponse.setMessageList(messageList); WebApplicationException webAppEx = createRESTException(gjResponse); logger.info("Operation error. response=" + gjResponse, webAppEx); return webAppEx; } public WebApplicationException createRESTException(int responseCode, String logMessage, boolean logError) { Response errorResponse = Response .status(responseCode).entity(logMessage).build(); WebApplicationException restException = new WebApplicationException( errorResponse); restException.fillInStackTrace(); UserSessionBase userSession = ContextUtil.getCurrentUserSession(); String loginId = null; if (userSession != null) { loginId = userSession.getLoginId(); } if (logError) { logger.info("Request failed. loginId=" + loginId + ", logMessage=" + logMessage, restException); } return restException; } public Date parseDate(String value, String errorMessage, MessageEnums messageEnum, Long objectId, String fieldName, String dateFormat) { try { if (stringUtil.isEmpty(value)) { return null; } else { DateFormat formatter = new SimpleDateFormat(dateFormat); return formatter.parse(value); } } catch (Throwable t) { throw createRESTException(errorMessage, messageEnum, objectId, fieldName, value); } } public boolean parseBoolean(String value, boolean defaultValue) { if (stringUtil.isEmpty(value)) { return defaultValue; } return TRUE.equalsIgnoreCase(value.trim()); } public Boolean parseBoolean(String value, String errorMessage, MessageEnums messageEnum, Long objectId, String fieldName) { try { if (stringUtil.isEmpty(value)) { return null; } else { return Boolean.valueOf(value.trim()); } } catch (Throwable t) { throw createRESTException(errorMessage, messageEnum, objectId, fieldName, value); } } public WebApplicationException createRESTException(String errorMessage, MessageEnums messageEnum, Long objectId, String fieldName, String logMessage,int statusCode) { List<VXMessage> messageList = new ArrayList<VXMessage>(); messageList.add(messageEnum.getMessage(objectId, fieldName)); VXResponse vResponse = new VXResponse(); vResponse.setStatusCode(vResponse.STATUS_ERROR); vResponse.setMsgDesc(errorMessage); vResponse.setMessageList(messageList); Response errorResponse = Response.status(statusCode).entity(vResponse).build(); WebApplicationException restException = new WebApplicationException(errorResponse); restException.fillInStackTrace(); UserSessionBase userSession = ContextUtil.getCurrentUserSession(); String loginId = null; if (userSession != null) { loginId = userSession.getLoginId(); } logger.info("Request failed. loginId=" + loginId + ", logMessage=" + vResponse.getMsgDesc(), restException); return restException; } }