use of password.pwm.error.PwmOperationalException in project pwm by pwm-project.
the class LocalDbOtpOperator method readOtpUserConfiguration.
@Override
public OTPUserRecord readOtpUserConfiguration(final UserIdentity theUser, final String userGUID) throws PwmUnrecoverableException {
LOGGER.trace(String.format("Enter: readOtpUserConfiguration(%s, %s)", theUser, userGUID));
if (userGUID == null || userGUID.length() < 1) {
throw new PwmUnrecoverableException(new ErrorInformation(PwmError.ERROR_MISSING_GUID, "cannot save otp to localDB, user does not have a GUID"));
}
if (localDB == null || localDB.status() != LocalDB.Status.OPEN) {
final String errorMsg = "LocalDB is not available, unable to write user otp";
final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_LOCALDB_UNAVAILABLE, errorMsg);
throw new PwmUnrecoverableException(errorInformation);
}
OTPUserRecord otpConfig = null;
try {
final Configuration config = this.getPwmApplication().getConfig();
String value = localDB.get(LocalDB.DB.OTP_SECRET, userGUID);
if (value != null && value.length() > 0) {
if (config.readSettingAsBoolean(PwmSetting.OTP_SECRET_ENCRYPT)) {
value = decryptAttributeValue(value);
}
if (value != null) {
otpConfig = decomposeOtpAttribute(value);
}
if (otpConfig != null) {
LOGGER.debug("found user OTP secret in LocalDB: " + otpConfig.toString());
}
}
} catch (LocalDBException e) {
final String errorMsg = "unexpected LocalDB error reading otp: " + e.getMessage();
final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_UNKNOWN, errorMsg);
throw new PwmUnrecoverableException(errorInformation);
} catch (PwmOperationalException e) {
final String errorMsg = "unexpected error reading otp: " + e.getMessage();
final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_UNKNOWN, errorMsg);
throw new PwmUnrecoverableException(errorInformation);
}
return otpConfig;
}
use of password.pwm.error.PwmOperationalException in project pwm by pwm-project.
the class SmsQueueManager method determineIfResultSuccessful.
private static void determineIfResultSuccessful(final Configuration config, final int resultCode, final String resultBody) throws PwmOperationalException {
final List<String> resultCodeTests = config.readSettingAsStringArray(PwmSetting.SMS_SUCCESS_RESULT_CODE);
if (resultCodeTests != null && !resultCodeTests.isEmpty()) {
final String resultCodeStr = String.valueOf(resultCode);
if (!resultCodeTests.contains(resultCodeStr)) {
throw new PwmOperationalException(new ErrorInformation(PwmError.ERROR_SMS_SEND_ERROR, "response result code " + resultCode + " is not a configured successful result code"));
}
}
final List<String> regexBodyTests = config.readSettingAsStringArray(PwmSetting.SMS_RESPONSE_OK_REGEX);
if (regexBodyTests == null || regexBodyTests.isEmpty()) {
return;
}
if (resultBody == null || resultBody.isEmpty()) {
throw new PwmOperationalException(new ErrorInformation(PwmError.ERROR_SMS_SEND_ERROR, "result has no body but there are configured regex response matches, so send not considered successful"));
}
for (final String regex : regexBodyTests) {
final Pattern p = Pattern.compile(regex, Pattern.DOTALL);
final Matcher m = p.matcher(resultBody);
if (m.matches()) {
LOGGER.trace("result body matched configured regex match setting: " + regex);
return;
}
}
throw new PwmOperationalException(new ErrorInformation(PwmError.ERROR_SMS_SEND_ERROR, "result body did not matching any configured regex match settings"));
}
use of password.pwm.error.PwmOperationalException in project pwm by pwm-project.
the class ActionExecutor method executeWebserviceAction.
private void executeWebserviceAction(final SessionLabel sessionLabel, final ActionConfiguration actionConfiguration) throws PwmOperationalException, PwmUnrecoverableException {
String url = actionConfiguration.getUrl();
String body = actionConfiguration.getBody();
final Map<String, String> headers = new LinkedHashMap<>();
if (actionConfiguration.getHeaders() != null) {
headers.putAll(actionConfiguration.getHeaders());
}
try {
// expand using pwm macros
if (settings.isExpandPwmMacros()) {
if (settings.getMacroMachine() == null) {
throw new PwmUnrecoverableException(new ErrorInformation(PwmError.ERROR_UNKNOWN, "executor specified macro expansion but did not supply macro machine"));
}
final MacroMachine macroMachine = settings.getMacroMachine();
url = macroMachine.expandMacros(url);
body = body == null ? "" : macroMachine.expandMacros(body);
for (final Map.Entry<String, String> entry : headers.entrySet()) {
final String headerName = entry.getKey();
final String headerValue = entry.getValue();
if (headerValue != null) {
headers.put(headerName, macroMachine.expandMacros(headerValue));
}
}
}
// add basic auth header;
if (!StringUtil.isEmpty(actionConfiguration.getUsername()) && !StringUtil.isEmpty(actionConfiguration.getPassword())) {
final String authHeaderValue = new BasicAuthInfo(actionConfiguration.getUsername(), new PasswordData(actionConfiguration.getPassword())).toAuthHeader();
headers.put(HttpHeader.Authorization.getHttpName(), authHeaderValue);
}
final HttpMethod method = HttpMethod.fromString(actionConfiguration.getMethod().toString());
final PwmHttpClientRequest clientRequest = new PwmHttpClientRequest(method, url, body, headers);
final PwmHttpClient client;
{
if (actionConfiguration.getCertificates() != null) {
final PwmHttpClientConfiguration clientConfiguration = PwmHttpClientConfiguration.builder().certificates(actionConfiguration.getCertificates()).build();
client = new PwmHttpClient(pwmApplication, sessionLabel, clientConfiguration);
} else {
client = new PwmHttpClient(pwmApplication, sessionLabel);
}
}
final PwmHttpClientResponse clientResponse = client.makeRequest(clientRequest);
if (clientResponse.getStatusCode() != 200) {
throw new PwmOperationalException(new ErrorInformation(PwmError.ERROR_SERVICE_UNREACHABLE, "unexpected HTTP status code while calling external web service: " + clientResponse.getStatusCode() + " " + clientResponse.getStatusPhrase()));
}
} catch (PwmException e) {
if (e instanceof PwmOperationalException) {
throw (PwmOperationalException) e;
}
final String errorMsg = "unexpected error during API execution: " + e.getMessage();
LOGGER.error(errorMsg);
throw new PwmOperationalException(new ErrorInformation(PwmError.ERROR_UNKNOWN, errorMsg));
}
}
use of password.pwm.error.PwmOperationalException in project pwm by pwm-project.
the class ActionExecutor method writeLdapAttribute.
private static void writeLdapAttribute(final SessionLabel sessionLabel, final ChaiUser theUser, final String attrName, final String attrValue, final ActionConfiguration.LdapMethod ldapMethod, final MacroMachine macroMachine) throws PwmOperationalException, ChaiUnavailableException {
final ActionConfiguration.LdapMethod effectiveLdapMethod = (ldapMethod == null) ? ActionConfiguration.LdapMethod.replace : ldapMethod;
final String effectiveAttrValue = (macroMachine != null) ? macroMachine.expandMacros(attrValue) : attrValue;
LOGGER.trace(sessionLabel, "beginning ldap " + effectiveLdapMethod.toString() + " operation on " + theUser.getEntryDN() + ", attribute " + attrName);
switch(effectiveLdapMethod) {
case replace:
{
try {
theUser.writeStringAttribute(attrName, effectiveAttrValue);
LOGGER.info(sessionLabel, "replaced attribute on user " + theUser.getEntryDN() + " (" + attrName + "=" + effectiveAttrValue + ")");
} catch (ChaiOperationException e) {
final String errorMsg = "error setting '" + attrName + "' attribute on user " + theUser.getEntryDN() + ", error: " + e.getMessage();
final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_UNKNOWN, errorMsg);
final PwmOperationalException newException = new PwmOperationalException(errorInformation);
newException.initCause(e);
throw newException;
}
}
break;
case add:
{
try {
theUser.addAttribute(attrName, effectiveAttrValue);
LOGGER.info(sessionLabel, "added attribute on user " + theUser.getEntryDN() + " (" + attrName + "=" + effectiveAttrValue + ")");
} catch (ChaiOperationException e) {
final String errorMsg = "error adding '" + attrName + "' attribute value from user " + theUser.getEntryDN() + ", error: " + e.getMessage();
final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_UNKNOWN, errorMsg);
final PwmOperationalException newException = new PwmOperationalException(errorInformation);
newException.initCause(e);
throw newException;
}
}
break;
case remove:
{
try {
theUser.deleteAttribute(attrName, effectiveAttrValue);
LOGGER.info(sessionLabel, "deleted attribute value on user " + theUser.getEntryDN() + " (" + attrName + ")");
} catch (ChaiOperationException e) {
final String errorMsg = "error deletig '" + attrName + "' attribute value on user " + theUser.getEntryDN() + ", error: " + e.getMessage();
final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_UNKNOWN, errorMsg);
final PwmOperationalException newException = new PwmOperationalException(errorInformation);
newException.initCause(e);
throw newException;
}
}
break;
default:
throw new IllegalStateException("unexpected ldap method type " + effectiveLdapMethod);
}
}
use of password.pwm.error.PwmOperationalException in project pwm by pwm-project.
the class CrService method clearResponses.
public void clearResponses(final SessionLabel sessionLabel, final UserIdentity userIdentity, final ChaiUser theUser, final String userGUID) throws PwmOperationalException, ChaiUnavailableException {
final Configuration config = pwmApplication.getConfig();
int attempts = 0;
int successes = 0;
LOGGER.trace(sessionLabel, "beginning clear response operation for user " + theUser.getEntryDN() + " guid=" + userGUID);
final List<DataStorageMethod> writeMethods = config.helper().getCrWritePreference();
for (final DataStorageMethod loopWriteMethod : writeMethods) {
try {
attempts++;
operatorMap.get(loopWriteMethod).clearResponses(userIdentity, theUser, userGUID);
successes++;
} catch (PwmUnrecoverableException e) {
LOGGER.error(sessionLabel, "error clearing responses via " + loopWriteMethod + ", error: " + e.getMessage());
}
}
if (attempts == 0) {
final String errorMsg = "no response save methods are available or configured";
final ErrorInformation errorInfo = new ErrorInformation(PwmError.ERROR_CLEARING_RESPONSES, errorMsg);
throw new PwmOperationalException(errorInfo);
}
if (attempts != successes) {
// should be impossible to read here, but just in case.
final String errorMsg = "response clear partially successful; attempts=" + attempts + ", successes=" + successes;
final ErrorInformation errorInfo = new ErrorInformation(PwmError.ERROR_CLEARING_RESPONSES, errorMsg);
throw new PwmOperationalException(errorInfo);
}
}
Aggregations