keycloak
クラス | 公開メンバ関数 | 関数 | 非公開メンバ関数 | 非公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager クラス
org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager 連携図
Collaboration graph

クラス

interface  LdapOperation
 

公開メンバ関数

 LDAPOperationManager (LDAPConfig config) throws NamingException
 
void modifyAttribute (String dn, Attribute attribute)
 
void modifyAttributes (String dn, NamingEnumeration< Attribute > attributes)
 
void removeAttribute (String dn, Attribute attribute)
 
void addAttribute (String dn, Attribute attribute)
 
void removeEntry (final String entryDn)
 
String renameEntry (String oldDn, String newDn, boolean fallback)
 
List< SearchResult > search (final String baseDN, final String filter, Collection< String > returningAttributes, int searchScope) throws NamingException
 
List< SearchResult > searchPaginated (final String baseDN, final String filter, final LDAPQuery identityQuery) throws NamingException
 
String getFilterById (String id)
 
SearchResult lookupById (final String baseDN, final String id, final Collection< String > returningAttributes)
 
void authenticate (String dn, String password) throws AuthenticationException
 
void modifyAttributes (final String dn, final ModificationItem[] mods, LDAPOperationDecorator decorator)
 
void createSubContext (final String name, final Attributes attributes)
 
Attributes getAttributes (final String entryUUID, final String baseDN, Set< String > returningAttributes)
 
String decodeEntryUUID (final Object entryUUID)
 

関数

private< R > R execute (LdapOperation< R > operation) throws NamingException
 
private< R > R execute (LdapOperation< R > operation, LDAPOperationDecorator decorator) throws NamingException
 

非公開メンバ関数

String findNextDNForFallback (String newDn, int counter)
 
SearchControls getSearchControls (Collection< String > returningAttributes, int searchScope)
 
void destroySubcontext (LdapContext context, final String dn)
 
String getUuidAttributeName ()
 
LdapContext createLdapContext () throws NamingException
 
Map< String, Object > createConnectionProperties ()
 
Set< String > getReturningAttributes (final Collection< String > returningAttributes)
 

非公開変数類

final LDAPConfig config
 
final Map< String, Object > connectionProperties
 

静的非公開変数類

static final Logger logger = Logger.getLogger(LDAPOperationManager.class)
 
static final Logger perfLogger = Logger.getLogger(LDAPOperationManager.class, "perf")
 

詳解

This class provides a set of operations to manage LDAP trees.

著者
Anil Saldhana
Pedro Silva

構築子と解体子

◆ LDAPOperationManager()

org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.LDAPOperationManager ( LDAPConfig  config) throws NamingException
inline
74  {
75  this.config = config;
76  this.connectionProperties = Collections.unmodifiableMap(createConnectionProperties());
77  }
Map< String, Object > createConnectionProperties()
Definition: LDAPOperationManager.java:649
final Map< String, Object > connectionProperties
Definition: LDAPOperationManager.java:72
final LDAPConfig config
Definition: LDAPOperationManager.java:71

関数詳解

◆ addAttribute()

void org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.addAttribute ( String  dn,
Attribute  attribute 
)
inline

Adds the given Attribute instance using the given DN. This method performs a ADD_ATTRIBUTE operation.

引数
dn
attribute
139  {
140  ModificationItem[] mods = new ModificationItem[]{new ModificationItem(DirContext.ADD_ATTRIBUTE, attribute)};
141  modifyAttributes(dn, mods, null);
142  }
void modifyAttributes(String dn, NamingEnumeration< Attribute > attributes)
Definition: LDAPOperationManager.java:102

◆ authenticate()

void org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.authenticate ( String  dn,
String  password 
) throws AuthenticationException
inline

Performs a simple authentication using the given DN and password to bind to the authentication context.

