1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 * 19 */ 20 package org.apache.directory.ldap.client.template; 21 22 23 import java.util.List; 24 25 import org.apache.directory.api.ldap.model.entry.Attribute; 26 import org.apache.directory.api.ldap.model.message.AddRequest; 27 import org.apache.directory.api.ldap.model.message.AddResponse; 28 import org.apache.directory.api.ldap.model.message.DeleteRequest; 29 import org.apache.directory.api.ldap.model.message.DeleteResponse; 30 import org.apache.directory.api.ldap.model.message.ModifyRequest; 31 import org.apache.directory.api.ldap.model.message.ModifyResponse; 32 import org.apache.directory.api.ldap.model.message.ResultCodeEnum; 33 import org.apache.directory.api.ldap.model.message.ResultResponse; 34 import org.apache.directory.api.ldap.model.message.SearchRequest; 35 import org.apache.directory.api.ldap.model.message.SearchScope; 36 import org.apache.directory.api.ldap.model.name.Dn; 37 import org.apache.directory.ldap.client.template.exception.LdapRequestUnsuccessfulException; 38 import org.apache.directory.ldap.client.template.exception.PasswordException; 39 40 41 /** 42 * Specifies the set of operations available on 43 * {@link org.apache.directory.ldap.client.template.LdapConnectionTemplate 44 * LdapConnectionTemplate}. This interface can be useful for unit testing 45 * in order to stub out methods. 46 * 47 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 48 */ 49 public interface LdapConnectionOperations 50 { 51 52 /** 53 * Adds an entry specified by an AddRequest to the LDAP server. 54 * 55 * @param addRequest The request 56 * @return An AddResponse 57 */ 58 public abstract AddResponse add( AddRequest addRequest ); 59 60 61 /** 62 * Adds an entry specified by a Dn and an array of Attribute's to the LDAP 63 * server. 64 * 65 * @param dn The distinguished name of the new entry 66 * @param attributes The attributes of the new entry 67 * @return An AddResponse 68 */ 69 public abstract AddResponse add( Dn dn, Attribute... attributes ); 70 71 72 /** 73 * Adds an entry specified by a Dn, to be filled out by a RequestBuilder, 74 * to the LDAP server. 75 * 76 * @param dn The distinguished name of the new entry 77 * @param requestBuilder The request builder 78 * @return An AddResponse 79 */ 80 public abstract AddResponse add( Dn dn, RequestBuilder<AddRequest> requestBuilder ); 81 82 83 /** 84 * Attempts to authenticate the supplied credentials against the first 85 * entry found matching the search criteria. If authentication fails, 86 * a PasswordException is thrown. If successful, the response is 87 * checked for warnings, and if present, a PasswordWarning is returned. 88 * Otherwise, null is returned. 89 * 90 * @param baseDn 91 * @param filter 92 * @param scope 93 * @param password 94 * @return 95 * @throws PasswordException 96 * @see {@link #authenticate(Dn, char[])} 97 * @see {@link #searchFirst(String, String, SearchScope, EntryMapper)} 98 */ 99 public PasswordWarning authenticate( String baseDn, String filter, SearchScope scope, char[] password ) throws PasswordException; 100 101 102 /** 103 * Attempts to authenticate the supplied credentials against the first 104 * entry found matching the search criteria. If authentication fails, 105 * a PasswordException is thrown. If successful, the response is 106 * checked for warnings, and if present, a PasswordWarning is returned. 107 * Otherwise, null is returned. 108 * 109 * @param baseDn 110 * @param filter 111 * @param scope 112 * @param password 113 * @return 114 * @throws PasswordException 115 * @see {@link #authenticate(Dn, char[])} 116 * @see {@link #searchFirst(Dn, String, SearchScope, EntryMapper)} 117 */ 118 public PasswordWarning authenticate( Dn baseDn, String filter, SearchScope scope, char[] password ) throws PasswordException; 119 120 121 /** 122 * Attempts to authenticate the supplied credentials against the first 123 * entry found matching the search criteria. If authentication fails, 124 * a PasswordException is thrown. If successful, the response is 125 * checked for warnings, and if present, a PasswordWarning is returned. 126 * Otherwise, null is returned. 127 * 128 * @param baseDn 129 * @param filter 130 * @param scope 131 * @param password 132 * @return 133 * @throws PasswordException 134 * @see {@link #authenticate(Dn, char[])} 135 * @see {@link #searchFirst(SearchRequest, EntryMapper)} 136 */ 137 public PasswordWarning authenticate( SearchRequest searchRequest, char[] password ) throws PasswordException; 138 139 140 /** 141 * Attempts to authenticate the supplied credentials. If authentication 142 * fails, a PasswordException is thrown. If successful, the response is 143 * checked for warnings, and if present, a PasswordWarning is returned. 144 * Otherwise, null is returned. 145 * 146 * @param userDn The distinguished name of the user 147 * @param password The password 148 * @return A PasswordWarning or null 149 * @throws PasswordException If authentication fails 150 */ 151 public abstract PasswordWarning authenticate( Dn userDn, char[] password ) throws PasswordException; 152 153 154 /** 155 * Deletes an entry specified by a DeleteRequest from the LDAP server. 156 * 157 * @param deleteRequest The request 158 * @return A DeleteResponse 159 */ 160 public abstract DeleteResponse delete( DeleteRequest deleteRequest ); 161 162 163 /** 164 * Deletes an entry specified by Dn from the LDAP server. 165 * 166 * @param dn The distinguished name of the entry 167 * @return A DeleteResponse 168 */ 169 public abstract DeleteResponse delete( Dn dn ); 170 171 172 /** 173 * Deletes an entry specified by Dn, and whose request is configured 174 * by a RequestBuilder, from the LDAP server. 175 * 176 * @param dn The distinguished name of the entry 177 * @param requestBuilder The RequestBuilder 178 * @return A DeleteResponse 179 */ 180 public abstract DeleteResponse delete( Dn dn, RequestBuilder<DeleteRequest> requestBuilder ); 181 182 183 /** 184 * Executes the <code>connectionCallback</code>, supplying it a managed 185 * connection. 186 * 187 * @param connectionCallback The callback 188 * @return Whatever the callback returns 189 */ 190 public abstract <T> T execute( ConnectionCallback<T> connectionCallback ); 191 192 193 /** 194 * Performs a lookup, and supplies the matching entry to the 195 * <code>entryMapper</code>. 196 * 197 * @param dn The distinguished name of the entry 198 * @param entryMapper The mapper from entry to model object 199 * @return Whatever the <code>entryMapper</code> returns 200 */ 201 public abstract <T> T lookup( Dn dn, EntryMapper<T> entryMapper ); 202 203 204 /** 205 * Performs a lookup, requesting <code>attributes</code>, and supplies 206 * the matching entry to the <code>entryMapper</code>. 207 * 208 * @param dn The distinguished name of the entry 209 * @param attributes The attributes to be fetched 210 * @param entryMapper The mapper from entry to model object 211 * @return Whatever the <code>entryMapper</code> returns 212 */ 213 public abstract <T> T lookup( Dn dn, String[] attributes, EntryMapper<T> entryMapper ); 214 215 216 /** 217 * Modifies the password for <code>userDn</code> to 218 * <code>newPassword</code> using the admin account. 219 * 220 * @param userDn 221 * @param newPassword 222 * @throws PasswordException 223 * @see {@link #modifyPassword(Dn, char[], char[], boolean)} 224 */ 225 public void modifyPassword( Dn userDn, char[] newPassword ) 226 throws PasswordException; 227 228 229 /** 230 * Modifies the password for <code>userDn</code> from 231 * <code>oldPassword</code> to <code>newPassword</code>. 232 * 233 * @param userDn 234 * @param oldPassword 235 * @param newPassword 236 * @throws PasswordException 237 * @see {@link #modifyPassword(Dn, char[], char[], boolean)} 238 */ 239 public void modifyPassword( Dn userDn, char[] oldPassword, 240 char[] newPassword ) throws PasswordException; 241 242 243 /** 244 * Modifies the password for <code>userDn</code> from 245 * <code>oldPassword</code> to <code>newPassword</code>, optionally using 246 * an admin account. If <code>asAdmin</code> is true, then the operation 247 * is performed in admin context which means <code>oldPassword</code> is 248 * may be <code>null</code>. 249 * 250 * @param userDn The distinguished name of the user 251 * @param oldPassword The users old password (optional if asAdmin is true) 252 * @param newPassword The users new password 253 * @param asAdmin If true, execute in admin context 254 * @throws PasswordException If the password modification fails 255 */ 256 public abstract void modifyPassword( Dn userDn, char[] oldPassword, char[] newPassword, 257 boolean asAdmin ) throws PasswordException; 258 259 260 /** 261 * Modifies an entry specified by a ModifyRequest on the LDAP server. 262 * 263 * @param modifyRequest The request 264 * @return A ModifyResponse 265 */ 266 public abstract ModifyResponse modify( ModifyRequest modifyRequest ); 267 268 269 /** 270 * Modifies an entry specified by Dn, and whose request is configured 271 * by a RequestBuilder, on the LDAP server. 272 * 273 * @param dn The distinguished name of the entry 274 * @param requestBuilder The RequestBuilder 275 * @return A ModifyResponse 276 */ 277 public abstract ModifyResponse modify( Dn dn, RequestBuilder<ModifyRequest> requestBuilder ); 278 279 280 /** 281 * Checks the supplied response for its result code, and if not 282 * {@link ResultCodeEnum#SUCCESS}, an exception is thrown. This method is 283 * intened to be used inline: 284 * 285 * <pre> 286 * template.responseOrException( template.delete( dn ) ); 287 * </pre> 288 * 289 * @param response The response to check for success 290 * @return The supplied <code>response</code> 291 * @throws LdapRequestUnsuccessfulException If the response is not 292 * {@link ResultCodeEnum#SUCCESS} 293 */ 294 public abstract <T extends ResultResponse> T responseOrException( T response ); 295 296 297 /** 298 * Searches for the entries matching the supplied criteria, feeding the 299 * result into the <code>entryMapper</code>. 300 * 301 * @param baseDn 302 * @param filter 303 * @param scope 304 * @param entryMapper 305 * @return The mapped entries 306 * @see {@link #search(SearchRequest, EntryMapper)} 307 */ 308 public abstract <T> List<T> search( String baseDn, String filter, SearchScope scope, 309 EntryMapper<T> entryMapper ); 310 311 312 /** 313 * Searches for the entries matching the supplied criteria, feeding the 314 * result into the <code>entryMapper</code>. 315 * 316 * @param baseDn 317 * @param filter 318 * @param scope 319 * @param entryMapper 320 * @return The mapped entries 321 * @see {@link #search(SearchRequest, EntryMapper)} 322 */ 323 public abstract <T> List<T> search( Dn baseDn, String filter, SearchScope scope, 324 EntryMapper<T> entryMapper ); 325 326 327 /** 328 * Searches for the entries matching the supplied criteria, feeding the 329 * result into the <code>entryMapper</code>, querying only the requested 330 * attributes. 331 * 332 * @param baseDn 333 * @param filter 334 * @param scope 335 * @param attributes 336 * @param entryMapper 337 * @return The mapped entries 338 * @see {@link #search(SearchRequest, EntryMapper)} 339 */ 340 public abstract <T> List<T> search( String baseDn, String filter, SearchScope scope, 341 String[] attributes, EntryMapper<T> entryMapper ); 342 343 344 /** 345 * Searches for the entries matching the supplied criteria, feeding the 346 * result into the <code>entryMapper</code>, querying only the requested 347 * attributes. 348 * 349 * @param baseDn 350 * @param filter 351 * @param scope 352 * @param attributes 353 * @param entryMapper 354 * @return The mapped entries 355 * @see {@link #search(SearchRequest, EntryMapper)} 356 */ 357 public abstract <T> List<T> search( Dn baseDn, String filter, SearchScope scope, 358 String[] attributes, EntryMapper<T> entryMapper ); 359 360 361 /** 362 * Searches for the entries matching the supplied 363 * <code>searchRequest</code>, feeding the result into the 364 * <code>entryMapper</code>. 365 * 366 * @param searchRequest The search request 367 * @param entryMapper The mapper 368 * @return The mapped entries 369 */ 370 public abstract <T> List<T> search( SearchRequest searchRequest, 371 EntryMapper<T> entryMapper ); 372 373 374 /** 375 * Searches for the first entry matching the supplied criteria, feeding the 376 * result into the <code>entryMapper</code>. 377 * 378 * @param baseDn 379 * @param filter 380 * @param scope 381 * @param entryMapper 382 * @return The mapped entries 383 * @see {@link #searchFirst(SearchRequest, EntryMapper)} 384 */ 385 public abstract <T> T searchFirst( String baseDn, String filter, SearchScope scope, 386 EntryMapper<T> entryMapper ); 387 388 389 /** 390 * Searches for the first entry matching the supplied criteria, feeding the 391 * result into the <code>entryMapper</code>. 392 * 393 * @param baseDn 394 * @param filter 395 * @param scope 396 * @param entryMapper 397 * @return The mapped entries 398 * @see {@link #searchFirst(SearchRequest, EntryMapper)} 399 */ 400 public abstract <T> T searchFirst( Dn baseDn, String filter, SearchScope scope, 401 EntryMapper<T> entryMapper ); 402 403 404 /** 405 * Searches for the first entry matching the supplied criteria, feeding the 406 * result into the <code>entryMapper</code>, querying only the requested 407 * attributes. 408 * 409 * @param baseDn 410 * @param filter 411 * @param scope 412 * @param attributes 413 * @param entryMapper 414 * @return The mapped entries 415 * @see {@link #searchFirst(SearchRequest, EntryMapper)} 416 */ 417 public abstract <T> T searchFirst( String baseDn, String filter, SearchScope scope, 418 String[] attributes, EntryMapper<T> entryMapper ); 419 420 421 /** 422 * Searches for the first entry matching the supplied criteria, feeding the 423 * result into the <code>entryMapper</code>, querying only the requested 424 * attributes. 425 * 426 * @param baseDn 427 * @param filter 428 * @param scope 429 * @param attributes 430 * @param entryMapper 431 * @return The mapped entries 432 * @see {@link #searchFirst(SearchRequest, EntryMapper)} 433 */ 434 public abstract <T> T searchFirst( Dn baseDn, String filter, SearchScope scope, 435 String[] attributes, EntryMapper<T> entryMapper ); 436 437 438 /** 439 * Searches for the first entry matching the supplied 440 * <code>searchRequest</code>, feeding the result into the 441 * <code>entryMapper</code>. This is basically the same as 442 * {@link #search(SearchRequest, EntryMapper)}, but is optimized by 443 * modifying the <code>searchRequest</code> to set its size limit to 1. 444 * The <code>searchRequest</code> is returned to its original size limit 445 * before this method returns (or throws an exception). 446 * 447 * @param searchRequest The search request 448 * @param entryMapper The mapper 449 * @return The mapped entry 450 */ 451 public abstract <T> T searchFirst( SearchRequest searchRequest, 452 EntryMapper<T> entryMapper ); 453 454 }