001 /*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License"). You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at
010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012 * See the License for the specific language governing permissions
013 * and limitations under the License.
014 *
015 * When distributing Covered Code, include this CDDL HEADER in each
016 * file and include the License file at
017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
018 * add the following below this CDDL HEADER, with the fields enclosed
019 * by brackets "[]" replaced with your own identifying information:
020 * Portions Copyright [yyyy] [name of copyright owner]
021 *
022 * CDDL HEADER END
023 *
024 *
025 * Copyright 2006-2008 Sun Microsystems, Inc.
026 */
027 package org.opends.server.controls;
028 import org.opends.messages.Message;
029
030
031
032 import org.opends.server.protocols.asn1.ASN1Element;
033 import org.opends.server.protocols.asn1.ASN1Exception;
034 import org.opends.server.protocols.asn1.ASN1OctetString;
035 import org.opends.server.protocols.ldap.LDAPFilter;
036 import org.opends.server.protocols.ldap.LDAPResultCode;
037 import org.opends.server.types.Control;
038 import org.opends.server.types.DirectoryException;
039 import org.opends.server.types.DebugLogLevel;
040 import org.opends.server.types.LDAPException;
041 import org.opends.server.types.SearchFilter;
042
043 import static org.opends.server.loggers.debug.DebugLogger.*;
044 import org.opends.server.loggers.debug.DebugTracer;
045 import static org.opends.messages.ProtocolMessages.*;
046 import static org.opends.server.util.ServerConstants.*;
047
048
049
050 /**
051 * This class implements the LDAP assertion request control as defined in RFC
052 * 4528. This control makes it possible to conditionally perform an operation
053 * if a given assertion is true. In particular, the associated operation should
054 * only be processed if the target entry matches the filter contained in this
055 * control.
056 */
057 public class LDAPAssertionRequestControl
058 extends Control
059 {
060 /**
061 * The tracer object for the debug logger.
062 */
063 private static final DebugTracer TRACER = getTracer();
064
065
066
067
068 // The unparsed LDAP search filter contained in the request from the client.
069 private LDAPFilter rawFilter;
070
071 // The processed search filter
072 private SearchFilter filter;
073
074
075
076 /**
077 * Creates a new instance of this LDAP assertion request control with the
078 * provided information.
079 *
080 * @param isCritical Indicates whether support for this control should be
081 * considered a critical part of the server processing.
082 * @param rawFilter The unparsed LDAP search filter contained in the
083 * request from the client.
084 */
085 public LDAPAssertionRequestControl(boolean isCritical, LDAPFilter rawFilter)
086 {
087 super(OID_LDAP_ASSERTION, isCritical,
088 new ASN1OctetString(rawFilter.encode().encode()));
089
090
091 this.rawFilter = rawFilter;
092
093 filter = null;
094 }
095
096
097
098 /**
099 * Creates a new instance of this LDAP assertion request control with the
100 * provided information.
101 *
102 * @param oid The OID to use for this control.
103 * @param isCritical Indicates whether support for this control should be
104 * considered a critical part of the server processing.
105 * @param rawFilter The unparsed LDAP search filter contained in the
106 * request from the client.
107 */
108 public LDAPAssertionRequestControl(String oid, boolean isCritical,
109 LDAPFilter rawFilter)
110 {
111 super(oid, isCritical, new ASN1OctetString(rawFilter.encode().encode()));
112
113
114 this.rawFilter = rawFilter;
115
116 filter = null;
117 }
118
119
120
121 /**
122 * Creates a new instance of this LDAP assertion request control with the
123 * provided information.
124 *
125 * @param oid The OID to use for this control.
126 * @param isCritical Indicates whether support for this control should be
127 * considered a critical part of the server processing.
128 * @param rawFilter The unparsed LDAP search filter contained in the
129 * request from the client.
130 * @param encodedValue The pre-encoded value for this control.
131 */
132 private LDAPAssertionRequestControl(String oid, boolean isCritical,
133 LDAPFilter rawFilter,
134 ASN1OctetString encodedValue)
135 {
136 super(oid, isCritical, encodedValue);
137
138
139 this.rawFilter = rawFilter;
140
141 filter = null;
142 }
143
144
145
146 /**
147 * Creates a new LDAP assertion request control from the contents of the
148 * provided control.
149 *
150 * @param control The generic control containing the information to use to
151 * create this LDAP assertion request control.
152 *
153 * @return The LDAP assertion control decoded from the provided control.
154 *
155 * @throws LDAPException If this control cannot be decoded as a valid LDAP
156 * assertion control.
157 */
158 public static LDAPAssertionRequestControl decodeControl(Control control)
159 throws LDAPException
160 {
161 if (! control.hasValue())
162 {
163 Message message = ERR_LDAPASSERT_NO_CONTROL_VALUE.get();
164 throw new LDAPException(LDAPResultCode.PROTOCOL_ERROR, message);
165 }
166
167
168 ASN1Element valueElement;
169 try
170 {
171 valueElement = ASN1Element.decode(control.getValue().value());
172 }
173 catch (ASN1Exception ae)
174 {
175 if (debugEnabled())
176 {
177 TRACER.debugCaught(DebugLogLevel.ERROR, ae);
178 }
179
180 Message message =
181 ERR_LDAPASSERT_INVALID_CONTROL_VALUE.get(ae.getMessage());
182 throw new LDAPException(LDAPResultCode.PROTOCOL_ERROR, message,
183 ae);
184 }
185
186
187 return new LDAPAssertionRequestControl(control.getOID(),
188 control.isCritical(),
189 LDAPFilter.decode(valueElement),
190 control.getValue());
191 }
192
193
194
195 /**
196 * Retrieves the raw, unparsed filter from the request control.
197 *
198 * @return The raw, unparsed filter from the request control.
199 */
200 public LDAPFilter getRawFilter()
201 {
202 return rawFilter;
203 }
204
205
206
207 /**
208 * Sets the raw, unparsed filter from the request control. This method should
209 * only be called by pre-parse plugins.
210 *
211 * @param rawFilter The raw, unparsed filter from the request control.
212 */
213 public void setRawFilter(LDAPFilter rawFilter)
214 {
215 this.rawFilter = rawFilter;
216 this.filter = null;
217
218 setValue(new ASN1OctetString(rawFilter.encode().encode()));
219 }
220
221
222
223 /**
224 * Retrieves the processed search filter for this control.
225 *
226 * @return The processed search filter for this control.
227 *
228 * @throws DirectoryException If a problem occurs while attempting to
229 * process the search filter.
230 */
231 public SearchFilter getSearchFilter()
232 throws DirectoryException
233 {
234 if (filter == null)
235 {
236 filter = rawFilter.toSearchFilter();
237 }
238
239 return filter;
240 }
241
242
243
244 /**
245 * Retrieves a string representation of this LDAP assertion request control.
246 *
247 * @return A string representation of this LDAP assertion request control.
248 */
249 public String toString()
250 {
251 StringBuilder buffer = new StringBuilder();
252 toString(buffer);
253 return buffer.toString();
254 }
255
256
257
258 /**
259 * Appends a string representation of this LDAP assertion request control to
260 * the provided buffer.
261 *
262 * @param buffer The buffer to which the information should be appended.
263 */
264 public void toString(StringBuilder buffer)
265 {
266 buffer.append("LDAPAssertionRequestControl(criticality=");
267 buffer.append(isCritical());
268 buffer.append(",filter=\"");
269 rawFilter.toString(buffer);
270 buffer.append("\")");
271 }
272 }
273