引数
dn
password
例外
AuthenticationExceptionif authentication is not successful
485  {
486  InitialContext authCtx = null;
487 
488  try {
489  if (password == null || password.isEmpty()) {
490  throw new AuthenticationException("Empty password used");
491  }
492 
493  Hashtable<String, Object> env = new Hashtable<String, Object>(this.connectionProperties);
494 
495  env.put(Context.SECURITY_AUTHENTICATION, LDAPConstants.AUTH_TYPE_SIMPLE);
496  env.put(Context.SECURITY_PRINCIPAL, dn);
497  env.put(Context.SECURITY_CREDENTIALS, password);
498 
499  // Never use connection pool to prevent password caching
500  env.put("com.sun.jndi.ldap.connect.pool", "false");
501 
502  authCtx = new InitialLdapContext(env, null);
503 
504  } catch (AuthenticationException ae) {
505  if (logger.isDebugEnabled()) {
506  logger.debugf(ae, "Authentication failed for DN [%s]", dn);
507  }
508 
509  throw ae;
510  } catch (Exception e) {
511  logger.errorf(e, "Unexpected exception when validating password of DN [%s]", dn);
512  throw new AuthenticationException("Unexpected exception when validating password of user");
513  } finally {
514  if (authCtx != null) {
515  try {
516  authCtx.close();
517  } catch (NamingException e) {
518 
519  }
520  }
521  }
522  }
final Map< String, Object > connectionProperties
Definition: LDAPOperationManager.java:72
static final Logger logger
Definition: LDAPOperationManager.java:67

◆ createConnectionProperties()

Map<String, Object> org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.createConnectionProperties ( )
inlineprivate
649  {
650  HashMap<String, Object> env = new HashMap<String, Object>();
651 
652  String authType = this.config.getAuthType();
653  env.put(Context.INITIAL_CONTEXT_FACTORY, this.config.getFactoryName());
654  env.put(Context.SECURITY_AUTHENTICATION, authType);
655 
656  String bindDN = this.config.getBindDN();
657 
658  char[] bindCredential = null;
659 
660  if (this.config.getBindCredential() != null) {
661  bindCredential = this.config.getBindCredential().toCharArray();
662  }
663 
664  if (!LDAPConstants.AUTH_TYPE_NONE.equals(authType)) {
665  env.put(Context.SECURITY_PRINCIPAL, bindDN);
666  env.put(Context.SECURITY_CREDENTIALS, bindCredential);
667  }
668 
669  String url = this.config.getConnectionUrl();
670 
671  if (url != null) {
672  env.put(Context.PROVIDER_URL, url);
673  } else {
674  logger.warn("LDAP URL is null. LDAPOperationManager won't work correctly");
675  }
676 
677  String useTruststoreSpi = this.config.getUseTruststoreSpi();
678  LDAPConstants.setTruststoreSpiIfNeeded(useTruststoreSpi, url, env);
679 
680  String connectionPooling = this.config.getConnectionPooling();
681  if (connectionPooling != null) {
682  env.put("com.sun.jndi.ldap.connect.pool", connectionPooling);
683  }
684 
685  String connectionTimeout = config.getConnectionTimeout();
686  if (connectionTimeout != null && !connectionTimeout.isEmpty()) {
687  env.put("com.sun.jndi.ldap.connect.timeout", connectionTimeout);
688  }
689 
690  String readTimeout = config.getReadTimeout();
691  if (readTimeout != null && !readTimeout.isEmpty()) {
692  env.put("com.sun.jndi.ldap.read.timeout", readTimeout);
693  }
694 
695  // Just dump the additional properties
696  Properties additionalProperties = this.config.getAdditionalConnectionProperties();
697  if (additionalProperties != null) {
698  for (Object key : additionalProperties.keySet()) {
699  env.put(key.toString(), additionalProperties.getProperty(key.toString()));
700  }
701  }
702 
703  StringBuilder binaryAttrsBuilder = new StringBuilder();
704  if (this.config.isObjectGUID()) {
705  binaryAttrsBuilder.append(LDAPConstants.OBJECT_GUID).append(" ");
706  }
707  for (String attrName : config.getBinaryAttributeNames()) {
708  binaryAttrsBuilder.append(attrName).append(" ");
709  }
710 
711  String binaryAttrs = binaryAttrsBuilder.toString().trim();
712  if (!binaryAttrs.isEmpty()) {
713  env.put("java.naming.ldap.attributes.binary", binaryAttrs);
714  }
715 
716  if (logger.isDebugEnabled()) {
717  Map<String, Object> copyEnv = new HashMap<>(env);
718  if (copyEnv.containsKey(Context.SECURITY_CREDENTIALS)) {
719  copyEnv.put(Context.SECURITY_CREDENTIALS, "**************************************");
720  }
721  logger.debugf("Creating LdapContext using properties: [%s]", copyEnv);
722  }
723 
724  return env;
725  }
Set< String > getBinaryAttributeNames()
Definition: LDAPConfig.java:235
String getBindCredential()
Definition: LDAPConfig.java:95
String getUseTruststoreSpi()
Definition: LDAPConfig.java:62
String getBindDN()
Definition: LDAPConfig.java:91
String getConnectionTimeout()
Definition: LDAPConfig.java:145
String getReadTimeout()
Definition: LDAPConfig.java:149
static final Logger logger
Definition: LDAPOperationManager.java:67
boolean isObjectGUID()
Definition: LDAPConfig.java:174
Properties getAdditionalConnectionProperties()
Definition: LDAPConfig.java:153
String getConnectionUrl()
Definition: LDAPConfig.java:44
final LDAPConfig config
Definition: LDAPOperationManager.java:71
String getConnectionPooling()
Definition: LDAPConfig.java:113
String getAuthType()
Definition: LDAPConfig.java:53

