001    /*
002     * Copyright 2016 UnboundID Corp.
003     * All Rights Reserved.
004     */
005    /*
006     * Copyright (C) 2016 UnboundID Corp.
007     *
008     * This program is free software; you can redistribute it and/or modify
009     * it under the terms of the GNU General Public License (GPLv2 only)
010     * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
011     * as published by the Free Software Foundation.
012     *
013     * This program is distributed in the hope that it will be useful,
014     * but WITHOUT ANY WARRANTY; without even the implied warranty of
015     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016     * GNU General Public License for more details.
017     *
018     * You should have received a copy of the GNU General Public License
019     * along with this program; if not, see <http://www.gnu.org/licenses>.
020     */
021    package com.unboundid.ldap.sdk.experimental;
022    
023    
024    
025    import com.unboundid.ldap.sdk.Entry;
026    import com.unboundid.ldap.sdk.LDAPException;
027    import com.unboundid.ldap.sdk.OperationType;
028    import com.unboundid.ldap.sdk.ResultCode;
029    import com.unboundid.util.Debug;
030    import com.unboundid.util.NotMutable;
031    import com.unboundid.util.StaticUtils;
032    import com.unboundid.util.ThreadSafety;
033    import com.unboundid.util.ThreadSafetyLevel;
034    
035    import static com.unboundid.ldap.sdk.experimental.ExperimentalMessages.*;
036    
037    
038    
039    /**
040     * This class represents an entry that holds information about a bind operation
041     * processed by an LDAP server, as per the specification described in
042     * draft-chu-ldap-logschema-00.
043     */
044    @NotMutable()
045    @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
046    public final class DraftChuLDAPLogSchema00BindEntry
047           extends DraftChuLDAPLogSchema00Entry
048    {
049      /**
050       * The name of the attribute used to hold the bind request method.
051       */
052      public static final String ATTR_BIND_METHOD = "reqMethod";
053    
054    
055    
056      /**
057       * The name of the attribute used to hold the LDAP protocol version specified
058       * in the bind request.
059       */
060      public static final String ATTR_PROTOCOL_VERSION = "reqVersion";
061    
062    
063    
064      /**
065       * The serial version UID for this serializable class.
066       */
067      private static final long serialVersionUID = 864660009992589945L;
068    
069    
070    
071      // The LDAP protocol version from the bind request.
072      private final int protocolVersion;
073    
074      // The base name of the bind request method.
075      private final String bindMethod;
076    
077      // The name of the SASL mechanism, if available.
078      private final String saslMechanism;
079    
080    
081    
082      /**
083       * Creates a new instance of this bind access log entry from the provided
084       * entry.
085       *
086       * @param  entry  The entry used to create this bind access log entry.
087       *
088       * @throws  LDAPException  If the provided entry cannot be decoded as a valid
089       *                         bind access log entry as per the specification
090       *                         contained in draft-chu-ldap-logschema-00.
091       */
092      public DraftChuLDAPLogSchema00BindEntry(final Entry entry)
093             throws LDAPException
094      {
095        super(entry, OperationType.BIND);
096    
097    
098        // Get the protocol version.
099        final String versionString = entry.getAttributeValue(ATTR_PROTOCOL_VERSION);
100        if (versionString == null)
101        {
102          throw new LDAPException(ResultCode.DECODING_ERROR,
103               ERR_LOGSCHEMA_DECODE_MISSING_REQUIRED_ATTR.get(entry.getDN(),
104                    ATTR_PROTOCOL_VERSION));
105        }
106        else
107        {
108          try
109          {
110            protocolVersion = Integer.parseInt(versionString);
111          }
112          catch (final Exception e)
113          {
114            Debug.debugException(e);
115            throw new LDAPException(ResultCode.DECODING_ERROR,
116                 ERR_LOGSCHEMA_DECODE_BIND_VERSION_ERROR.get(entry.getDN(),
117                      ATTR_PROTOCOL_VERSION, versionString),
118                 e);
119          }
120        }
121    
122    
123        // Get the bind method.  If it starts with "SASL/", then separate out the
124        // SASL mechanism name.
125        final String rawMethod = entry.getAttributeValue(ATTR_BIND_METHOD);
126        if (rawMethod == null)
127        {
128          throw new LDAPException(ResultCode.DECODING_ERROR,
129               ERR_LOGSCHEMA_DECODE_MISSING_REQUIRED_ATTR.get(entry.getDN(),
130                    ATTR_BIND_METHOD));
131        }
132    
133        final String lowerMethod = StaticUtils.toLowerCase(rawMethod);
134        if (lowerMethod.equals("simple"))
135        {
136          bindMethod = "SIMPLE";
137          saslMechanism = null;
138        }
139        else if (lowerMethod.startsWith("sasl/"))
140        {
141          bindMethod = "SASL";
142          saslMechanism = rawMethod.substring(5);
143        }
144        else
145        {
146          bindMethod = rawMethod;
147          saslMechanism = null;
148        }
149      }
150    
151    
152    
153      /**
154       * Retrieves the LDAP protocol version for the bind request described by this
155       * bind access log entry.
156       *
157       * @return  The LDAP protocol version for the bind request described by this
158       *          bind access log entry.
159       */
160      public int getProtocolVersion()
161      {
162        return protocolVersion;
163      }
164    
165    
166    
167      /**
168       * Retrieves the name of the bind method for the bind request described by
169       * this bind access log entry.  It is expected to be one of "SIMPLE" or
170       * "SASL".
171       *
172       * @return  The name of the bind method for the bind request described by this
173       *          bind access log entry.
174       */
175      public String getBindMethod()
176      {
177        return bindMethod;
178      }
179    
180    
181    
182      /**
183       * Retrieves the name of the SASL mechanism name for the bind request
184       * described by this bind access log entry, if appropriate.
185       *
186       * @return  The name of the SASL mechanism for the bind request described by
187       *          this bind access log entry, or {@code null} if the bind method is
188       *          not "SASL".
189       */
190      public String getSASLMechanism()
191      {
192        return saslMechanism;
193      }
194    }