mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Matthew Swift
03.07.2014 0550522c1525631233e9f268792ac19813f21bb4
Additional fix for OPENDJ-1361: Matching Rules and Syntaxes have a reference to a schema that can be changed, leading to unexpected behavior

* SchemaBuilder: use Reject for ensuring that matching rules and syntaxes have not already been validated when they are added to a schema builder
* Syntax: inherit matching rules from default syntax
* SyntaxTestCase: remove invalid testCreatesEmptySyntax() test, add two tests for default syntax substitution.
3 files modified
51 ■■■■ changed files
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java 4 ●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java 8 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java 39 ●●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
@@ -2712,7 +2712,8 @@
    }
    SchemaBuilder addMatchingRule(final MatchingRule rule, final boolean overwrite) {
        assert !rule.isValidated() : "Matching rule has already been validated, it can't be added";
        Reject.ifTrue(rule.isValidated(),
                "Matching rule has already been validated, it can't be added");
        MatchingRule conflictingRule;
        if (numericOID2MatchingRules.containsKey(rule.getOID())) {
            conflictingRule = numericOID2MatchingRules.get(rule.getOID());
@@ -2848,6 +2849,7 @@
    }
    SchemaBuilder addSyntax(final Syntax syntax, final boolean overwrite) {
        Reject.ifTrue(syntax.isValidated(), "Syntax has already been validated, it can't be added");
        Syntax conflictingSyntax;
        if (numericOID2Syntaxes.containsKey(syntax.getOID())) {
            conflictingSyntax = numericOID2Syntaxes.get(syntax.getOID());
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java
@@ -201,7 +201,13 @@
        Reject.ifNull(oid);
        this.oid = oid;
        this.schema = schema;
        this.impl = schema.getDefaultSyntax().impl;
        final Syntax defaultSyntax = schema.getDefaultSyntax();
        this.impl = defaultSyntax.impl;
        this.approximateMatchingRule = defaultSyntax.getApproximateMatchingRule();
        this.equalityMatchingRule = defaultSyntax.getEqualityMatchingRule();
        this.orderingMatchingRule = defaultSyntax.getOrderingMatchingRule();
        this.substringMatchingRule = defaultSyntax.getSubstringMatchingRule();
    }
    /**
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java
@@ -66,24 +66,41 @@
    }
    /**
     * Creates an empty syntax.
     * Tests that unrecognized syntaxes are automatically substituted with the
     * default syntax during building.
     */
    @Test()
    public final void testCreatesEmptySyntax() {
        final SchemaBuilder sb = new SchemaBuilder();
        sb.addSchema(Schema.getCoreSchema(), false);
        sb.addSyntax(new Syntax(Schema.getEmptySchema(), "1.2.3.4.5"), false);
    @Test
    public final void testBuilderSubstitutesUnknownSyntaxWithDefaultSyntax() {
        final SchemaBuilder sb = new SchemaBuilder(Schema.getCoreSchema());
        sb.buildSyntax("1.2.3.4.5").addToSchema();
        final Schema schema = sb.toSchema();
        assertThat(schema.getWarnings()).isEmpty();
        assertThat(schema.getWarnings()).hasSize(1);
        final Syntax syntax = schema.getSyntax("1.2.3.4.5");
        assertThat(syntax).isNotNull();
        assertThat(syntax.getDescription()).isEmpty();
        assertThat(syntax.getExtraProperties().get("X-SUBST").get(0)).isEqualTo("1.3.6.1.4.1.1466.115.121.1.40");
        assertThat(syntax.getApproximateMatchingRule()).isNull();
        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo(
                "octetStringOrderingMatch");
        assertThat(syntax.getSubstringMatchingRule()).isNull();
    }
    /**
     * Tests that unrecognized syntaxes are automatically substituted with the
     * default syntax and matching rule.
     */
    @Test()
    public final void testDefaultSyntaxSubstitution() {
        final Syntax syntax = Schema.getCoreSchema().getSyntax("1.2.3.4.5");
        assertThat(syntax).isNotNull();
        assertThat(syntax.getDescription()).isEmpty();
        // Dynamically created syntaxes include the X-SUBST extension.
        assertThat(syntax.getExtraProperties().get("X-SUBST").get(0)).isEqualTo(
                "1.3.6.1.4.1.1466.115.121.1.40");
        assertThat(syntax.getApproximateMatchingRule()).isNull();
        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo(
                "octetStringOrderingMatch");
        assertThat(syntax.getSubstringMatchingRule()).isNull();
    }