blob: e64c8065197b48edd609e2edb5a5f31f520400d7 [file] [log] [blame]
/*
* 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();
}
}