◆ createLdapContext()

LdapContext org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.createLdapContext ( ) throws NamingException
inlineprivate
645  {
646  return new InitialLdapContext(new Hashtable<Object, Object>(this.connectionProperties), null);
647  }
final Map< String, Object > connectionProperties
Definition: LDAPOperationManager.java:72

◆ createSubContext()

void org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.createSubContext ( final String  name,
final Attributes  attributes 
)
inline
573  {
574  try {
575  if (logger.isTraceEnabled()) {
576  logger.tracef("Creating entry [%s] with attributes: [", name);
577 
578  NamingEnumeration<? extends Attribute> all = attributes.getAll();
579 
580  while (all.hasMore()) {
581  Attribute attribute = all.next();
582 
583  String attrName = attribute.getID().toUpperCase();
584  Object attrVal = attribute.get();
585  if (attrName.contains("PASSWORD") || attrName.contains("UNICODEPWD")) {
586  attrVal = "********************";
587  }
588 
589  logger.tracef(" %s = %s", attribute.getID(), attrVal);
590  }
591 
592  logger.tracef("]");
593  }
594 
595  execute(new LdapOperation<Void>() {
596  @Override
597  public Void execute(LdapContext context) throws NamingException {
598  DirContext subcontext = context.createSubcontext(name, attributes);
599 
600  subcontext.close();
601 
602  return null;
603  }
604 
605 
606  @Override
607  public String toString() {
608  return new StringBuilder("LdapOperation: create\n")
609  .append(" dn: ").append(name).append("\n")
610  .append(" attributesSize: ").append(attributes.size())
611  .toString();
612  }
613 
614  });
615  } catch (NamingException e) {
616  throw new ModelException("Error creating subcontext [" + name + "]", e);
617  }
618  }
static final Logger logger
Definition: LDAPOperationManager.java:67
private< R > R execute(LdapOperation< R > operation)
Definition: LDAPOperationManager.java:727

◆ decodeEntryUUID()

String org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.decodeEntryUUID ( final Object  entryUUID)
inline
634  {
635  String id;
636  if (this.config.isObjectGUID() && entryUUID instanceof byte[]) {
637  id = LDAPUtil.decodeObjectGUID((byte[]) entryUUID);
638  } else {
639  id = entryUUID.toString();
640  }
641 
642  return id;
643  }
boolean isObjectGUID()
Definition: LDAPConfig.java:174
final LDAPConfig config
Definition: LDAPOperationManager.java:71

◆ destroySubcontext()

void org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.destroySubcontext ( LdapContext  context,
final String  dn 
)
inlineprivate

Destroys a subcontext with the given DN from the LDAP tree.

