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 }