
| Key: |
DIRSERVER-228
|
| Type: |
Bug
|
| Status: |
Closed
|
| Resolution: |
Fixed
|
| Priority: |
Major
|
| Assignee: |
Unassigned
|
| Reporter: |
Luke Taylor
|
| Votes: |
0
|
| Watchers: |
1
|
|
If you were logged in you would be able to see more operations.
|
|
|
| Resolution Date: |
20/Jan/06 07:41 AM
|
|
Using the latest 0.9.4 snapshots and also code checked out and built today - (but had to include an older version of Mina with the latter due to ClassNotFoundExceptions for MessageHandler ):
I'm making a call to apache-ds to perform a comparison operation on a user's password and I'm get a ClassCastException at line 369 of DefaultDirectoryPartitionNexus:
String attrVal = ( String ) normalizer.normalize( attr.get( ii ) );
when attr is userPassword (a byte array) and the normalizer is a no-op, so the cast to String fails.
javax.naming.NamingException: [LDAP: error code 1 - failed to compare entry cn=Bob,ou=people,dc=acegisecurity,dc=org:
org.apache.ldap.server.interceptor.InterceptorException: Unexpected exception. [Root exception is java.lang.ClassCastException: [B]
at org.apache.ldap.server.interceptor.InterceptorChain.throwInterceptorException(InterceptorChain.java:1368)
at org.apache.ldap.server.interceptor.InterceptorChain.access$700(InterceptorChain.java:49)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:983)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.authz.AuthorizationService.compare(AuthorizationService.java:917)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.normalization.NormalizationService.compare(NormalizationService.java:236)
at org.apache.ldap.server.interceptor.InterceptorChain.compare(InterceptorChain.java:564)
at org.apache.ldap.server.partition.DirectoryPartitionNexusProxy.compare(DirectoryPartitionNexusProxy.java:232)
at org.apache.ldap.server.partition.DirectoryPartitionNexusProxy.compare(DirectoryPartitionNexusProxy.java:221)
at org.apache.ldap.server.jndi.ServerLdapContext.compare(ServerLdapContext.java:168)
at org.apache.ldap.server.protocol.support.CompareHandler.messageReceived(CompareHandler.java:61)
at org.apache.mina.handler.DemuxingIoHandler.messageReceived(DemuxingIoHandler.java:95)
at org.apache.ldap.server.protocol.LdapProtocolProvider$LdapProtocolHandler.messageReceived(LdapProtocolProvider.java:396)
at org.apache.mina.common.support.AbstractIoFilterChain$2.messageReceived(AbstractIoFilterChain.java:189)
at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:494)
at org.apache.mina.common.support.AbstractIoFilterChain.access$1000(AbstractIoFilterChain.java:52)
at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:761)
at org.apache.mina.filter.LoggingFilter.messageReceived(LoggingFilter.java:87)
at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:494)
at org.apache.mina.common.support.AbstractIoFilterChain.access$1000(AbstractIoFilterChain.java:52)
at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:761)
at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:91)
at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:494)
at org.apache.mina.common.support.AbstractIoFilterChain.access$1000(AbstractIoFilterChain.java:52)
at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:761)
at org.apache.mina.filter.ThreadPoolFilter.processEvent(ThreadPoolFilter.java:665)
at org.apache.mina.filter.ThreadPoolFilter$Worker.processEvents(ThreadPoolFilter.java:421)
at org.apache.mina.filter.ThreadPoolFilter$Worker.run(ThreadPoolFilter.java:376)
Caused by: java.lang.ClassCastException: [B
at org.apache.ldap.server.partition.DefaultDirectoryPartitionNexus.compare(DefaultDirectoryPartitionNexus.java:369)
at org.apache.ldap.server.interceptor.InterceptorChain$1.compare(InterceptorChain.java:71)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
... 41 more
]; remaining name 'cn=Bob,ou=people'
at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3025)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2931)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2737)
at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1803)
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1731)
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1748)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:394)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:376)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:358)
at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267)
at org.acegisecurity.providers.ldap.authenticator.PasswordComparisonAuthenticator.doPasswordCompare(PasswordComparisonAuthenticator.java:117)
at org.acegisecurity.providers.ldap.authenticator.PasswordComparisonAuthenticator.authenticate(PasswordComparisonAuthenticator.java:81)
at org.acegisecurity.providers.ldap.authenticator.PasswordComparisonAuthenticatorTests.testLdapCompareSucceedsWithCorrectPassword(PasswordComparisonAuthenticatorTests.java:35)
Client code is:
SearchControls ctls = new SearchControls();
ctls.setReturningAttributes(new String[0]);
ctls.setSearchScope(SearchControls.OBJECT_SCOPE);
String filter = "(userPassword={0})";
NamingEnumeration results = ctx.search(dn, filter, new Object[]{password.getBytes()}, ctls);
|
|
Description
|
Using the latest 0.9.4 snapshots and also code checked out and built today - (but had to include an older version of Mina with the latter due to ClassNotFoundExceptions for MessageHandler ):
I'm making a call to apache-ds to perform a comparison operation on a user's password and I'm get a ClassCastException at line 369 of DefaultDirectoryPartitionNexus:
String attrVal = ( String ) normalizer.normalize( attr.get( ii ) );
when attr is userPassword (a byte array) and the normalizer is a no-op, so the cast to String fails.
javax.naming.NamingException: [LDAP: error code 1 - failed to compare entry cn=Bob,ou=people,dc=acegisecurity,dc=org:
org.apache.ldap.server.interceptor.InterceptorException: Unexpected exception. [Root exception is java.lang.ClassCastException: [B]
at org.apache.ldap.server.interceptor.InterceptorChain.throwInterceptorException(InterceptorChain.java:1368)
at org.apache.ldap.server.interceptor.InterceptorChain.access$700(InterceptorChain.java:49)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:983)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.authz.AuthorizationService.compare(AuthorizationService.java:917)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.interceptor.BaseInterceptor.compare(BaseInterceptor.java:210)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
at org.apache.ldap.server.normalization.NormalizationService.compare(NormalizationService.java:236)
at org.apache.ldap.server.interceptor.InterceptorChain.compare(InterceptorChain.java:564)
at org.apache.ldap.server.partition.DirectoryPartitionNexusProxy.compare(DirectoryPartitionNexusProxy.java:232)
at org.apache.ldap.server.partition.DirectoryPartitionNexusProxy.compare(DirectoryPartitionNexusProxy.java:221)
at org.apache.ldap.server.jndi.ServerLdapContext.compare(ServerLdapContext.java:168)
at org.apache.ldap.server.protocol.support.CompareHandler.messageReceived(CompareHandler.java:61)
at org.apache.mina.handler.DemuxingIoHandler.messageReceived(DemuxingIoHandler.java:95)
at org.apache.ldap.server.protocol.LdapProtocolProvider$LdapProtocolHandler.messageReceived(LdapProtocolProvider.java:396)
at org.apache.mina.common.support.AbstractIoFilterChain$2.messageReceived(AbstractIoFilterChain.java:189)
at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:494)
at org.apache.mina.common.support.AbstractIoFilterChain.access$1000(AbstractIoFilterChain.java:52)
at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:761)
at org.apache.mina.filter.LoggingFilter.messageReceived(LoggingFilter.java:87)
at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:494)
at org.apache.mina.common.support.AbstractIoFilterChain.access$1000(AbstractIoFilterChain.java:52)
at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:761)
at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:91)
at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:494)
at org.apache.mina.common.support.AbstractIoFilterChain.access$1000(AbstractIoFilterChain.java:52)
at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:761)
at org.apache.mina.filter.ThreadPoolFilter.processEvent(ThreadPoolFilter.java:665)
at org.apache.mina.filter.ThreadPoolFilter$Worker.processEvents(ThreadPoolFilter.java:421)
at org.apache.mina.filter.ThreadPoolFilter$Worker.run(ThreadPoolFilter.java:376)
Caused by: java.lang.ClassCastException: [B
at org.apache.ldap.server.partition.DefaultDirectoryPartitionNexus.compare(DefaultDirectoryPartitionNexus.java:369)
at org.apache.ldap.server.interceptor.InterceptorChain$1.compare(InterceptorChain.java:71)
at org.apache.ldap.server.interceptor.InterceptorChain$Entry$1.compare(InterceptorChain.java:975)
... 41 more
]; remaining name 'cn=Bob,ou=people'
at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3025)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2931)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2737)
at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1803)
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1731)
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1748)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:394)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:376)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:358)
at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267)
at org.acegisecurity.providers.ldap.authenticator.PasswordComparisonAuthenticator.doPasswordCompare(PasswordComparisonAuthenticator.java:117)
at org.acegisecurity.providers.ldap.authenticator.PasswordComparisonAuthenticator.authenticate(PasswordComparisonAuthenticator.java:81)
at org.acegisecurity.providers.ldap.authenticator.PasswordComparisonAuthenticatorTests.testLdapCompareSucceedsWithCorrectPassword(PasswordComparisonAuthenticatorTests.java:35)
Client code is:
SearchControls ctls = new SearchControls();
ctls.setReturningAttributes(new String[0]);
ctls.setSearchScope(SearchControls.OBJECT_SCOPE);
String filter = "(userPassword={0})";
NamingEnumeration results = ctx.search(dn, filter, new Object[]{password.getBytes()}, ctls);
|
Show » |
made changes - 20/Jan/06 07:41 AM
| Field |
Original Value |
New Value |
|
Status
|
Open
[ 1
]
|
Resolved
[ 5
]
|
|
Resolution
|
|
Fixed
[ 1
]
|
made changes - 07/Feb/06 02:41 PM
|
Key
|
DIRLDAP-77
|
DIRSERVER-228
|
|
Fix Version/s
|
|
pre-1.0
[ 12310782
]
|
|
Project
|
Directory LDAP
[ 10514
]
|
ApacheDS
[ 12310260
]
|
|
Affects Version/s
|
|
pre-1.0
[ 12310782
]
|
|
Component/s
|
|
ldap
[ 12310715
]
|
made changes - 21/Apr/07 11:20 AM
|
Status
|
Resolved
[ 5
]
|
Closed
[ 6
]
|
|
could you change the lines :
/// Line 360, file org.apache.ldap.server.partition.DefaultDirectoryPartitionNexus.java :
/*
* Get ahold of the normalizer for the attribute and normalize the request
* assertion value for comparisons with normalized attribute values. Loop
* through all values looking for a match.
*/
Normalizer normalizer = attrType.getEquality().getNormalizer();
String reqVal = ( String ) normalizer.normalize( value );
for ( int ii = 0; ii < attr.size(); ii++ )
{
String attrVal = ( String ) normalizer.normalize( attr.get( ii ) );
if ( attrVal.equals( reqVal ) )
{
return true;
}
}
by those lines in the class :
...
/*
* Get ahold of the normalizer for the attribute and normalize the request
* assertion value for comparisons with normalized attribute values. Loop
* through all values looking for a match.
*/
Normalizer normalizer = attrType.getEquality().getNormalizer();
Object reqVal = normalizer.normalize( value );
for ( int ii = 0; ii < attr.size(); ii++ )
{
Object attrValObj = normalizer.normalize( attr.get( ii ) );
if ( attrValObj instanceof String )
{
String attrVal = ( String ) attrValObj;
if ( attrVal.equals( reqVal ) )
{
return true;
}
}
else
{
byte[] attrVal = (byte[])attrValObj;
return Arrays.equals( attrVal, (byte[])reqVal );
}
}
...
Dont' forget to add the import java.util.Arrays;
and tell us if it fixes your pb?
Tahnks a lot for the report !