com.microsoft.sqlserver.jdbc.DLLException Maven / Gradle / Ivy
/*
* Microsoft JDBC Driver for SQL Server Copyright(c) Microsoft Corporation All rights reserved. This program is made
* available under the terms of the MIT License. See the LICENSE file in the project root for more information.
*/
package com.microsoft.sqlserver.jdbc;
import java.text.MessageFormat;
/**
*
* This class is used to handle exceptions that may be received from mssql-jdbc_auth DLL and sqljdbc_xa DLL.
*
*/
class DLLException extends Exception {
private static final long serialVersionUID = -4498171382218222079L;
// category status and state are always either -1 or a positive number
// Internal Adal error category used in retry logic and building error message in managed code
private int category = -9;
// Public facing failing status returned from Adal APIs in SNISecADALGetAccessToken
private int status = -9;
// Internal last Adal API called in SNISecADALGetAccessToken for troubleshooting
private int state = -9;
// Internal error code used to choose which error message to print
private int errCode = -1; // any value that is not assigned to an error
// Parameters used to build error messages from auth dll
private String param1 = "";
private String param2 = "";
private String param3 = "";
DLLException(String message, int category, int status, int state) {
super(message);
this.category = category;
this.status = status;
this.state = state;
}
DLLException(String param1, String param2, String param3, int errCode) {
this.errCode = errCode;
this.param1 = param1;
this.param2 = param2;
this.param3 = param3;
}
int GetCategory() {
return this.category;
}
int GetStatus() {
return this.status;
}
int GetState() {
return this.state;
}
int GetErrCode() {
return this.errCode;
}
String GetParam1() {
return this.param1;
}
String GetParam2() {
return this.param2;
}
String GetParam3() {
return this.param3;
}
static void buildException(int errCode, String param1, String param2, String param3) throws SQLServerException {
String errMessage = getErrMessage(errCode);
MessageFormat form = new MessageFormat(SQLServerException.getErrString(errMessage));
String[] msgArgs = buildMsgParams(errMessage, param1, param2, param3);
throw new SQLServerException(null, form.format(msgArgs), null, 0, false);
}
private static String[] buildMsgParams(String errMessage, String parameter1, String parameter2, String parameter3) {
String[] msgArgs = new String[3];
if ("R_AECertLocBad".equalsIgnoreCase(errMessage)) {
msgArgs[0] = parameter1;
msgArgs[1] = parameter1 + "/" + parameter2 + "/" + parameter3;
} else if ("R_AECertStoreBad".equalsIgnoreCase(errMessage)) {
msgArgs[0] = parameter2;
msgArgs[1] = parameter1 + "/" + parameter2 + "/" + parameter3;
} else if ("R_AECertHashEmpty".equalsIgnoreCase(errMessage)) {
msgArgs[0] = parameter1 + "/" + parameter2 + "/" + parameter3;
} else {
msgArgs[0] = parameter1;
msgArgs[1] = parameter2;
msgArgs[2] = parameter3;
}
return msgArgs;
}
private static String getErrMessage(int errCode) {
String message;
switch (errCode) {
case 1:
message = "R_AEKeypathEmpty";
break;
case 2:
message = "R_EncryptedCEKNull";
break;
case 3:
message = "R_NullKeyEncryptionAlgorithm";
break;
case 4:
message = "R_AEWinApiErr";
break;
case 5:
message = "R_AECertpathBad";
break;
case 6:
message = "R_AECertLocBad";
break;
case 7:
message = "R_AECertStoreBad";
break;
case 8:
message = "R_AECertHashEmpty";
break;
case 9:
message = "R_AECertNotFound";
break;
case 10:
message = "R_AEMaloc";
break;
case 11:
message = "R_EmptyEncryptedCEK";
break;
case 12:
message = "R_InvalidKeyEncryptionAlgorithm";
break;
case 13:
message = "R_AEKeypathLong";
break;
case 14:
message = "R_InvalidEcryptionAlgorithmVersion";
break;
case 15:
message = "R_AEECEKLenBad";
break;
case 16:
message = "R_AEECEKSigLenBad";
break;
case 17:
message = "R_InvalidCertificateSignature";
break;
default:
message = "R_AEWinApiErr";
break;
}
return message;
}
}