| | |
| | | import org.opends.server.util.Base64; |
| | | |
| | | import static org.opends.server.config.ConfigConstants.*; |
| | | import static org.opends.server.extensions.ExtensionsConstants.*; |
| | | import static org.opends.server.loggers.Debug.*; |
| | | import static org.opends.server.loggers.debug.DebugLogger.debugCought; |
| | | import static org.opends.server.loggers.debug.DebugLogger.debugEnabled; |
| | | import org.opends.server.types.DebugLogLevel; |
| | | import static org.opends.server.loggers.Error.*; |
| | | import static org.opends.server.messages.ExtensionsMessages.*; |
| | | import static org.opends.server.messages.MessageHandler.*; |
| | |
| | | extends SASLMechanismHandler |
| | | implements ConfigurableComponent |
| | | { |
| | | /** |
| | | * The fully-qualified name of this class for debugging purposes. |
| | | */ |
| | | private static final String CLASS_NAME = |
| | | "org.opends.server.extensions.DigestMD5SASLMechanismHandler"; |
| | | |
| | | |
| | | |
| | |
| | | { |
| | | super(); |
| | | |
| | | assert debugConstructor(CLASS_NAME); |
| | | } |
| | | |
| | | |
| | |
| | | public void initializeSASLMechanismHandler(ConfigEntry configEntry) |
| | | throws ConfigException, InitializationException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "initializeSASLMechanismHandler", |
| | | String.valueOf(configEntry)); |
| | | |
| | | |
| | | this.configEntryDN = configEntry.getDN(); |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "initializeSASLMechanismHandler", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | int msgID = MSGID_SASLDIGESTMD5_CANNOT_GET_MESSAGE_DIGEST; |
| | | String message = getMessage(msgID, stackTraceToSingleLineString(e)); |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "initializeSASLMechanismHandler", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | msgID = MSGID_SASLDIGESTMD5_CANNOT_GET_IDENTITY_MAPPER; |
| | | String message = getMessage(msgID, String.valueOf(configEntryDN), |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "initializeSASLMechanismHandler", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | msgID = MSGID_SASLDIGESTMD5_CANNOT_GET_REALM; |
| | | String message = getMessage(msgID, String.valueOf(configEntryDN), |
| | |
| | | @Override() |
| | | public void finalizeSASLMechanismHandler() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "finalizeSASLMechanismHandler"); |
| | | |
| | | DirectoryServer.deregisterConfigurableComponent(this); |
| | | DirectoryServer.deregisterSASLMechanismHandler(SASL_MECHANISM_DIGEST_MD5); |
| | |
| | | @Override() |
| | | public void processSASLBind(BindOperation bindOperation) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "processSASLBind", |
| | | String.valueOf(bindOperation)); |
| | | |
| | | |
| | | // The DIGEST-MD5 bind process uses two stages. See if the client provided |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | // This isn't necessarily fatal because we're going to retry using UTF-8, |
| | | // but we want to log it anyway. |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | // This is fatal because either we can't parse the credentials as a |
| | | // string at all, or we know we need to do so using UTF-8 and can't. |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | bindOperation.setResultCode(ResultCode.INVALID_CREDENTIALS); |
| | | |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | bindOperation.setResultCode(ResultCode.INVALID_CREDENTIALS); |
| | | |
| | |
| | | } |
| | | catch (ParseException pe) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", pe); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, pe); |
| | | } |
| | | |
| | | int msgID = MSGID_SASLDIGESTMD5_CANNOT_PARSE_RESPONSE_DIGEST; |
| | | String message = getMessage(msgID, stackTraceToSingleLineString(pe)); |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | bindOperation.setResultCode(ResultCode.INVALID_CREDENTIALS); |
| | | |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | bindOperation.setResultCode(ResultCode.INVALID_CREDENTIALS); |
| | | |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | bindOperation.setResultCode(ResultCode.INVALID_CREDENTIALS); |
| | | |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | bindOperation.setResultCode(ResultCode.INVALID_CREDENTIALS); |
| | | |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | bindOperation.setResultCode(ResultCode.INVALID_CREDENTIALS); |
| | | |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | bindOperation.setResultCode(ResultCode.INVALID_CREDENTIALS); |
| | | |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | logError(ErrorLogCategory.EXTENSIONS, |
| | | ErrorLogSeverity.SEVERE_WARNING, |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "processSASLBind", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | bindOperation.setResultCode(ResultCode.INVALID_CREDENTIALS); |
| | | |
| | |
| | | */ |
| | | private String generateNonce() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "generateNonce"); |
| | | |
| | | byte[] nonceBytes = new byte[16]; |
| | | |
| | |
| | | StringBuilder token) |
| | | throws DirectoryException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "readToken", String.valueOf(credentials), |
| | | String.valueOf(startPos), String.valueOf(length), |
| | | "java.lang.StringBuilder"); |
| | | |
| | | |
| | | // If the position is greater than or equal to the length, then we shouldn't |
| | |
| | | String qop, String charset) |
| | | throws UnsupportedEncodingException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "generateResponseDigest", |
| | | new String[] |
| | | { |
| | | String.valueOf(userName), |
| | | String.valueOf(authzID), |
| | | String.valueOf(password), |
| | | String.valueOf(realm), |
| | | String.valueOf(nonce), |
| | | String.valueOf(cnonce), |
| | | String.valueOf(nonceCount), |
| | | String.valueOf(digestURI), |
| | | String.valueOf(charset) |
| | | }); |
| | | |
| | | digestLock.lock(); |
| | | |
| | |
| | | String qop, String charset) |
| | | throws UnsupportedEncodingException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "generateResponseDigest", |
| | | new String[] |
| | | { |
| | | String.valueOf(userName), |
| | | String.valueOf(authzID), |
| | | String.valueOf(password), |
| | | String.valueOf(realm), |
| | | String.valueOf(nonce), |
| | | String.valueOf(cnonce), |
| | | String.valueOf(nonceCount), |
| | | String.valueOf(digestURI), |
| | | String.valueOf(charset) |
| | | }); |
| | | |
| | | digestLock.lock(); |
| | | |
| | |
| | | */ |
| | | private String getHexString(byte[] byteArray) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getHexString", String.valueOf(byteArray)); |
| | | |
| | | StringBuilder buffer = new StringBuilder(2*byteArray.length); |
| | | for (byte b : byteArray) |
| | |
| | | */ |
| | | public DN getConfigurableComponentEntryDN() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getConfigurableComponentEntryDN"); |
| | | |
| | | return configEntryDN; |
| | | } |
| | |
| | | */ |
| | | public List<ConfigAttribute> getConfigurationAttributes() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getConfigurationAttributes"); |
| | | |
| | | |
| | | LinkedList<ConfigAttribute> attrList = new LinkedList<ConfigAttribute>(); |
| | |
| | | public boolean hasAcceptableConfiguration(ConfigEntry configEntry, |
| | | List<String> unacceptableReasons) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "hasAcceptableConfiguration", |
| | | String.valueOf(configEntry), "java.util.List<String>"); |
| | | |
| | | |
| | | // Look at the identity mapper configuration. |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "hasAcceptableConfiguration", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | msgID = MSGID_SASLDIGESTMD5_CANNOT_GET_IDENTITY_MAPPER; |
| | | unacceptableReasons.add(getMessage(msgID, String.valueOf(configEntryDN), |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "hasAcceptableConfiguration", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | msgID = MSGID_SASLDIGESTMD5_CANNOT_GET_REALM; |
| | | unacceptableReasons.add(getMessage(msgID, String.valueOf(configEntryDN), |
| | |
| | | public ConfigChangeResult applyNewConfiguration(ConfigEntry configEntry, |
| | | boolean detailedResults) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "applyNewConfiguration", |
| | | String.valueOf(configEntry), |
| | | String.valueOf(detailedResults)); |
| | | |
| | | |
| | | ResultCode resultCode = ResultCode.SUCCESS; |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "applyNewConfiguration", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | msgID = MSGID_SASLDIGESTMD5_CANNOT_GET_IDENTITY_MAPPER; |
| | | messages.add(getMessage(msgID, String.valueOf(configEntryDN), |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "applyNewConfiguration", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | msgID = MSGID_SASLDIGESTMD5_CANNOT_GET_REALM; |
| | | messages.add(getMessage(msgID, String.valueOf(configEntryDN), |
| | |
| | | @Override() |
| | | public boolean isPasswordBased(String mechanism) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "isPasswordBased", String.valueOf(mechanism)); |
| | | |
| | | // This is a password-based mechanism. |
| | | return true; |
| | |
| | | @Override() |
| | | public boolean isSecure(String mechanism) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "isSecure", String.valueOf(mechanism)); |
| | | |
| | | // This may be considered a secure mechanism. |
| | | return true; |