引数
dn
449  {
450  try {
451  NamingEnumeration<Binding> enumeration = null;
452 
453  try {
454  enumeration = context.listBindings(dn);
455 
456  while (enumeration.hasMore()) {
457  Binding binding = enumeration.next();
458  String name = binding.getNameInNamespace();
459 
460  destroySubcontext(context, name);
461  }
462 
463  context.unbind(dn);
464  } finally {
465  try {
466  enumeration.close();
467  } catch (Exception e) {
468  }
469  }
470  } catch (Exception e) {
471  throw new ModelException("Could not unbind DN [" + dn + "]", e);
472  }
473  }
void destroySubcontext(LdapContext context, final String dn)
Definition: LDAPOperationManager.java:449

◆ execute() [1/2]

private<R> R org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.execute ( LdapOperation< R >  operation) throws NamingException
inlinepackage
727  {
728  return execute(operation, null);
729  }
private< R > R execute(LdapOperation< R > operation)
Definition: LDAPOperationManager.java:727

◆ execute() [2/2]

private<R> R org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.execute ( LdapOperation< R >  operation,
LDAPOperationDecorator  decorator 
) throws NamingException
inlinepackage
731  {
732  LdapContext context = null;
733  Long start = null;
734 
735  try {
736  if (perfLogger.isDebugEnabled()) {
737  start = Time.currentTimeMillis();
738  }
739 
740  context = createLdapContext();
741  if (decorator != null) {
742  decorator.beforeLDAPOperation(context, operation);
743  }
744 
745  return operation.execute(context);
746  } finally {
747  if (context != null) {
748  try {
749  context.close();
750  } catch (NamingException ne) {
751  logger.error("Could not close Ldap context.", ne);
752  }
753  }
754 
755  if (perfLogger.isDebugEnabled()) {
756  long took = Time.currentTimeMillis() - start;
757 
758  if (took > 100) {
759  perfLogger.debugf("\n%s\ntook: %d ms\n", operation.toString(), took);
760  } else if (perfLogger.isTraceEnabled()) {
761  perfLogger.tracef("\n%s\ntook: %d ms\n", operation.toString(), took);
762  }
763  }
764  }
765  }
LdapContext createLdapContext()
Definition: LDAPOperationManager.java:645
static final Logger perfLogger
Definition: LDAPOperationManager.java:69
static final Logger logger
Definition: LDAPOperationManager.java:67

◆ findNextDNForFallback()

String org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.findNextDNForFallback ( String  newDn,
int  counter 
)
inlineprivate
235  {
236  LDAPDn dn = LDAPDn.fromString(newDn);
237  String rdnAttrName = dn.getFirstRdnAttrName();
238  String rdnAttrVal = dn.getFirstRdnAttrValue();
239  LDAPDn parentDn = dn.getParentDn();
240  parentDn.addFirst(rdnAttrName, rdnAttrVal + counter);
241  return parentDn.toString();
242  }

◆ getAttributes()

Attributes org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.getAttributes ( final String  entryUUID,
final String  baseDN,
Set< String >  returningAttributes 
)
inline
624  {
625  SearchResult search = lookupById(baseDN, entryUUID, returningAttributes);
626 
627  if (search == null) {
628  throw new ModelException("Couldn't find item with ID [" + entryUUID + " under base DN [" + baseDN + "]");
629  }
630 
631  return search.getAttributes();
632  }
SearchResult lookupById(final String baseDN, final String id, final Collection< String > returningAttributes)
Definition: LDAPOperationManager.java:400
List< SearchResult > search(final String baseDN, final String filter, Collection< String > returningAttributes, int searchScope)
Definition: LDAPOperationManager.java:245

◆ getFilterById()

