directory-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Emmanuel L├ęcharny (Jira) <j...@apache.org>
Subject [jira] [Commented] (DIRSERVER-2308) Moddn overrides existing entry
Date Mon, 04 May 2020 07:40:00 GMT

    [ https://issues.apache.org/jira/browse/DIRSERVER-2308?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17098746#comment-17098746
] 

Emmanuel L├ęcharny commented on DIRSERVER-2308:
----------------------------------------------

Confirmed. If we have a new superior (even if it's the same... That could be optimized as
a simple rename operation), then we don't check the existence of the target entry, leading
to the problem.

{code:java}
    /**
     * {@inheritDoc}
     */
    @Override
    public void moveAndRename( MoveAndRenameOperationContext moveAndRenameContext ) throws
LdapException
    {
        Dn oldDn = moveAndRenameContext.getDn();

        // Don't allow M&R in the SSSE
        if ( oldDn.getNormName().equals( subschemSubentryDn.getNormName() ) )
        {
            throw new LdapUnwillingToPerformException( ResultCodeEnum.UNWILLING_TO_PERFORM,
I18n.err( I18n.ERR_258,
                subschemSubentryDn, subschemSubentryDn ) );
        }

// SOME CHECK IS MISSING HERE....
        
        // Remove the original entry from the NotAlias cache, if needed
        synchronized ( notAliasCache )
        {
            if ( notAliasCache.containsKey( oldDn.getNormName() ) )
            {
                notAliasCache.remove( oldDn.getNormName() );
            }
        }

        next( moveAndRenameContext );
    }
{code}


Here is the fix :

{code:java}
    /**
     * {@inheritDoc}
     */
    @Override
    public void moveAndRename( MoveAndRenameOperationContext moveAndRenameContext ) throws
LdapException
    {
        Dn oldDn = moveAndRenameContext.getDn();

        // Don't allow M&R in the SSSE
        if ( oldDn.getNormName().equals( subschemSubentryDn.getNormName() ) )
        {
            throw new LdapUnwillingToPerformException( ResultCodeEnum.UNWILLING_TO_PERFORM,
I18n.err( I18n.ERR_258,
                subschemSubentryDn, subschemSubentryDn ) );
        }
        
        // check to see if target entry exists
        Dn newDn = moveAndRenameContext.getNewDn();

        HasEntryOperationContext hasEntryContext = new HasEntryOperationContext( moveAndRenameContext.getSession(),
newDn );
        hasEntryContext.setPartition( moveAndRenameContext.getPartition() );
        hasEntryContext.setTransaction( moveAndRenameContext.getTransaction() );

        if ( nexus.hasEntry( hasEntryContext ) )
        {
            // Ok, the target entry already exists.
            // If the target entry has the same name than the modified entry, it's a rename
on itself,
            // we want to allow this.
            if ( !newDn.equals( oldDn ) )
            {
                throw new LdapEntryAlreadyExistsException( I18n.err( I18n.ERR_250_ENTRY_ALREADY_EXISTS,
newDn.getName() ) );
            }
        }

        // Remove the original entry from the NotAlias cache, if needed
        synchronized ( notAliasCache )
        {
            if ( notAliasCache.containsKey( oldDn.getNormName() ) )
            {
                notAliasCache.remove( oldDn.getNormName() );
            }
        }

        next( moveAndRenameContext );
    }

{code}

> Moddn overrides existing entry
> ------------------------------
>
>                 Key: DIRSERVER-2308
>                 URL: https://issues.apache.org/jira/browse/DIRSERVER-2308
>             Project: Directory ApacheDS
>          Issue Type: Bug
>          Components: ldap
>    Affects Versions: 2.0.0.AM26
>            Reporter: Stefan Seelmann
>            Priority: Major
>             Fix For: 2.0.0.AM27
>
>
> Moddn operation where the new DN matches an already existing entry overrides that entry
> {noformat}
> dn: uid=bar,dc=example,dc=com
> changetype: add
> objectClass: inetOrgPerson
> objectClass: organizationalPerson
> objectClass: person
> objectClass: top
> uid: bar
> cn: bar
> sn: bar
> dn: uid=foo,dc=example,dc=com
> changetype: add
> objectClass: inetOrgPerson
> objectClass: organizationalPerson
> objectClass: person
> objectClass: top
> uid: foo
> cn: foo
> sn: foo
> dn: uid=bar,dc=example,dc=com
> changetype: moddn
> newrdn: uid=foo
> deleteoldrdn: 1
> newsuperior: dc=example,dc=com
> {noformat}
> Result is that uid=bar is gone and uid=foo has attributes of bar.
> {noformat}
> dn: uid=foo,dc=example,dc=com
> objectClass: inetOrgPerson
> objectClass: organizationalPerson
> objectClass: person
> objectClass: top
> cn: bar
> sn: bar
> uid: foo
> {noformat}
> Expected: Error 68 (entryAlreadyExists)



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@directory.apache.org
For additional commands, e-mail: dev-help@directory.apache.org


Mime
View raw message