SevenBitCleanPlugin.java revision b527ea7303ceca17afba69b6081e0a5811403707
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at legal-notices/CDDLv1_0.txt.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2008 Sun Microsystems, Inc.
* Portions Copyright 2014-2015 ForgeRock AS
*/
/**
* This class implements a Directory Server plugin that can be used to ensure
* that the values for a specified set of attributes (optionally, below a
* specified set of base DNs) are 7-bit clean (i.e., contain only ASCII
* characters).
*/
public final class SevenBitCleanPlugin
implements ConfigurationChangeListener<SevenBitCleanPluginCfg>
{
/** The bitmask that will be used to make the comparisons. */
private static final byte MASK = 0x7F;
/** The current configuration for this plugin. */
private SevenBitCleanPluginCfg currentConfig;
/**
* Creates a new instance of this Directory Server plugin. Every plugin must
* implement a default constructor (it is the only one that will be used to
* create plugins defined in the configuration), and every plugin constructor
* must call {@code super()} as its first element.
*/
public SevenBitCleanPlugin()
{
super();
}
/** {@inheritDoc} */
throws ConfigException
{
// Make sure that the plugin has been enabled for the appropriate types.
for (PluginType t : pluginTypes)
{
switch (t)
{
case LDIF_IMPORT:
case PRE_PARSE_ADD:
case PRE_PARSE_MODIFY:
case PRE_PARSE_MODIFY_DN:
// These are acceptable.
break;
default:
}
}
}
/** {@inheritDoc} */
public final void finalizePlugin()
{
}
/** {@inheritDoc} */
public final PluginResult.ImportLDIF
{
// Get the current configuration for this plugin.
// Make sure that the entry is within the scope of this plugin. While
// processing an LDIF import, we don't have access to the set of public
// naming contexts defined in the server, so if no explicit set of base DNs
// is defined, then assume that the entry is in scope.
{
// The entry is out of scope, so we won't process it.
}
// Make sure all configured attributes have clean values.
{
{
{
for (ByteString v : a)
{
if (!is7BitClean(v))
{
}
}
}
}
}
// If we've gotten here, then everything is acceptable.
}
/** {@inheritDoc} */
public final PluginResult.PreParse
{
// Get the current configuration for this plugin.
// If the entry is within the scope of this plugin, then make sure all
// configured attributes have clean values.
try
{
}
catch (DirectoryException de)
{
}
{
{
Attribute a;
try
{
a = rawAttr.toAttribute();
}
catch (LDAPException le)
{
}
{
continue;
}
for (ByteString v : a)
{
if (!is7BitClean(v))
{
rawAttr.getAttributeType()));
}
}
}
}
// If we've gotten here, then everything is acceptable.
}
/** {@inheritDoc} */
public final PluginResult.PreParse
{
// Get the current configuration for this plugin.
// If the target entry is within the scope of this plugin, then make sure
// all values that will be added during the modification will be acceptable.
try
{
}
catch (DirectoryException de)
{
}
{
{
switch (m.getModificationType().asEnum())
{
case ADD:
case REPLACE:
// These are modification types that we will process.
break;
default:
// This is not a modification type that we will process.
continue;
}
Attribute a;
try
{
a = rawAttr.toAttribute();
}
catch (LDAPException le)
{
}
{
continue;
}
for (ByteString v : a)
{
if (!is7BitClean(v))
{
rawAttr.getAttributeType()));
}
}
}
}
// If we've gotten here, then everything is acceptable.
}
/** {@inheritDoc} */
public final PluginResult.PreParse
{
// Get the current configuration for this plugin.
// If the target entry is within the scope of this plugin, then make sure
// all values that will be added during the modification will be acceptable.
try
{
}
catch (DirectoryException de)
{
}
{
try
{
}
catch (DirectoryException de)
{
}
for (int i=0; i < numValues; i++)
{
{
continue;
}
{
newRDN.getAttributeName(i)));
}
}
}
// If we've gotten here, then everything is acceptable.
}
/**
* Indicates whether the provided DN is within the scope of this plugin.
*
* @param config The configuration to use when making the determination.
* @param dn The DN for which to make the determination.
*
* @return {@code true} if the provided DN is within the scope of this
* plugin, or {@code false} if not.
*/
{
{
}
}
{
{
{
{
return true;
}
}
}
return false;
}
/**
* Indicates whether the provided value is 7-bit clean.
*
* @param value The value for which to make the determination.
*
* @return {@code true} if the provided value is 7-bit clean, or {@code false}
* if it is not.
*/
{
{
if ((b & MASK) != b)
{
return false;
}
}
return true;
}
/** {@inheritDoc} */
{
}
/** {@inheritDoc} */
public boolean isConfigurationChangeAcceptable(
{
boolean configAcceptable = true;
// Ensure that the set of plugin types is acceptable.
{
switch (pluginType)
{
case LDIFIMPORT:
case PREPARSEADD:
case PREPARSEMODIFY:
case PREPARSEMODIFYDN:
// These are acceptable.
break;
default:
configAcceptable = false;
}
}
return configAcceptable;
}
/** {@inheritDoc} */
{
return new ConfigChangeResult();
}
}