String org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.getFilterById ( String  id)
inline
356  {
357  String filter = null;
358 
359  if (this.config.isObjectGUID()) {
360  final String strObjectGUID = "<GUID=" + id + ">";
361 
362  try {
363  Attributes attributes = execute(new LdapOperation<Attributes>() {
364 
365  @Override
366  public Attributes execute(LdapContext context) throws NamingException {
367  return context.getAttributes(strObjectGUID);
368  }
369 
370 
371  @Override
372  public String toString() {
373  return new StringBuilder("LdapOperation: GUIDResolve\n")
374  .append(" strObjectGUID: ").append(strObjectGUID)
375  .toString();
376  }
377 
378 
379  });
380 
381  byte[] objectGUID = (byte[]) attributes.get(LDAPConstants.OBJECT_GUID).get();
382 
383  filter = "(&(objectClass=*)(" + getUuidAttributeName() + LDAPConstants.EQUAL + LDAPUtil.convertObjectGUIToByteString(objectGUID) + "))";
384  } catch (NamingException ne) {
385  filter = null;
386  }
387  }
388 
389  if (filter == null) {
390  filter = "(&(objectClass=*)(" + getUuidAttributeName() + LDAPConstants.EQUAL + id + "))";
391  }
392 
393  if (logger.isTraceEnabled()) {
394  logger.tracef("Using filter for lookup user by LDAP ID: %s", filter);
395  }
396 
397  return filter;
398  }
static final Logger logger
Definition: LDAPOperationManager.java:67
boolean isObjectGUID()
Definition: LDAPConfig.java:174
private< R > R execute(LdapOperation< R > operation)
Definition: LDAPOperationManager.java:727
final LDAPConfig config
Definition: LDAPOperationManager.java:71
String getUuidAttributeName()
Definition: LDAPOperationManager.java:620

◆ getReturningAttributes()

Set<String> org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.getReturningAttributes ( final Collection< String >  returningAttributes)
inlineprivate
771  {
772  Set<String> result = new HashSet<String>();
773 
774  result.addAll(returningAttributes);
775  result.add(getUuidAttributeName());
776  result.add(LDAPConstants.OBJECT_CLASS);
777 
778  return result;
779  }
String getUuidAttributeName()
Definition: LDAPOperationManager.java:620

◆ getSearchControls()

SearchControls org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.getSearchControls ( Collection< String >  returningAttributes,
int  searchScope 
)
inlineprivate
344  {
345  final SearchControls cons = new SearchControls();
346 
347  cons.setSearchScope(searchScope);
348  cons.setReturningObjFlag(false);
349 
350  returningAttributes = getReturningAttributes(returningAttributes);
351 
352  cons.setReturningAttributes(returningAttributes.toArray(new String[returningAttributes.size()]));
353  return cons;
354  }
Set< String > getReturningAttributes(final Collection< String > returningAttributes)
Definition: LDAPOperationManager.java:771

◆ getUuidAttributeName()

String org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.getUuidAttributeName ( )
inlineprivate
620  {
621  return this.config.getUuidLDAPAttributeName();
622  }
String getUuidLDAPAttributeName()
Definition: LDAPConfig.java:163
final LDAPConfig config
Definition: LDAPOperationManager.java:71

◆ lookupById()

SearchResult org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.lookupById ( final String  baseDN,
final String  id,
final Collection< String >  returningAttributes 
)
inline
400  {
401  final String filter = getFilterById(id);
402 
403  try {
404  final SearchControls cons = getSearchControls(returningAttributes, this.config.getSearchScope());
405 
406  return execute(new LdapOperation<SearchResult>() {
407 
408  @Override
409  public SearchResult execute(LdapContext context) throws NamingException {
410  NamingEnumeration<SearchResult> search = context.search(baseDN, filter, cons);
411 
412  try {
413  if (search.hasMoreElements()) {
414  return search.next();
415  }
416  } finally {
417  if (search != null) {
418  search.close();
419  }
420  }
421 
422  return null;
423  }
424 
425 
426  @Override
427  public String toString() {
428  return new StringBuilder("LdapOperation: lookupById\n")
429  .append(" baseDN: ").append(baseDN).append("\n")
430  .append(" filter: ").append(filter).append("\n")
431  .append(" searchScope: ").append(cons.getSearchScope()).append("\n")
432  .append(" returningAttrs: ").append(returningAttributes)
433  .toString();
434  }
435 
436  });
437  } catch (NamingException e) {
438  throw new ModelException("Could not query server using DN [" + baseDN + "] and filter [" + filter + "]", e);
439  }
440  }
String getFilterById(String id)
Definition: LDAPOperationManager.java:356
SearchControls getSearchControls(Collection< String > returningAttributes, int searchScope)
Definition: LDAPOperationManager.java:344
private< R > R execute(LdapOperation< R > operation)
Definition: LDAPOperationManager.java:727
List< SearchResult > search(final String baseDN, final String filter, Collection< String > returningAttributes, int searchScope)
Definition: LDAPOperationManager.java:245
final LDAPConfig config
Definition: LDAPOperationManager.java:71
int getSearchScope()
Definition: LDAPConfig.java:158

◆ modifyAttribute()

void org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.modifyAttribute ( String  dn,
Attribute  attribute 
)
inline

Modifies the given javax.naming.directory.Attribute instance using the given DN. This method performs a REPLACE_ATTRIBUTE operation.

引数
dn
attribute
88  {
89  ModificationItem[] mods = new ModificationItem[]{new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attribute)};
90  modifyAttributes(dn, mods, null);
91  }
void modifyAttributes(String dn, NamingEnumeration< Attribute > attributes)
Definition: LDAPOperationManager.java:102

◆ modifyAttributes() [1/2]

void org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.modifyAttributes ( String  dn,
NamingEnumeration< Attribute >  attributes 
)
inline

Modifies the given Attribute instances using the given DN. This method performs a REPLACE_ATTRIBUTE operation.

引数
dn
attributes
102  {
103  try {
104  List<ModificationItem> modItems = new ArrayList<ModificationItem>();
105  while (attributes.hasMore()) {
106  ModificationItem modItem = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attributes.next());
107  modItems.add(modItem);
108  }
109 
110  modifyAttributes(dn, modItems.toArray(new ModificationItem[] {}), null);
111  } catch (NamingException ne) {
112  throw new ModelException("Could not modify attributes on entry from DN [" + dn + "]", ne);
113  }
114 
115  }
void modifyAttributes(String dn, NamingEnumeration< Attribute > attributes)
Definition: LDAPOperationManager.java:102

◆ modifyAttributes() [2/2]

void org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.modifyAttributes ( final String  dn,
final ModificationItem []  mods,
LDAPOperationDecorator  decorator 
)
inline
524  {
525  try {
526  if (logger.isTraceEnabled()) {
527  logger.tracef("Modifying attributes for entry [%s]: [", dn);
528 
529  for (ModificationItem item : mods) {
530  Object values;
531 
532  if (item.getAttribute().size() > 0) {
533  values = item.getAttribute().get();
534  } else {
535  values = "No values";
536  }
537 
538  String attrName = item.getAttribute().getID().toUpperCase();
539  if (attrName.contains("PASSWORD") || attrName.contains("UNICODEPWD")) {
540  values = "********************";
541  }
542 
543  logger.tracef(" Op [%s]: %s = %s", item.getModificationOp(), item.getAttribute().getID(), values);
544  }
545 
546  logger.tracef("]");
547  }
548 
549  execute(new LdapOperation<Void>() {
550 
551  @Override
552  public Void execute(LdapContext context) throws NamingException {
553  context.modifyAttributes(dn, mods);
554  return null;
555  }
556 
557 
558  @Override
559  public String toString() {
560  return new StringBuilder("LdapOperation: modify\n")
561  .append(" dn: ").append(dn).append("\n")
562  .append(" modificationsSize: ").append(mods.length)
563  .toString();
564  }
565 
566 
567  }, decorator);
568  } catch (NamingException e) {
569  throw new ModelException("Could not modify attribute for DN [" + dn + "]", e);
570  }
571  }
static final Logger logger
Definition: LDAPOperationManager.java:67
private< R > R execute(LdapOperation< R > operation)
Definition: LDAPOperationManager.java:727

◆ removeAttribute()

void org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.removeAttribute ( String  dn,
Attribute  attribute 
)
inline

Removes the given Attribute instance using the given DN. This method performs a REMOVE_ATTRIBUTE operation.

引数
dn
attribute
126  {
127  ModificationItem[] mods = new ModificationItem[]{new ModificationItem(DirContext.REMOVE_ATTRIBUTE, attribute)};
128  modifyAttributes(dn, mods, null);
129  }
void modifyAttributes(String dn, NamingEnumeration< Attribute > attributes)
Definition: LDAPOperationManager.java:102

◆ removeEntry()

void org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.removeEntry ( final String  entryDn)
inline

Removes the object from the LDAP tree

