opendj-server-legacy/src/main/java/org/opends/server/extensions/SubjectAttributeToUserAttributeCertificateMapper.java
@@ -77,8 +77,6 @@ { private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass(); /** The DN of the configuration entry for this certificate mapper. */ private DN configEntryDN; /** The mappings between certificate attribute names and user attribute types. */ private LinkedHashMap<String,AttributeType> attributeMap; /** The current configuration for this certificate mapper. */ @@ -86,7 +84,6 @@ /** The set of attributes to return in search result entries. */ private LinkedHashSet<String> requestedAttributes; /** * Creates a new instance of this certificate mapper. Note that all actual * initialization should be done in the @@ -97,9 +94,6 @@ super(); } /** {@inheritDoc} */ @Override public void initializeCertificateMapper( SubjectAttributeToUserAttributeCertificateMapperCfg configuration) @@ -108,11 +102,10 @@ configuration.addSubjectAttributeToUserAttributeChangeListener(this); currentConfig = configuration; configEntryDN = configuration.dn(); // Get and validate the subject attribute to user attribute mappings. ConfigChangeResult ccr = new ConfigChangeResult(); attributeMap = buildAttributeMap(configuration, configEntryDN, ccr); attributeMap = buildAttributeMap(configuration, ccr); List<LocalizableMessage> messages = ccr.getMessages(); if (!messages.isEmpty()) { @@ -140,16 +133,12 @@ requestedAttributes = newLinkedHashSet("*", "+"); } /** {@inheritDoc} */ @Override public void finalizeCertificateMapper() { currentConfig.removeSubjectAttributeToUserAttributeChangeListener(this); } /** {@inheritDoc} */ @Override public Entry mapCertificateToUser(Certificate[] certificateChain) throws DirectoryException @@ -157,7 +146,6 @@ SubjectAttributeToUserAttributeCertificateMapperCfg config = currentConfig; LinkedHashMap<String,AttributeType> theAttributeMap = this.attributeMap; // Make sure that a peer certificate was provided. if (certificateChain == null || certificateChain.length == 0) { @@ -165,14 +153,13 @@ throw new DirectoryException(ResultCode.INVALID_CREDENTIALS, message); } // Get the first certificate in the chain. It must be an X.509 certificate. X509Certificate peerCertificate; try { peerCertificate = (X509Certificate) certificateChain[0]; } catch (Exception e) catch (ClassCastException e) { logger.traceException(e); @@ -180,9 +167,7 @@ throw new DirectoryException(ResultCode.INVALID_CREDENTIALS, message); } // Get the subject from the peer certificate and use it to create a search // filter. // Get the subject from the peer certificate and use it to create a search filter DN peerDN; X500Principal peerPrincipal = peerCertificate.getSubjectX500Principal(); String peerName = peerPrincipal.getName(X500Principal.RFC2253); @@ -202,11 +187,7 @@ { for (AVA ava : rdn) { String lowerName = toLowerCase(ava.getAttributeName()); // Try to normalize lowerName lowerName = normalizeAttributeName(lowerName); String lowerName = normalizeAttributeName(ava.getAttributeName()); AttributeType attrType = theAttributeMap.get(lowerName); if (attrType != null) { @@ -278,13 +259,10 @@ } } // If we've gotten here, then we either found exactly one user entry or we // didn't find any. Either way, return the entry or null to the caller. // We either found exactly one user entry or we did not find any. return userEntry; } /** {@inheritDoc} */ @Override public boolean isConfigurationAcceptable(CertificateMapperCfg configuration, List<LocalizableMessage> unacceptableReasons) @@ -294,26 +272,22 @@ return isConfigurationChangeAcceptable(config, unacceptableReasons); } /** {@inheritDoc} */ @Override public boolean isConfigurationChangeAcceptable( SubjectAttributeToUserAttributeCertificateMapperCfg configuration, List<LocalizableMessage> unacceptableReasons) { ConfigChangeResult ccr = new ConfigChangeResult(); buildAttributeMap(configuration, configuration.dn(), ccr); buildAttributeMap(configuration, ccr); unacceptableReasons.addAll(ccr.getMessages()); return ResultCode.SUCCESS.equals(ccr.getResultCode()); } /** {@inheritDoc} */ @Override public ConfigChangeResult applyConfigurationChange(SubjectAttributeToUserAttributeCertificateMapperCfg configuration) { final ConfigChangeResult ccr = new ConfigChangeResult(); LinkedHashMap<String, AttributeType> newAttributeMap = buildAttributeMap(configuration, configEntryDN, ccr); LinkedHashMap<String, AttributeType> newAttributeMap = buildAttributeMap(configuration, ccr); // Make sure that all the user attributes are configured with equality // indexes in all appropriate backends. @@ -358,17 +332,17 @@ /** Get and validate the subject attribute to user attribute mappings. */ private LinkedHashMap<String, AttributeType> buildAttributeMap( SubjectAttributeToUserAttributeCertificateMapperCfg configuration, DN cfgEntryDN, ConfigChangeResult ccr) SubjectAttributeToUserAttributeCertificateMapperCfg cfg, ConfigChangeResult ccr) { LinkedHashMap<String, AttributeType> results = new LinkedHashMap<>(); for (String mapStr : configuration.getSubjectAttributeMapping()) for (String mapStr : cfg.getSubjectAttributeMapping()) { String lowerMap = toLowerCase(mapStr); int colonPos = lowerMap.indexOf(':'); if (colonPos <= 0) { ccr.setResultCodeIfSuccess(ResultCode.CONSTRAINT_VIOLATION); ccr.addMessage(ERR_SATUACM_INVALID_MAP_FORMAT.get(cfgEntryDN, mapStr)); ccr.addMessage(ERR_SATUACM_INVALID_MAP_FORMAT.get(cfg.dn(), mapStr)); return null; } @@ -377,7 +351,7 @@ if (certAttrName.length() == 0 || userAttrName.length() == 0) { ccr.setResultCodeIfSuccess(ResultCode.CONSTRAINT_VIOLATION); ccr.addMessage(ERR_SATUACM_INVALID_MAP_FORMAT.get(cfgEntryDN, mapStr)); ccr.addMessage(ERR_SATUACM_INVALID_MAP_FORMAT.get(cfg.dn(), mapStr)); return null; } @@ -386,7 +360,7 @@ if (results.containsKey(certAttrName)) { ccr.setResultCodeIfSuccess(ResultCode.CONSTRAINT_VIOLATION); ccr.addMessage(ERR_SATUACM_DUPLICATE_CERT_ATTR.get(cfgEntryDN, certAttrName)); ccr.addMessage(ERR_SATUACM_DUPLICATE_CERT_ATTR.get(cfg.dn(), certAttrName)); return null; } @@ -394,13 +368,13 @@ if (userAttrType.isPlaceHolder()) { ccr.setResultCodeIfSuccess(ResultCode.CONSTRAINT_VIOLATION); ccr.addMessage(ERR_SATUACM_NO_SUCH_ATTR.get(mapStr, cfgEntryDN, userAttrName)); ccr.addMessage(ERR_SATUACM_NO_SUCH_ATTR.get(mapStr, cfg.dn(), userAttrName)); return null; } if (results.values().contains(userAttrType)) { ccr.setResultCodeIfSuccess(ResultCode.CONSTRAINT_VIOLATION); ccr.addMessage(ERR_SATUACM_DUPLICATE_USER_ATTR.get(cfgEntryDN, userAttrType.getNameOrOID())); ccr.addMessage(ERR_SATUACM_DUPLICATE_USER_ATTR.get(cfg.dn(), userAttrType.getNameOrOID())); return null; } @@ -409,18 +383,8 @@ return results; } /** * Normalizes the given attribute name; if normalization is not * possible the original String value is returned. * * @param attrName The attribute name which should be normalized. * @return The normalized attribute name. */ private static String normalizeAttributeName(String attrName) { AttributeType attrType = DirectoryServer.getAttributeType(attrName); return attrType.isPlaceHolder() ? attrName : attrType.getNormalizedNameOrOID(); return toLowerCase(DirectoryServer.getAttributeType(attrName).getNameOrOID()); } } opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskEntry.java
@@ -16,31 +16,31 @@ */ package org.opends.server.tools.tasks; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.opendj.ldap.ByteString; import org.forgerock.opendj.ldap.schema.AttributeType; import org.opends.server.backends.task.FailedDependencyAction; import org.opends.server.backends.task.Task; import org.opends.server.backends.task.TaskState; import org.opends.server.types.Attribute; import org.forgerock.opendj.ldap.DN; import org.opends.server.types.Entry; import static org.opends.server.util.ServerConstants.*; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TimeZone; import java.lang.reflect.Method; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import static org.opends.server.util.ServerConstants.*; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.opendj.ldap.ByteString; import org.forgerock.opendj.ldap.DN; import org.forgerock.opendj.ldap.schema.AttributeType; import org.opends.server.backends.task.FailedDependencyAction; import org.opends.server.backends.task.Task; import org.opends.server.backends.task.TaskState; import org.opends.server.core.DirectoryServer; import org.opends.server.types.Attribute; import org.opends.server.types.Entry; import org.opends.server.types.ObjectClass; import org.opends.server.util.StaticUtils; /** * Processes information from a task entry from the directory and @@ -54,27 +54,6 @@ private int hashCode; /** * These attributes associated with the ds-task object * class are all handled explicitly below in the constructor. */ private static Set<String> supAttrNames = new HashSet<>(); static { supAttrNames.add("ds-task-id"); supAttrNames.add("ds-task-class-name"); supAttrNames.add("ds-task-state"); supAttrNames.add("ds-task-scheduled-start-time"); supAttrNames.add("ds-task-actual-start-time"); supAttrNames.add("ds-task-completion-time"); supAttrNames.add("ds-task-dependency-id"); supAttrNames.add("ds-task-failed-dependency-action"); supAttrNames.add("ds-task-log-message"); supAttrNames.add("ds-task-notify-on-completion"); supAttrNames.add("ds-task-notify-on-error"); supAttrNames.add("ds-recurring-task-id"); supAttrNames.add("ds-recurring-task-schedule"); } private String id; private String className; private String state; @@ -119,17 +98,12 @@ notifyComp = getMultiStringValue(entry, p + "notify-on-completion"); schedTab = getSingleStringValue(entry, "ds-recurring-task-schedule"); // Build a map of non-superior attribute value pairs for display Map<AttributeType, List<Attribute>> attrMap = entry.getUserAttributes(); for (AttributeType type : attrMap.keySet()) { String typeName = type.getNormalizedNameOrOID(); // See if we've handled it already above if (!supAttrNames.contains(typeName)) { LocalizableMessage attrTypeName = getAttributeDisplayName(typeName); List<Attribute> attrList = entry.getUserAttribute(type); for (Attribute attr : attrList) { final ObjectClass dsTask = DirectoryServer.getObjectClass("ds-task"); final ObjectClass dsRecurringTask = DirectoryServer.getObjectClass("ds-recurring-task"); for (AttributeType attrType : entry.getUserAttributes().keySet()) { if (!dsTask.isRequiredOrOptional(attrType) && !dsRecurringTask.isRequiredOrOptional(attrType)) { LocalizableMessage attrTypeName = getAttributeDisplayName(attrType); for (Attribute attr : entry.getUserAttribute(attrType)) { for (ByteString av : attr) { List<String> valueList = taskSpecificAttrValues.get(attrTypeName); if (valueList == null) { @@ -156,18 +130,12 @@ hashCode += taskSpecificAttrValues.hashCode(); } /** * Retrieves a hash code for this task entry. * * @return The hash code for this task entry. */ @Override public int hashCode() { return hashCode; } /** {@inheritDoc} */ @Override public boolean equals(Object o) { @@ -175,12 +143,6 @@ { return true; } if (o == null) { return false; } if (! (o instanceof TaskEntry)) { return false; @@ -440,16 +402,15 @@ return valuesList; } private LocalizableMessage getAttributeDisplayName(String attrName) { private LocalizableMessage getAttributeDisplayName(AttributeType attrType) { final String attrName = StaticUtils.toLowerCase(attrType.getNameOrOID()); LocalizableMessage name = mapAttrToDisplayName.get(attrName); if (name == null) { Task task = getTask(); if (task != null) { try { Method m = Task.class.getMethod( "getAttributeDisplayName", String.class); Object o = m.invoke(task, attrName); if (o != null && LocalizableMessage.class.isAssignableFrom(o.getClass())) { Object o = task.getAttributeDisplayName(attrName); if (o instanceof LocalizableMessage) { name= (LocalizableMessage)o; mapAttrToDisplayName.put(attrName, name); } @@ -507,5 +468,4 @@ } return task; } } opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java
@@ -22,7 +22,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -2818,20 +2817,20 @@ // Get collective attribute exclusions. AttributeType exclusionsType = DirectoryServer.getAttributeType(ATTR_COLLECTIVE_EXCLUSIONS_LC); List<Attribute> exclusionsAttrList = operationalAttributes.get(exclusionsType); Set<String> exclusionsNameSet = new HashSet<>(); List<String> excludedAttrNames = new ArrayList<>(); if (exclusionsAttrList != null && !exclusionsAttrList.isEmpty()) { for (Attribute attr : exclusionsAttrList) { for (ByteString attrValue : attr) { String exclusionsName = attrValue.toString().toLowerCase(); if (VALUE_COLLECTIVE_EXCLUSIONS_EXCLUDE_ALL_LC.equals(exclusionsName) || OID_COLLECTIVE_EXCLUSIONS_EXCLUDE_ALL.equals(exclusionsName)) String excludedAttrName = attrValue.toString().toLowerCase(); if (VALUE_COLLECTIVE_EXCLUSIONS_EXCLUDE_ALL_LC.equals(excludedAttrName) || OID_COLLECTIVE_EXCLUSIONS_EXCLUDE_ALL.equals(excludedAttrName)) { return; } exclusionsNameSet.add(exclusionsName); excludedAttrNames.add(excludedAttrName); } } } @@ -2914,7 +2913,7 @@ for (Attribute collectiveAttr : collectiveAttrList) { AttributeType attributeType = collectiveAttr.getAttributeDescription().getAttributeType(); if (exclusionsNameSet.contains(attributeType.getNormalizedNameOrOID())) if (hasAnyNameOrOID(attributeType, excludedAttrNames)) { continue; } @@ -2961,6 +2960,18 @@ } } private boolean hasAnyNameOrOID(AttributeType attributeType, Collection<String> attrNames) { for (String attrName : attrNames) { if (attributeType.hasNameOrOID(attrName)) { return true; } } return false; } private ByteString normalize(MatchingRule matchingRule, ByteString value) throws DirectoryException { opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/HistoricalTest.java
@@ -340,7 +340,7 @@ private static void publishModify(ReplicationBroker broker, CSN changeNum, DN dn, String entryuuid, AttributeType attrType, String newValue) { Attribute attr = Attributes.create(attrType.getNormalizedNameOrOID(), newValue); Attribute attr = Attributes.create(attrType, newValue); List<Modification> mods = newArrayList(new Modification(ModificationType.ADD, attr)); broker.publish(new ModifyMsg(changeNum, dn, mods, entryuuid)); }