| /* |
| * 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.accumulo.core.client; |
| |
| import org.apache.accumulo.core.client.impl.thrift.SecurityErrorCode; |
| import org.apache.accumulo.core.client.impl.thrift.ThriftSecurityException; |
| import org.apache.commons.lang.StringUtils; |
| |
| /** |
| * An Accumulo Exception for security violations, authentication failures, authorization failures, |
| * etc. |
| */ |
| public class AccumuloSecurityException extends Exception { |
| private static final long serialVersionUID = 1L; |
| |
| private static String getDefaultErrorMessage(final SecurityErrorCode errorcode) { |
| switch (errorcode == null ? SecurityErrorCode.DEFAULT_SECURITY_ERROR : errorcode) { |
| case BAD_CREDENTIALS: |
| return "Username or Password is Invalid"; |
| case CONNECTION_ERROR: |
| return "Connection Error Occurred"; |
| case PERMISSION_DENIED: |
| return "User does not have permission to perform this action"; |
| case USER_DOESNT_EXIST: |
| return "The user does not exist"; |
| case USER_EXISTS: |
| return "The user exists"; |
| case GRANT_INVALID: |
| return "The GRANT permission cannot be granted or revoked"; |
| case BAD_AUTHORIZATIONS: |
| return "The user does not have the specified authorizations assigned"; |
| case UNSUPPORTED_OPERATION: |
| return "The configured security handler does not support this operation"; |
| case INVALID_TOKEN: |
| return "The configured authenticator does not accept this type of token"; |
| case AUTHENTICATOR_FAILED: |
| return "The configured authenticator failed for some reason"; |
| case AUTHORIZOR_FAILED: |
| return "The configured authorizor failed for some reason"; |
| case PERMISSIONHANDLER_FAILED: |
| return "The configured permission handler failed for some reason"; |
| case TOKEN_EXPIRED: |
| return "The supplied token expired, please update and try again"; |
| case INSUFFICIENT_PROPERTIES: |
| return "The login properties supplied are not sufficient for authentication. " |
| + "Please check the requested properties and try again"; |
| case DEFAULT_SECURITY_ERROR: |
| default: |
| return "Unknown security exception"; |
| } |
| } |
| |
| private String user; |
| private String tableInfo; |
| private SecurityErrorCode errorCode; |
| |
| /** |
| * @return this exception as a thrift exception |
| */ |
| public ThriftSecurityException asThriftException() { |
| return new ThriftSecurityException(user, errorCode); |
| } |
| |
| /** |
| * Construct a user-facing exception from a serialized version. |
| * |
| * @param thrift |
| * a serialized version |
| */ |
| public AccumuloSecurityException(final ThriftSecurityException thrift) { |
| this(thrift.getUser(), thrift.getCode(), thrift); |
| } |
| |
| /** |
| * @param user |
| * the relevant user for the security violation |
| * @param errorcode |
| * the specific reason for this exception |
| * @param cause |
| * the exception that caused this violation |
| */ |
| public AccumuloSecurityException(final String user, final SecurityErrorCode errorcode, |
| final Throwable cause) { |
| super(getDefaultErrorMessage(errorcode), cause); |
| this.user = user; |
| this.errorCode = errorcode == null ? SecurityErrorCode.DEFAULT_SECURITY_ERROR : errorcode; |
| } |
| |
| /** |
| * @param user |
| * the relevant user for the security violation |
| * @param errorcode |
| * the specific reason for this exception |
| * @param tableInfo |
| * the relevant tableInfo for the security violation |
| * @param cause |
| * the exception that caused this violation |
| */ |
| public AccumuloSecurityException(final String user, final SecurityErrorCode errorcode, |
| final String tableInfo, final Throwable cause) { |
| super(getDefaultErrorMessage(errorcode), cause); |
| this.user = user; |
| this.errorCode = errorcode == null ? SecurityErrorCode.DEFAULT_SECURITY_ERROR : errorcode; |
| this.tableInfo = tableInfo; |
| } |
| |
| /** |
| * @param user |
| * the relevant user for the security violation |
| * @param errorcode |
| * the specific reason for this exception |
| */ |
| public AccumuloSecurityException(final String user, final SecurityErrorCode errorcode) { |
| super(getDefaultErrorMessage(errorcode)); |
| this.user = user; |
| this.errorCode = errorcode == null ? SecurityErrorCode.DEFAULT_SECURITY_ERROR : errorcode; |
| } |
| |
| /** |
| * @param user |
| * the relevant user for the security violation |
| * @param errorcode |
| * the specific reason for this exception |
| * @param tableInfo |
| * the relevant tableInfo for the security violation |
| */ |
| public AccumuloSecurityException(final String user, final SecurityErrorCode errorcode, |
| final String tableInfo) { |
| super(getDefaultErrorMessage(errorcode)); |
| this.user = user; |
| this.errorCode = errorcode == null ? SecurityErrorCode.DEFAULT_SECURITY_ERROR : errorcode; |
| this.tableInfo = tableInfo; |
| } |
| |
| /** |
| * @return the relevant user for the security violation |
| */ |
| public String getUser() { |
| return user; |
| } |
| |
| public void setUser(String s) { |
| this.user = s; |
| } |
| |
| /** |
| * @return the relevant tableInfo for the security violation |
| */ |
| public String getTableInfo() { |
| return tableInfo; |
| } |
| |
| public void setTableInfo(String tableInfo) { |
| this.tableInfo = tableInfo; |
| } |
| |
| /** |
| * @return the specific reason for this exception |
| * @since 1.5.0 |
| */ |
| |
| public org.apache.accumulo.core.client.security.SecurityErrorCode getSecurityErrorCode() { |
| return org.apache.accumulo.core.client.security.SecurityErrorCode.valueOf(errorCode.name()); |
| } |
| |
| @Override |
| public String getMessage() { |
| StringBuilder message = new StringBuilder(); |
| message.append("Error ").append(errorCode); |
| message.append(" for user ").append(user); |
| if (!StringUtils.isEmpty(tableInfo)) { |
| message.append(" on table ").append(tableInfo); |
| } |
| message.append(" - ").append(super.getMessage()); |
| return message.toString(); |
| } |
| } |