149  {
150  try {
151  execute(new LdapOperation<SearchResult>() {
152 
153  @Override
154  public SearchResult execute(LdapContext context) throws NamingException {
155  if (logger.isTraceEnabled()) {
156  logger.tracef("Removing entry with DN [%s]", entryDn);
157  }
158  destroySubcontext(context, entryDn);
159  return null;
160  }
161 
162 
163  @Override
164  public String toString() {
165  return new StringBuilder("LdapOperation: remove\n")
166  .append(" dn: ").append(entryDn)
167  .toString();
168  }
169 
170  });
171  } catch (NamingException e) {
172  throw new ModelException("Could not remove entry from DN [" + entryDn + "]", e);
173  }
174  }
static final Logger logger
Definition: LDAPOperationManager.java:67
private< R > R execute(LdapOperation< R > operation)
Definition: LDAPOperationManager.java:727
void destroySubcontext(LdapContext context, final String dn)
Definition: LDAPOperationManager.java:449

◆ renameEntry()

String org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.renameEntry ( String  oldDn,
String  newDn,
boolean  fallback 
)
inline

Rename LDAPObject name (DN)

引数
oldDn
newDn
fallbackWith fallback=true, we will try to find the another DN in case of conflict. For example if there is an attempt to rename to "CN=John Doe", but there is already existing "CN=John Doe", we will try "CN=John Doe0"
戻り値
the non-conflicting DN, which was used in the end
186  {
187  try {
188  String newNonConflictingDn = execute(new LdapOperation<String>() {
189 
190  @Override
191  public String execute(LdapContext context) throws NamingException {
192  String dn = newDn;
193 
194  // Max 5 attempts for now
195  int max = 5;
196  for (int i=0 ; i<max ; i++) {
197  try {
198  context.rename(oldDn, dn);
199  return dn;
200  } catch (NameAlreadyBoundException ex) {
201  if (!fallback) {
202  throw ex;
203  } else {
204  String failedDn = dn;
205  if (i<max) {
206  dn = findNextDNForFallback(newDn, i);
207  logger.warnf("Failed to rename DN [%s] to [%s]. Will try to fallback to DN [%s]", oldDn, failedDn, dn);
208  } else {
209  logger.warnf("Failed all fallbacks for renaming [%s]", oldDn);
210  throw ex;
211  }
212  }
213  }
214  }
215 
216  throw new ModelException("Could not rename entry from DN [" + oldDn + "] to new DN [" + newDn + "]. All fallbacks failed");
217  }
218 
219 
220  @Override
221  public String toString() {
222  return new StringBuilder("LdapOperation: renameEntry\n")
223  .append(" oldDn: ").append(oldDn).append("\n")
224  .append(" newDn: ").append(newDn)
225  .toString();
226  }
227 
228  });
229  return newNonConflictingDn;
230  } catch (NamingException e) {
231  throw new ModelException("Could not rename entry from DN [" + oldDn + "] to new DN [" + newDn + "]", e);
232  }
233  }
static final Logger logger
Definition: LDAPOperationManager.java:67
private< R > R execute(LdapOperation< R > operation)
Definition: LDAPOperationManager.java:727
String findNextDNForFallback(String newDn, int counter)
Definition: LDAPOperationManager.java:235

◆ search()

List<SearchResult> org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.search ( final String  baseDN,
final String  filter,
Collection< String >  returningAttributes,
int  searchScope 
) throws NamingException
inline
245  {
246  final List<SearchResult> result = new ArrayList<SearchResult>();
247  final SearchControls cons = getSearchControls(returningAttributes, searchScope);
248 
249  try {
250  return execute(new LdapOperation<List<SearchResult>>() {
251  @Override
252  public List<SearchResult> execute(LdapContext context) throws NamingException {
253  NamingEnumeration<SearchResult> search = context.search(baseDN, filter, cons);
254 
255  while (search.hasMoreElements()) {
256  result.add(search.nextElement());
257  }
258 
259  search.close();
260 
261  return result;
262  }
263 
264 
265  @Override
266  public String toString() {
267  return new StringBuilder("LdapOperation: search\n")
268  .append(" baseDn: ").append(baseDN).append("\n")
269  .append(" filter: ").append(filter).append("\n")
270  .append(" searchScope: ").append(searchScope).append("\n")
271  .append(" returningAttrs: ").append(returningAttributes).append("\n")
272  .append(" resultSize: ").append(result.size())
273  .toString();
274  }
275 
276 
277  });
278  } catch (NamingException e) {
279  logger.errorf(e, "Could not query server using DN [%s] and filter [%s]", baseDN, filter);
280  throw e;
281  }
282  }
SearchControls getSearchControls(Collection< String > returningAttributes, int searchScope)
Definition: LDAPOperationManager.java:344
static final Logger logger
Definition: LDAPOperationManager.java:67
private< R > R execute(LdapOperation< R > operation)
Definition: LDAPOperationManager.java:727
List< SearchResult > search(final String baseDN, final String filter, Collection< String > returningAttributes, int searchScope)
Definition: LDAPOperationManager.java:245

◆ searchPaginated()

List<SearchResult> org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.searchPaginated ( final String  baseDN,
final String  filter,
final LDAPQuery  identityQuery 
) throws NamingException
inline
284  {
285  final List<SearchResult> result = new ArrayList<SearchResult>();
286  final SearchControls cons = getSearchControls(identityQuery.getReturningLdapAttributes(), identityQuery.getSearchScope());
287 
288  try {
289  return execute(new LdapOperation<List<SearchResult>>() {
290 
291  @Override
292  public List<SearchResult> execute(LdapContext context) throws NamingException {
293  try {
294  byte[] cookie = identityQuery.getPaginationContext();
295  PagedResultsControl pagedControls = new PagedResultsControl(identityQuery.getLimit(), cookie, Control.CRITICAL);
296  context.setRequestControls(new Control[] { pagedControls });
297 
298  NamingEnumeration<SearchResult> search = context.search(baseDN, filter, cons);
299 
300  while (search.hasMoreElements()) {
301  result.add(search.nextElement());
302  }
303 
304  search.close();
305 
306  Control[] responseControls = context.getResponseControls();
307  if (responseControls != null) {
308  for (Control respControl : responseControls) {
309  if (respControl instanceof PagedResultsResponseControl) {
310  PagedResultsResponseControl prrc = (PagedResultsResponseControl)respControl;
311  cookie = prrc.getCookie();
312  identityQuery.setPaginationContext(cookie);
313  }
314  }
315  }
316 
317  return result;
318  } catch (IOException ioe) {
319  logger.errorf(ioe, "Could not query server with paginated query using DN [%s], filter [%s]", baseDN, filter);
320  throw new NamingException(ioe.getMessage());
321  }
322  }
323 
324 
325  @Override
326  public String toString() {
327  return new StringBuilder("LdapOperation: searchPaginated\n")
328  .append(" baseDn: ").append(baseDN).append("\n")
329  .append(" filter: ").append(filter).append("\n")
330  .append(" searchScope: ").append(identityQuery.getSearchScope()).append("\n")
331  .append(" returningAttrs: ").append(identityQuery.getReturningLdapAttributes()).append("\n")
332  .append(" limit: ").append(identityQuery.getLimit()).append("\n")
333  .append(" resultSize: ").append(result.size())
334  .toString();
335  }
336 
337  });
338  } catch (NamingException e) {
339  logger.errorf(e, "Could not query server using DN [%s] and filter [%s]", baseDN, filter);
340  throw e;
341  }
342  }
SearchControls getSearchControls(Collection< String > returningAttributes, int searchScope)
Definition: LDAPOperationManager.java:344
static final Logger logger
Definition: LDAPOperationManager.java:67
private< R > R execute(LdapOperation< R > operation)
Definition: LDAPOperationManager.java:727
List< SearchResult > search(final String baseDN, final String filter, Collection< String > returningAttributes, int searchScope)
Definition: LDAPOperationManager.java:245

メンバ詳解

◆ config

final LDAPConfig org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.config
private

◆ connectionProperties

final Map<String, Object> org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.connectionProperties
private

◆ logger

final Logger org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.logger = Logger.getLogger(LDAPOperationManager.class)
staticprivate

◆ perfLogger

final Logger org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.perfLogger = Logger.getLogger(LDAPOperationManager.class, "perf")
staticprivate

このクラス詳解は次のファイルから抽出されました: