Class SASLAuthentication

java.lang.Object
org.jivesoftware.openfire.net.SASLAuthentication

public class SASLAuthentication extends Object
SASLAuthentication is responsible for returning the available SASL mechanisms to use and for actually performing the SASL authentication.

The list of available SASL mechanisms is determined by:

  1. The type of UserProvider being used since some SASL mechanisms require the server to be able to retrieve user passwords
  2. Whether anonymous logins are enabled or not.
  3. Whether shared secret authentication is enabled or not.
  4. Whether the underlying connection has been secured or not.
Author:
Hao Chen, Gaston Dombiak
  • Field Details

    • REALM

      public static final SystemProperty<String> REALM
    • APPROVED_REALMS

      public static final SystemProperty<List<String>> APPROVED_REALMS
    • PROXY_AUTH

      public static final SystemProperty<Boolean> PROXY_AUTH
    • SKIP_PEER_CERT_REVALIDATION_CLIENT

      public static final SystemProperty<Boolean> SKIP_PEER_CERT_REVALIDATION_CLIENT
    • EXTERNAL_S2S_REQUIRE_AUTHZID

      public static final SystemProperty<Boolean> EXTERNAL_S2S_REQUIRE_AUTHZID
      Require the peer to provide an authorization identity through SASL (typically in the Initial Response) when authenticating an inbound S2S connection that uses the EXTERNAL SASL mechanism. This is not required by the XMPP protocol specification, but it was required by Openfire versions prior to release 4.8.0. This configuration option is added to allow for backwards compatibility.
    • EXTERNAL_S2S_SKIP_SENDING_AUTHZID

      public static final SystemProperty<Boolean> EXTERNAL_S2S_SKIP_SENDING_AUTHZID
      Send an authorization identity in the Initial Response when attempting to authenticate using the SASL EXTERNAL mechanism with a remote XMPP domain. Sending the authzid in this manner is not required by the XMPP protocol specification, but is recommended in XEP-0178 for compatibility with older server implementations.
      See Also:
    • ENABLE_SASL2

      public static final SystemProperty<Boolean> ENABLE_SASL2
      Enable (or disable) SASL2. This is currently off by default, and means that SASL2 is not advertised in features, primarily.
      See Also:
    • SASL2_REQUIRE_TLS

      public static final SystemProperty<Boolean> SASL2_REQUIRE_TLS
      Require TLS for SASL2. This is currently on by default, and means that SASL2 is not advertised in features without TLS.
      See Also:
    • SASL_NAMESPACE

      public static final String SASL_NAMESPACE
      See Also:
    • SASL2_NAMESPACE

      public static final String SASL2_NAMESPACE
      See Also:
    • SASL_LAST_RESPONSE_WAS_PROVIDED_BUT_EMPTY

      public static final String SASL_LAST_RESPONSE_WAS_PROVIDED_BUT_EMPTY
      Java's SaslServer does not allow for null values. This makes it hard to distinguish between an empty (initial) responses (represented in XMPP as a single equals sign character '=', as per RFC-6120 section 6.4.2), and a missing/absent response. This can be problematic when a SASL mechanism implementation is to act differently on each scenario (like the EXTERNAL mechanism, that is to challenge for an authzid when no initial response is provided, but which is to use the stream's 'from' attribute value when the initial response is empty). To work around this shortcoming in Java's SASL implementation, this class will add a session attribute using a key that has the name of this constant's value when it detects a Sasl response that is present, but empty.
      See Also:
  • Constructor Details

    • SASLAuthentication

      public SASLAuthentication()
  • Method Details

    • getSASLMechanisms

      public static List<org.dom4j.Element> getSASLMechanisms(@Nonnull LocalSession session)
      Returns a list of XML elements representing the SASL mechanism features that are applicable to the given session. The returned elements are suitable for inclusion in the stream features element sent to the peer. Both SASL (RFC 6120) and SASL2 (XEP-0388) feature elements may be included, depending on configuration. An empty list is returned if the session is already authenticated or if the session type is not recognized.
      Parameters:
      session - the local session for which to determine applicable SASL mechanism feature elements (cannot be null)
      Returns:
      a list of XML elements representing SASL mechanism features; never null, possibly empty
    • getSASLMechanismsElement

      public static org.dom4j.Element getSASLMechanismsElement(ClientSession session, boolean usingSASL2)
      Returns an XML element advertising the SASL mechanisms available to the given client session. The element will be in either the SASL (RFC 6120) or SASL2 (XEP-0388) namespace depending on the usingSASL2 parameter. The EXTERNAL mechanism is only included if the session is encrypted and the peer has a trusted certificate. May return null if the resulting element would be empty and the sasl.client.suppressEmpty property is set to true.
      Parameters:
      session - the client session for which to generate the mechanisms element (cannot be null)
      usingSASL2 - true to generate a SASL2 <authentication> element; false to generate a SASL1 <mechanisms> element
      Returns:
      an XML element listing the available SASL mechanisms, or null if the element would be empty and suppression of empty elements is configured
    • getSASLMechanismsElement

      public static org.dom4j.Element getSASLMechanismsElement(LocalIncomingServerSession session, boolean usingSASL2)
      Returns an XML element advertising the SASL mechanisms available to the given incoming server session. The element will be in either the SASL (RFC 6120) or SASL2 (XEP-0388) namespace depending on the usingSASL2 parameter. The EXTERNAL mechanism is only offered if the session is encrypted and the peer has a trusted certificate that matches the session's default identity. May return null if the resulting element would be empty and the sasl.server.suppressEmpty property is set to true.
      Parameters:
      session - the incoming server session for which to generate the mechanisms element (cannot be null)
      usingSASL2 - true to generate a SASL2 <authentication> element in the SASL2 namespace; false to generate a SASL1 <mechanisms> element
      Returns:
      an XML element listing the available SASL mechanisms, or null if the element would be empty and suppression of empty elements is configured
    • handle

      public static SASLAuthentication.Status handle(LocalSession session, org.dom4j.Element doc, boolean usingSASL2)
      Handles the SASL authentication packet. The entity may be sending an initial authentication request or a response to a challenge made by the server. The returned value indicates whether the authentication has finished either successfully or not or if the entity is expected to send a response to a challenge.
      Parameters:
      session - the session that is authenticating with the server.
      doc - the stanza sent by the authenticating entity.
      usingSASL2 - true if the authentication is being performed using SASL2 (XEP-0388); false if using standard SASL (RFC 6120)
      Returns:
      value that indicates whether the authentication has finished either successfully or not or if the entity is expected to send a response to a challenge.
    • verifyCertificate

      public static boolean verifyCertificate(X509Certificate trustedCert, String hostname)
      Verifies that the given X.509 certificate is valid for the specified hostname. The certificate's server identities are checked against the hostname, with support for wildcard certificates. A wildcard identity (e.g. *.example.com) matches any direct subdomain of the base domain.
      Parameters:
      trustedCert - the X.509 certificate to verify (cannot be null)
      hostname - the hostname to verify the certificate against (cannot be null)
      Returns:
      true if the certificate is valid for the given hostname; false otherwise
    • verifyCertificates

      public static boolean verifyCertificates(Certificate[] chain, String hostname, boolean isS2S)
      Verifies that the end-entity certificate in the given certificate chain is trusted and valid for the specified hostname. The appropriate trust store is selected based on whether this is a server-to-server (S2S) or client-to-server (C2S) connection.
      Parameters:
      chain - the certificate chain to verify; the end-entity certificate will be extracted and checked against the trust store (may be null or empty, in which case verification will fail)
      hostname - the hostname that the certificate must be valid for (cannot be null)
      isS2S - true if this is a server-to-server connection (uses the S2S trust store); false if this is a client-to-server connection (uses the C2S trust store)
      Returns:
      true if a trusted end-entity certificate is found in the chain and it is valid for the given hostname; false otherwise
    • addSupportedMechanism

      public static void addSupportedMechanism(String mechanismName)
      Adds a new SASL mechanism to the list of supported SASL mechanisms by the server. The new mechanism will be offered to clients and connection managers as stream features.

      Note: this method simply registers the SASL mechanism to be advertised as a supported mechanism by Openfire. Actual SASL handling is done by Java itself, so you must add the provider to Java.

      Parameters:
      mechanismName - the name of the new SASL mechanism (cannot be null or an empty String).
    • removeSupportedMechanism

      public static void removeSupportedMechanism(String mechanismName)
      Removes a SASL mechanism from the list of supported SASL mechanisms by the server.
      Parameters:
      mechanismName - the name of the SASL mechanism to remove (cannot be null or empty, not case-sensitive).
    • getSupportedMechanisms

      public static Set<String> getSupportedMechanisms()
      Returns the list of supported SASL mechanisms by the server. Note that Java may have support for more mechanisms but some of them may not be returned since a special setup is required that might be missing. Use addSupportedMechanism(String) to add new SASL mechanisms.
      Returns:
      the set of supported SASL mechanisms by the server.
    • getImplementedMechanisms

      public static Set<String> getImplementedMechanisms()
      Returns a collection of mechanism names for which the JVM has an implementation available.

      Note that this need not (and likely will not) correspond with the list of mechanisms that is offered to XMPP peer entities, which is provided by #getSupportedMechanisms.

      Returns:
      a collection of SASL mechanism names (never null, possibly empty)
    • getEnabledMechanisms

      public static List<String> getEnabledMechanisms()
      Returns a collection of SASL mechanism names that forms the source pool from which the mechanisms that are eventually being offered to peers are obtained. When a mechanism is not returned by this method, it will never be offered, but when a mechanism is returned by this method, there is no guarantee that it will be offered. Apart from being returned in this method, an implementation must be available (see getImplementedMechanisms() and configuration or other characteristics of this server must not prevent a particular mechanism from being used (see @{link getSupportedMechanisms()}.
      Returns:
      A collection of mechanisms that are considered for use in this instance of Openfire.
    • setEnabledMechanisms

      public static void setEnabledMechanisms(List<String> mechanisms)
      Sets the collection of mechanism names that the system administrator allows to be used.
      Parameters:
      mechanisms - A collection of mechanisms that are considered for use in this instance of Openfire. Null to reset the default setting.
      See Also:
    • appendChannelBindingCapabilityIfNeeded

      public static void appendChannelBindingCapabilityIfNeeded(List<org.dom4j.Element> features)
      Appends to a list of stream features channel binding type capability announcements, if needed. The necessity is based on the other features already in the list, notably the advertised SASL mechanisms. Channel binding types that are available are added when-and-only-when these mechanisms include a channel-binding-capable mechanism.
      Parameters:
      features - The advertised features, that at the very least should include advertised SASL mechanisms.
      See Also: