Return-Path: X-Original-To: apmail-directory-commits-archive@www.apache.org Delivered-To: apmail-directory-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id BA14010F33 for ; Wed, 26 Mar 2014 16:53:55 +0000 (UTC) Received: (qmail 30174 invoked by uid 500); 26 Mar 2014 16:53:55 -0000 Delivered-To: apmail-directory-commits-archive@directory.apache.org Received: (qmail 28228 invoked by uid 500); 26 Mar 2014 16:53:46 -0000 Mailing-List: contact commits-help@directory.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@directory.apache.org Delivered-To: mailing list commits@directory.apache.org Received: (qmail 28215 invoked by uid 99); 26 Mar 2014 16:53:43 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 26 Mar 2014 16:53:43 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 26 Mar 2014 16:53:38 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id B4B662388868; Wed, 26 Mar 2014 16:53:18 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1581932 - in /directory/shared/trunk/ldap: codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/ codec/standalone/src/test/java/org/apache/directory/api/ldap/codec/standalone/ extras/codec-api/src/main/java/org/apa... Date: Wed, 26 Mar 2014 16:53:18 -0000 To: commits@directory.apache.org From: elecharny@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20140326165318.B4B662388868@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: elecharny Date: Wed Mar 26 16:53:17 2014 New Revision: 1581932 URL: http://svn.apache.org/r1581932 Log: o Added the support for the WhoAmI extended operation Added: directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/ directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIRequest.java directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIRequestImpl.java directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIResponse.java directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIResponseImpl.java directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/ directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIFactory.java directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIRequestDecorator.java directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseContainer.java directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecoder.java directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecorator.java directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseGrammar.java directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseStatesEnum.java directory/shared/trunk/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/ directory/shared/trunk/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseTest.java Modified: directory/shared/trunk/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/CodecFactoryUtil.java directory/shared/trunk/ldap/codec/standalone/src/test/java/org/apache/directory/api/ldap/codec/standalone/AbstractCodecServiceTest.java directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/ExtrasBundleActivator.java Modified: directory/shared/trunk/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/CodecFactoryUtil.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/CodecFactoryUtil.java?rev=1581932&r1=1581931&r2=1581932&view=diff ============================================================================== --- directory/shared/trunk/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/CodecFactoryUtil.java (original) +++ directory/shared/trunk/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/CodecFactoryUtil.java Wed Mar 26 16:53:17 2014 @@ -49,6 +49,7 @@ import org.apache.directory.api.ldap.ext import org.apache.directory.api.ldap.extras.extended.ads_impl.gracefulShutdown.GracefulShutdownFactory; import org.apache.directory.api.ldap.extras.extended.ads_impl.pwdModify.PasswordModifyFactory; import org.apache.directory.api.ldap.extras.extended.ads_impl.storedProcedure.StoredProcedureFactory; +import org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI.WhoAmIFactory; import org.apache.directory.api.ldap.model.message.controls.Cascade; import org.apache.directory.api.ldap.model.message.controls.EntryChange; import org.apache.directory.api.ldap.model.message.controls.ManageDsaIT; @@ -156,5 +157,9 @@ public class CodecFactoryUtil PasswordModifyFactory passwordModifyFactory = new PasswordModifyFactory( apiService ); extendendOperationsFactories.put( passwordModifyFactory.getOid(), passwordModifyFactory ); LOG.info( "Registered pre-bundled extended operation factory: {}", passwordModifyFactory.getOid() ); + + WhoAmIFactory whoAmIFactory = new WhoAmIFactory( apiService ); + extendendOperationsFactories.put( whoAmIFactory.getOid(), whoAmIFactory ); + LOG.info( "Registered pre-bundled extended operation factory: {}", whoAmIFactory.getOid() ); } } Modified: directory/shared/trunk/ldap/codec/standalone/src/test/java/org/apache/directory/api/ldap/codec/standalone/AbstractCodecServiceTest.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/codec/standalone/src/test/java/org/apache/directory/api/ldap/codec/standalone/AbstractCodecServiceTest.java?rev=1581932&r1=1581931&r2=1581932&view=diff ============================================================================== --- directory/shared/trunk/ldap/codec/standalone/src/test/java/org/apache/directory/api/ldap/codec/standalone/AbstractCodecServiceTest.java (original) +++ directory/shared/trunk/ldap/codec/standalone/src/test/java/org/apache/directory/api/ldap/codec/standalone/AbstractCodecServiceTest.java Wed Mar 26 16:53:17 2014 @@ -67,7 +67,8 @@ public abstract class AbstractCodecServi "org.apache.directory.api.ldap.extras.extended.ads_impl.gracefulShutdown.GracefulShutdownFactory," + "org.apache.directory.api.ldap.extras.extended.ads_impl.storedProcedure.StoredProcedureFactory," + "org.apache.directory.api.ldap.extras.extended.ads_impl.pwdModify.PasswordModifyFactory," + - "org.apache.directory.api.ldap.extras.extended.ads_impl.gracefulDisconnect.GracefulDisconnectFactory" ); + "org.apache.directory.api.ldap.extras.extended.ads_impl.gracefulDisconnect.GracefulDisconnectFactory" + + "org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI.WhoAmIFactory" ); codec = LdapApiServiceFactory.getSingleton(); encoder = new LdapEncoder( codec ); Added: directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIRequest.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIRequest.java?rev=1581932&view=auto ============================================================================== --- directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIRequest.java (added) +++ directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIRequest.java Wed Mar 26 16:53:17 2014 @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.api.ldap.extras.extended.whoAmI; + + +import org.apache.directory.api.ldap.model.message.ExtendedRequest; + + +/** + * The RFC 4532 WhoAmI request + * + * @author Apache Directory Project + */ +public interface WhoAmIRequest extends ExtendedRequest +{ + /** The OID for the WhoAmI extended operation request. */ + String EXTENSION_OID = "1.3.6.1.4.1.4203.1.11.3"; +} Added: directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIRequestImpl.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIRequestImpl.java?rev=1581932&view=auto ============================================================================== --- directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIRequestImpl.java (added) +++ directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIRequestImpl.java Wed Mar 26 16:53:17 2014 @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.api.ldap.extras.extended.whoAmI; + + +import org.apache.directory.api.ldap.model.message.AbstractExtendedRequest; + + +/** + * The RFC 4532 WhoAmI request + * + * @author Apache Directory Project + */ +public class WhoAmIRequestImpl extends AbstractExtendedRequest implements WhoAmIRequest +{ + /** + * Create a new instance of the PwdModifyRequest extended operation + */ + public WhoAmIRequestImpl() + { + setRequestName( EXTENSION_OID ); + } + + + /** + * Create a new instance of the PwdModifyRequest extended operation + * + * @param messageId The message ID + */ + public WhoAmIRequestImpl( int messageId ) + { + super( messageId ); + setRequestName( EXTENSION_OID ); + } + + + /** + * {@inheritDoc} + */ + @Override + public WhoAmIResponse getResultResponse() + { + if ( response == null ) + { + response = new WhoAmIResponseImpl( getMessageId() ); + } + + return ( WhoAmIResponse ) response; + } + + + /** + * @see Object#toString() + */ + public String toString() + { + return "Who Am I extended request"; + } +} Added: directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIResponse.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIResponse.java?rev=1581932&view=auto ============================================================================== --- directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIResponse.java (added) +++ directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIResponse.java Wed Mar 26 16:53:17 2014 @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.api.ldap.extras.extended.whoAmI; + + +import org.apache.directory.api.ldap.model.message.ExtendedResponse; +import org.apache.directory.api.ldap.model.name.Dn; + + +/** + * The RFC 4532 WhoAmI response : + * + *
+ * authzid ::= OCTET STRING OPTIONAL
+ * 
+ * + * @author Apache Directory Project + */ +public interface WhoAmIResponse extends ExtendedResponse +{ + /** The OID for the WhoAmI extended operation response. */ + String EXTENSION_OID = WhoAmIRequest.EXTENSION_OID; + + + /** + * @return true if the response contains a DN authz (dn:XXX) + */ + boolean isDnAuthzId(); + + + /** + * @return true if the response contains a userID authz (u:XXX) + */ + boolean isUserAuthzId(); + + + /** + * Get the authzid as a byte[] + * + * @return The authzid or null + */ + byte[] getAuthzId(); + + + /** + * Get the authzid as String. We will strip out the 'dn:' or 'u:' part. + * + * @return The authzid or null + */ + String getAuthzIdString(); + + + /** + * Get the UserId + * + * @return The userId or null + */ + String getUserId(); + + + /** + * Get the DN authzid. + * + * @return The DN or null + */ + Dn getDn(); + + + /** + * set the authzid + * + * @param The authzid to set + */ + void setAuthzId( byte[] authzId ); +} Added: directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIResponseImpl.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIResponseImpl.java?rev=1581932&view=auto ============================================================================== --- directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIResponseImpl.java (added) +++ directory/shared/trunk/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/whoAmI/WhoAmIResponseImpl.java Wed Mar 26 16:53:17 2014 @@ -0,0 +1,220 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.api.ldap.extras.extended.whoAmI; + + +import org.apache.directory.api.ldap.model.message.ExtendedResponseImpl; +import org.apache.directory.api.ldap.model.message.ResultCodeEnum; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.directory.api.util.Strings; + + +/** + * The RFC 4532 WhoAmI response : + * + *
+ * authzid OCTET STRING OPTIONAL
+ * 
+ * + * @author Apache Directory Project + */ +public class WhoAmIResponseImpl extends ExtendedResponseImpl implements WhoAmIResponse +{ + /** The authzid */ + private byte[] authzId; + + /** The authzId when it's a DN */ + private Dn dn; + + /** The authzId when it's a userId */ + private String userId; + + + /** + * Create a new instance for the WhoAmI response + * @param messageId The Message ID + * @param rcode The result code + * @param diagnosticMessage The diagnostic message + */ + public WhoAmIResponseImpl( int messageId, ResultCodeEnum rcode, String diagnosticMessage ) + { + super( messageId, EXTENSION_OID ); + + super.getLdapResult().setMatchedDn( null ); + super.getLdapResult().setResultCode( rcode ); + super.getLdapResult().setDiagnosticMessage( diagnosticMessage ); + } + + + /** + * Create a new instance for the WhoAmI response + * @param messageId The Message ID + * @param rcode The result code + */ + public WhoAmIResponseImpl( int messageId, ResultCodeEnum rcode ) + { + super( messageId, EXTENSION_OID ); + + super.getLdapResult().setMatchedDn( null ); + super.getLdapResult().setResultCode( rcode ); + } + + + /** + * Instantiates a new WhoAmI response. + * + * @param messageId the message id + */ + public WhoAmIResponseImpl( int messageId ) + { + super( messageId, EXTENSION_OID ); + super.getLdapResult().setMatchedDn( null ); + super.getLdapResult().setResultCode( ResultCodeEnum.SUCCESS ); + } + + + /** + * Instantiates a new WhoAmI response. + */ + public WhoAmIResponseImpl() + { + super( EXTENSION_OID ); + super.getLdapResult().setMatchedDn( null ); + super.getLdapResult().setResultCode( ResultCodeEnum.SUCCESS ); + } + + + /** + * {@inheritDoc} + */ + public byte[] getAuthzId() + { + return authzId; + } + + + /** + * {@inheritDoc} + */ + public void setAuthzId( byte[] authzId ) + { + this.authzId = authzId; + } + + + /** + * {@inheritDoc} + */ + public boolean isDnAuthzId() + { + if ( authzId != null ) + { + return false; + } + else + { + return false; + } + } + + + /** + * {@inheritDoc} + */ + public boolean isUserAuthzId() + { + return userId != null; + } + + + /** + * {@inheritDoc} + */ + public String getAuthzIdString() + { + return Strings.utf8ToString( authzId ); + } + + + /** + * {@inheritDoc} + */ + public String getUserId() + { + return userId; + } + + + /** + * Set the userId + */ + public void setUserId( String userId ) + { + this.userId = userId; + } + + + /** + * {@inheritDoc} + */ + public Dn getDn() + { + return dn; + } + + + /** + * Set the DN + */ + public void setDn( Dn dn ) + { + this.dn = dn; + } + + + /** + * @see Object#toString() + */ + public String toString() + { + StringBuilder sb = new StringBuilder(); + + sb.append( "PwdModifyResponse :" ); + sb.append( "\n authzid : " ); + + if ( authzId != null ) + { + if ( isDnAuthzId() ) + { + sb.append( "DN: " ).append( getDn() ); + } + else + { + sb.append( "UserId: " ).append( getUserId() ); + } + } + else + { + sb.append( "null" ); + } + + return sb.toString(); + } +} Modified: directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/ExtrasBundleActivator.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/ExtrasBundleActivator.java?rev=1581932&r1=1581931&r2=1581932&view=diff ============================================================================== --- directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/ExtrasBundleActivator.java (original) +++ directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/ExtrasBundleActivator.java Wed Mar 26 16:53:17 2014 @@ -38,11 +38,14 @@ import org.apache.directory.api.ldap.ext import org.apache.directory.api.ldap.extras.extended.ads_impl.gracefulShutdown.GracefulShutdownFactory; import org.apache.directory.api.ldap.extras.extended.ads_impl.pwdModify.PasswordModifyFactory; import org.apache.directory.api.ldap.extras.extended.ads_impl.storedProcedure.StoredProcedureFactory; +import org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI.WhoAmIFactory; import org.apache.directory.api.ldap.extras.extended.cancel.CancelRequest; import org.apache.directory.api.ldap.extras.extended.certGeneration.CertGenerationRequest; import org.apache.directory.api.ldap.extras.extended.gracefulDisconnect.GracefulDisconnectResponse; import org.apache.directory.api.ldap.extras.extended.gracefulShutdown.GracefulShutdownRequest; +import org.apache.directory.api.ldap.extras.extended.pwdModify.PasswordModifyRequest; import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureRequest; +import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIRequest; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; @@ -123,6 +126,9 @@ public class ExtrasBundleActivator imple GracefulDisconnectFactory gracefulDisconnectFactory = new GracefulDisconnectFactory( codec ); codec.registerExtendedRequest( gracefulDisconnectFactory ); + + WhoAmIFactory whoAmIFactory = new WhoAmIFactory( codec ); + codec.registerExtendedRequest( whoAmIFactory ); } @@ -144,5 +150,7 @@ public class ExtrasBundleActivator imple codec.unregisterExtendedRequest( GracefulShutdownRequest.EXTENSION_OID ); codec.unregisterExtendedRequest( StoredProcedureRequest.EXTENSION_OID ); codec.unregisterExtendedRequest( GracefulDisconnectResponse.EXTENSION_OID ); + codec.unregisterExtendedRequest( PasswordModifyRequest.EXTENSION_OID ); + codec.unregisterExtendedRequest( WhoAmIRequest.EXTENSION_OID ); } } Added: directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIFactory.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIFactory.java?rev=1581932&view=auto ============================================================================== --- directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIFactory.java (added) +++ directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIFactory.java Wed Mar 26 16:53:17 2014 @@ -0,0 +1,165 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI; + + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.nio.ByteBuffer; + +import org.apache.directory.api.asn1.DecoderException; +import org.apache.directory.api.asn1.ber.Asn1Decoder; +import org.apache.directory.api.ldap.codec.api.ExtendedOperationFactory; +import org.apache.directory.api.ldap.codec.api.ExtendedResponseDecorator; +import org.apache.directory.api.ldap.codec.api.LdapApiService; +import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIRequest; +import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIRequestImpl; +import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIResponse; +import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIResponseImpl; +import org.apache.directory.api.ldap.model.message.ExtendedRequest; +import org.apache.directory.api.ldap.model.message.ExtendedResponse; +import org.apache.directory.api.ldap.model.message.ResultCodeEnum; + + +/** + * An {@link ExtendedOperationFactory} for creating WhoAmI extended request response + * pairs. + * + * @author Apache Directory Project + */ +public class WhoAmIFactory implements ExtendedOperationFactory +{ + private LdapApiService codec; + + + public WhoAmIFactory( LdapApiService codec ) + { + this.codec = codec; + } + + + /** + * {@inheritDoc} + */ + public String getOid() + { + return WhoAmIRequest.EXTENSION_OID; + } + + + /** + * {@inheritDoc} + */ + public WhoAmIResponse newResponse( byte[] encodedValue ) throws DecoderException + { + WhoAmIResponseDecorator response = new WhoAmIResponseDecorator( codec, + new WhoAmIResponseImpl() ); + response.setResponseValue( encodedValue ); + return response; + } + + + /** + * {@inheritDoc} + */ + public WhoAmIRequest newRequest( byte[] value ) + { + WhoAmIRequestDecorator req = new WhoAmIRequestDecorator( codec, new WhoAmIRequestImpl() ); + + if ( value != null ) + { + req.setRequestValue( value ); + } + + return req; + } + + + /** + * {@inheritDoc} + */ + public WhoAmIRequestDecorator decorate( ExtendedRequest modelRequest ) + { + if ( modelRequest instanceof WhoAmIRequestDecorator ) + { + return ( WhoAmIRequestDecorator ) modelRequest; + } + + return new WhoAmIRequestDecorator( codec, ( WhoAmIRequest ) modelRequest ); + } + + + /** + * {@inheritDoc} + */ + public WhoAmIResponseDecorator decorate( ExtendedResponse decoratedResponse ) + { + if ( decoratedResponse instanceof WhoAmIResponseDecorator ) + { + return ( WhoAmIResponseDecorator ) decoratedResponse; + } + + if ( decoratedResponse instanceof WhoAmIResponse ) + { + return new WhoAmIResponseDecorator( codec, ( WhoAmIResponse ) decoratedResponse ); + } + + // It's an opaque extended operation + ExtendedResponseDecorator response = ( ExtendedResponseDecorator ) decoratedResponse; + + // Decode the response, as it's an opaque operation + Asn1Decoder decoder = new Asn1Decoder(); + + byte[] value = response.getResponseValue(); + ByteBuffer buffer = ByteBuffer.wrap( value ); + + WhoAmIResponseContainer container = new WhoAmIResponseContainer(); + WhoAmIResponse whoAmIResponse = null; + + try + { + decoder.decode( buffer, container ); + + whoAmIResponse = container.getWhoAmIResponse(); + + // Now, update the created response with what we got from the extendedResponse + whoAmIResponse.getLdapResult().setResultCode( response.getLdapResult().getResultCode() ); + whoAmIResponse.getLdapResult().setDiagnosticMessage( response.getLdapResult().getDiagnosticMessage() ); + whoAmIResponse.getLdapResult().setMatchedDn( response.getLdapResult().getMatchedDn() ); + whoAmIResponse.getLdapResult().setReferral( response.getLdapResult().getReferral() ); + } + catch ( DecoderException de ) + { + StringWriter sw = new StringWriter(); + de.printStackTrace( new PrintWriter( sw ) ); + String stackTrace = sw.toString(); + + // Error while decoding the value. + whoAmIResponse = new WhoAmIResponseImpl( + decoratedResponse.getMessageId(), + ResultCodeEnum.OPERATIONS_ERROR, + stackTrace ); + } + + WhoAmIResponseDecorator decorated = new WhoAmIResponseDecorator( codec, whoAmIResponse ); + + return decorated; + } +} Added: directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIRequestDecorator.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIRequestDecorator.java?rev=1581932&view=auto ============================================================================== --- directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIRequestDecorator.java (added) +++ directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIRequestDecorator.java Wed Mar 26 16:53:17 2014 @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI; + + +import org.apache.directory.api.ldap.codec.api.ExtendedRequestDecorator; +import org.apache.directory.api.ldap.codec.api.LdapApiService; +import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIRequest; +import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIResponse; + + +/** + * A Decorator for WhoAmIRequest extended request. + * + * @author Apache Directory Project + */ +public class WhoAmIRequestDecorator extends ExtendedRequestDecorator implements WhoAmIRequest +{ + /** The internal WhoAmIRequest */ + private WhoAmIRequest whoAmIRequest; + + /** + * Create a new decorator instance + * @param codec The codec service + * @param decoratedMessage The decorated WhoAmIRequest + */ + public WhoAmIRequestDecorator( LdapApiService codec, WhoAmIRequest decoratedMessage ) + { + super( codec, decoratedMessage ); + whoAmIRequest = decoratedMessage; + } + + + /** + * {@inheritDoc} + */ + @Override + public WhoAmIResponse getResultResponse() + { + return ( WhoAmIResponse ) whoAmIRequest.getResultResponse(); + } +} Added: directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseContainer.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseContainer.java?rev=1581932&view=auto ============================================================================== --- directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseContainer.java (added) +++ directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseContainer.java Wed Mar 26 16:53:17 2014 @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI; + + +import org.apache.directory.api.asn1.ber.AbstractContainer; + + +/** + * A container for WhoAmIResponse codec. + * + * @author Apache Directory Project + */ +public class WhoAmIResponseContainer extends AbstractContainer +{ + /** WhoAmIResponse decorator*/ + private WhoAmIResponseDecorator whoAmIResponse; + + + /** + * Creates a new WhoAmIResponseContainer object. We will store one + * grammar, it's enough ... + */ + public WhoAmIResponseContainer() + { + super(); + grammar = WhoAmIResponseGrammar.getInstance(); + setTransition( WhoAmIResponseStatesEnum.START_STATE ); + } + + + /** + * @return Returns the WhoAmIResponse instance. + */ + public WhoAmIResponseDecorator getWhoAmIResponse() + { + return whoAmIResponse; + } + + + /** + * Set a WhoAmIResponse Object into the container. It will be completed by + * the ldapDecoder. + * + * @param whoAmIResponseDecorator the WhoAmIResponse to set. + */ + public void setWhoAmIResponse( WhoAmIResponseDecorator whoAmIResponseDecorator ) + { + this.whoAmIResponse = whoAmIResponseDecorator; + } + + + /** + * Clean the container for the next decoding. + */ + public void clean() + { + super.clean(); + whoAmIResponse = null; + } +} Added: directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecoder.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecoder.java?rev=1581932&view=auto ============================================================================== --- directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecoder.java (added) +++ directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecoder.java Wed Mar 26 16:53:17 2014 @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI; + + +import java.nio.ByteBuffer; + +import org.apache.directory.api.asn1.DecoderException; +import org.apache.directory.api.asn1.ber.Asn1Decoder; +import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIResponse; + + +/** + * + * A decoder for WhoAmIRequest. + * + * @author Apache Directory Project + */ +public class WhoAmIResponseDecoder extends Asn1Decoder +{ + /** The decoder */ + private static final Asn1Decoder decoder = new Asn1Decoder(); + + + /** + * Decode a PDU which must contain a WhoAmIRequest extended operation. + * Note that the stream of bytes much contain a full PDU, not a partial one. + * + * @param stream The bytes to be decoded + * @return a WhoAmIRequest object + * @throws org.apache.directory.api.asn1.DecoderException If the decoding failed + */ + public WhoAmIResponse decode( byte[] stream ) throws DecoderException + { + ByteBuffer bb = ByteBuffer.wrap( stream ); + WhoAmIResponseContainer container = new WhoAmIResponseContainer(); + decoder.decode( bb, container ); + WhoAmIResponseDecorator whoAmIResponse = container.getWhoAmIResponse(); + + // Clean the container for the next decoding + container.clean(); + + return whoAmIResponse; + } +} Added: directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecorator.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecorator.java?rev=1581932&view=auto ============================================================================== --- directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecorator.java (added) +++ directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecorator.java Wed Mar 26 16:53:17 2014 @@ -0,0 +1,226 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI; + + +import java.nio.ByteBuffer; + +import org.apache.directory.api.asn1.DecoderException; +import org.apache.directory.api.asn1.EncoderException; +import org.apache.directory.api.asn1.ber.tlv.BerValue; +import org.apache.directory.api.i18n.I18n; +import org.apache.directory.api.ldap.codec.api.ExtendedResponseDecorator; +import org.apache.directory.api.ldap.codec.api.LdapApiService; +import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIResponse; +import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIResponseImpl; +import org.apache.directory.api.ldap.model.name.Dn; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * A Decorator for WhoAmIResponse extended request. + * + * @author Apache Directory Project + */ +public class WhoAmIResponseDecorator extends ExtendedResponseDecorator + implements WhoAmIResponse +{ + private static final Logger LOG = LoggerFactory.getLogger( WhoAmIResponseDecorator.class ); + + private WhoAmIResponse whoAmIResponse; + + public WhoAmIResponseDecorator( LdapApiService codec, WhoAmIResponse decoratedMessage ) + { + super( codec, decoratedMessage ); + whoAmIResponse = decoratedMessage; + } + + + /** + * {@inheritDoc} + */ + @Override + public void setResponseValue( byte[] responseValue ) + { + WhoAmIResponseDecoder decoder = new WhoAmIResponseDecoder(); + + try + { + whoAmIResponse = decoder.decode( responseValue ); + + if ( responseValue != null ) + { + this.responseValue = new byte[responseValue.length]; + System.arraycopy( responseValue, 0, this.responseValue, 0, responseValue.length ); + } + else + { + this.responseValue = null; + } + } + catch ( DecoderException e ) + { + LOG.error( I18n.err( I18n.ERR_04165 ), e ); + throw new RuntimeException( e ); + } + } + + + /** + * {@inheritDoc} + */ + @Override + public byte[] getResponseValue() + { + if ( responseValue == null ) + { + try + { + responseValue = encodeInternal().array(); + + if ( responseValue == null ) + { + return null; + } + } + catch ( EncoderException e ) + { + LOG.error( I18n.err( I18n.ERR_04167 ), e ); + throw new RuntimeException( e ); + } + } + + return responseValue; + } + + + /** + * {@inheritDoc} + */ + public byte[] getAuthzId() + { + return getDecorated().getAuthzId(); + } + + + /** + * {@inheritDoc} + */ + public void setAuthzId( byte[] authzId ) + { + ( ( WhoAmIResponseImpl ) getDecorated() ).setAuthzId( authzId ); + } + + + /** + * Set the userId + */ + /* no qualifier*/ void setUserId( String userId ) + { + ((WhoAmIResponseImpl)whoAmIResponse).setUserId( userId ); + } + + + /** + * Overload the parent's getResponseName method, as the WhoAmI response should not + * contain the responseName. + */ + public String getResponseName() + { + return null; + } + + + /** + * Compute the WhoAmIResponse extended operation length + *
+     * 0x04 L1 authzId
+     * 
+ */ + /* no qualifier */ int computeLengthInternal() + { + if ( whoAmIResponse.getAuthzId() != null ) + { + return 1 + BerValue.getNbBytes( whoAmIResponse.getAuthzId().length ) + + whoAmIResponse.getAuthzId().length; + } + else + { + return 1 + 1; + } + } + + + /** + * Encodes the WhoAmIResponse extended operation. + * + * @return A ByteBuffer that contains the encoded PDU + * @throws org.apache.directory.api.asn1.EncoderException If anything goes wrong. + */ + /* no qualifier */ ByteBuffer encodeInternal() throws EncoderException + { + ByteBuffer bb = ByteBuffer.allocate( computeLengthInternal() ); + + BerValue.encode( bb, whoAmIResponse.getAuthzId() ); + + return bb; + } + + + @Override + public boolean isDnAuthzId() + { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean isUserAuthzId() + { + // TODO Auto-generated method stub + return false; + } + + + @Override + public String getAuthzIdString() + { + // TODO Auto-generated method stub + return null; + } + + + @Override + public String getUserId() + { + // TODO Auto-generated method stub + return null; + } + + + @Override + public Dn getDn() + { + // TODO Auto-generated method stub + return null; + } +} Added: directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseGrammar.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseGrammar.java?rev=1581932&view=auto ============================================================================== --- directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseGrammar.java (added) +++ directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseGrammar.java Wed Mar 26 16:53:17 2014 @@ -0,0 +1,191 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI; + + +import org.apache.directory.api.asn1.DecoderException; +import org.apache.directory.api.asn1.ber.grammar.AbstractGrammar; +import org.apache.directory.api.asn1.ber.grammar.Grammar; +import org.apache.directory.api.asn1.ber.grammar.GrammarAction; +import org.apache.directory.api.asn1.ber.grammar.GrammarTransition; +import org.apache.directory.api.asn1.ber.tlv.UniversalTag; +import org.apache.directory.api.ldap.codec.api.LdapApiServiceFactory; +import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIResponseImpl; +import org.apache.directory.api.ldap.model.name.Dn; +import org.apache.directory.api.util.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * This class implements the WhoAmIResponse extended operation's ASN.1 grammer. + * All the actions are declared in this class. As it is a singleton, + * these declaration are only done once. The grammar is : + * + *
+ *  WhoAmIResponseValue ::= OCTET STRING OPTIONAL }
+ * 
+ * + * @author Apache Directory Project + */ + +public class WhoAmIResponseGrammar extends AbstractGrammar +{ + /** logger */ + private static final Logger LOG = LoggerFactory.getLogger( WhoAmIResponseGrammar.class ); + + /** Speedup for logs */ + static final boolean IS_DEBUG = LOG.isDebugEnabled(); + + /** The instance of grammar. WhoAmIResponseGrammar is a singleton */ + private static Grammar instance = new WhoAmIResponseGrammar(); + + + @SuppressWarnings("unchecked") + public WhoAmIResponseGrammar() + { + setName( WhoAmIResponseGrammar.class.getName() ); + + // Create the transitions table + super.transitions = new GrammarTransition[WhoAmIResponseStatesEnum.LAST_WHO_AM_I_RESPONSE_STATE + .ordinal()][256]; + + /** + * Transition from init state to WhoAmI Authzid Response Value + * + * authzId ::= OCTET STRING OPTIONAL + * + * Creates the authzid object + */ + super.transitions[WhoAmIResponseStatesEnum.START_STATE.ordinal()][UniversalTag.OCTET_STRING.getValue()] = + new GrammarTransition( + WhoAmIResponseStatesEnum.START_STATE, + WhoAmIResponseStatesEnum.AUTHZ_ID_RESPONSE_STATE, + UniversalTag.OCTET_STRING.getValue(), new GrammarAction( + "Store AuthzId" ) + { + public void action( WhoAmIResponseContainer container ) throws DecoderException + { + WhoAmIResponseDecorator whoAmIResponse = new WhoAmIResponseDecorator( + LdapApiServiceFactory.getSingleton(), new WhoAmIResponseImpl() ); + container.setWhoAmIResponse( whoAmIResponse ); + + byte[] data = container.getCurrentTLV().getValue().getData(); + + if ( data != null ) + { + switch ( data.length ) + { + case 0: + // Error + case 1: + // Error + String msg = "authzId too short. Must starts with either u: or dn:"; + LOG.error( msg ); + throw new DecoderException( msg ); + + case 2 : + if ( ( data[0] == 'u' ) && ( data[1] == ':' ) ) + { + whoAmIResponse.setAuthzId( data ); + whoAmIResponse.setUserId( Strings.utf8ToString( data, 3, data.length - 3 ) ); + } + else + { + msg = "authzId Must starts with either u: or dn:, it starts with " + Strings.utf8ToString( data ); + LOG.error( msg ); + throw new DecoderException( msg ); + } + + break; + + default : + switch ( data[0] ) + { + case 'u' : + if ( data[1] == ':' ) + { + whoAmIResponse.setAuthzId( data ); + whoAmIResponse.setUserId( Strings.utf8ToString( data, 3, data.length - 3 ) ); + } + else + { + msg = "authzId Must starts with either u: or dn:, it starts with " + Strings.utf8ToString( data ); + LOG.error( msg ); + throw new DecoderException( msg ); + } + + break; + + case 'd' : + if ( ( data[1] == 'n' ) && ( data[2] == ':' ) ) + { + // Check that the remaining bytes are a valid DN + if ( Dn.isValid( Strings.utf8ToString( data, 3, data.length - 3 ) ) ) + { + whoAmIResponse.setAuthzId( data ); + } + else + { + msg = "authzId Must starts with either u: or dn:, it starts with " + Strings.utf8ToString( data ); + LOG.error( msg ); + throw new DecoderException( msg ); + } + } + else + { + msg = "authzId Must starts with either u: or dn:, it starts with " + Strings.utf8ToString( data ); + LOG.error( msg ); + throw new DecoderException( msg ); + } + + break; + + default : + msg = "authzId Must starts with either u: or dn:, it starts with " + Strings.utf8ToString( data ); + LOG.error( msg ); + throw new DecoderException( msg ); + } + + break; + } + } + else + { + whoAmIResponse.setAuthzId( null ); + } + + // We may have nothing left + container.setGrammarEndAllowed( true ); + } + } ); + } + + + /** + * This class is a singleton. + * + * @return An instance on this grammar + */ + public static Grammar getInstance() + { + return instance; + } +} Added: directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseStatesEnum.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseStatesEnum.java?rev=1581932&view=auto ============================================================================== --- directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseStatesEnum.java (added) +++ directory/shared/trunk/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseStatesEnum.java Wed Mar 26 16:53:17 2014 @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI; + + +import org.apache.directory.api.asn1.ber.grammar.Grammar; +import org.apache.directory.api.asn1.ber.grammar.States; + + +/** + * This class store the WhoAmIResponse's grammar constants. It is also used + * for debugging purposes. + * + * @author Apache Directory Project + */ +public enum WhoAmIResponseStatesEnum implements States +{ + + /** The END_STATE */ + END_STATE, + + /** start state*/ + START_STATE, + + /** the authzid */ + AUTHZ_ID_RESPONSE_STATE, + + /** Last state */ + LAST_WHO_AM_I_RESPONSE_STATE; + + /** + * Get the grammar name + * + * @param grammar The grammar class + * @return The grammar name + */ + public String getGrammarName( Grammar grammar ) + { + return "WHO_AM_I_RESPONSE_GRAMMER"; + } + + + /** + * Get the grammar name + * + * @param grammar The grammar code + * @return The grammar name + */ + public String getGrammarName( int grammar ) + { + return "WHO_AM_I_RESPONSE_GRAMMER"; + } + + + /** + * Get the string representing the state + * + * @param state The state number + * @return The String representing the state + */ + public String getState( int state ) + { + return ( ( state == END_STATE.ordinal() ) ? "WHO_AM_I_RESPONSE_GRAMMER" : this.name() ); + } + + + /** + * {@inheritDoc} + */ + public boolean isEndState() + { + return this == END_STATE; + } + + + /** + * {@inheritDoc} + */ + public WhoAmIResponseStatesEnum getStartState() + { + return START_STATE; + } +} Added: directory/shared/trunk/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseTest.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseTest.java?rev=1581932&view=auto ============================================================================== --- directory/shared/trunk/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseTest.java (added) +++ directory/shared/trunk/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseTest.java Wed Mar 26 16:53:17 2014 @@ -0,0 +1,243 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI; + + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + +import java.nio.ByteBuffer; + +import org.apache.directory.api.asn1.DecoderException; +import org.apache.directory.api.asn1.EncoderException; +import org.apache.directory.api.asn1.ber.Asn1Container; +import org.apache.directory.api.asn1.ber.Asn1Decoder; +import org.apache.directory.api.util.Strings; +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.mycila.junit.concurrent.Concurrency; +import com.mycila.junit.concurrent.ConcurrentJunitRunner; + + +/* + * TestCase for a WhoAmI response Extended Operation + * + * @author Apache Directory Project + */ +@RunWith(ConcurrentJunitRunner.class) +@Concurrency() +public class WhoAmIResponseTest +{ + /** + * Test the normal WhoAmI response message + */ + @Test + public void testDecodeWhoAmINull() + { + Asn1Decoder whoAmIResponseDecoder = new WhoAmIResponseDecoder(); + + ByteBuffer stream = ByteBuffer.allocate( 0x00 ); + + stream.put( new byte[] + {} ).flip(); + + String decodedPdu = Strings.dumpBytes( stream.array() ); + + // Allocate a WhoAmI Container + Asn1Container whoAmIResponseContainer = new WhoAmIResponseContainer(); + + // Decode a WhoAmI message + try + { + whoAmIResponseDecoder.decode( stream, whoAmIResponseContainer ); + } + catch ( DecoderException de ) + { + de.printStackTrace(); + fail( de.getMessage() ); + } + + WhoAmIResponseDecorator whoAmIResponse = ( ( WhoAmIResponseContainer ) whoAmIResponseContainer ).getWhoAmIResponse(); + + assertNull( whoAmIResponse ); + } + + + /** + * Test a WhoAmI message with no authzId + */ + @Test + public void testDecodeWhoAmINoWhoAmIAuthzIdEmpty() + { + Asn1Decoder whoAmIResponseDecoder = new WhoAmIResponseDecoder(); + + ByteBuffer stream = ByteBuffer.allocate( 0x02 ); + + stream.put( new byte[] + { + 0x04, 0x00 + } ).flip(); + + String decodedPdu = Strings.dumpBytes( stream.array() ); + + // Allocate a WhoAmI Container + Asn1Container whoAmIResponseContainer = new WhoAmIResponseContainer(); + + // Decode a WhoAmI message + try + { + whoAmIResponseDecoder.decode( stream, whoAmIResponseContainer ); + } + catch ( DecoderException de ) + { + fail(); + } + + WhoAmIResponseDecorator whoAmIResponse = ( (WhoAmIResponseContainer ) whoAmIResponseContainer ).getWhoAmIResponse(); + + assertNull( whoAmIResponse.getAuthzId() ); + + // Check the encoding + try + { + ByteBuffer bb = whoAmIResponse.encodeInternal(); + + String encodedPdu = Strings.dumpBytes( bb.array() ); + + assertEquals( encodedPdu, decodedPdu ); + } + catch ( EncoderException ee ) + { + ee.printStackTrace(); + fail( ee.getMessage() ); + } + } + + + /** + * Test a WhoAmI message with a DN authzId + */ + @Test + public void testDecodeWhoAmINoWhoAmIAuthzIdDN() + { + Asn1Decoder whoAmIResponseDecoder = new WhoAmIResponseDecoder(); + + ByteBuffer stream = ByteBuffer.allocate( 0x0E ); + + stream.put( new byte[] + { + 0x04, 0x0C, + 'd', 'n', ':', 'o', 'u', '=', 's', 'y', 's', 't', 'e', 'm' + } ).flip(); + + String decodedPdu = Strings.dumpBytes( stream.array() ); + + // Allocate a WhoAmI Container + Asn1Container whoAmIResponseContainer = new WhoAmIResponseContainer(); + + // Decode a WhoAmI message + try + { + whoAmIResponseDecoder.decode( stream, whoAmIResponseContainer ); + } + catch ( DecoderException de ) + { + fail(); + } + + WhoAmIResponseDecorator whoAmIResponse = ( (WhoAmIResponseContainer ) whoAmIResponseContainer ).getWhoAmIResponse(); + + assertNotNull( whoAmIResponse.getAuthzId() ); + assertEquals( "dn:ou=system", Strings.utf8ToString( whoAmIResponse.getAuthzId() ) ); + + + // Check the encoding + try + { + ByteBuffer bb = whoAmIResponse.encodeInternal(); + + String encodedPdu = Strings.dumpBytes( bb.array() ); + + assertEquals( encodedPdu, decodedPdu ); + } + catch ( EncoderException ee ) + { + ee.printStackTrace(); + fail( ee.getMessage() ); + } + } + + + /** + * Test a WhoAmI message with a UserId authzId + */ + @Test + public void testDecodeWhoAmINoWhoAmIAuthzIdUserId() + { + Asn1Decoder whoAmIResponseDecoder = new WhoAmIResponseDecoder(); + + ByteBuffer stream = ByteBuffer.allocate( 0x09 ); + + stream.put( new byte[] + { + 0x04, 0x07, + 'u', ':', 't', 'e', 's', 't', 0x00 + } ).flip(); + + String decodedPdu = Strings.dumpBytes( stream.array() ); + + // Allocate a WhoAmI Container + Asn1Container whoAmIResponseContainer = new WhoAmIResponseContainer(); + + // Decode a WhoAmI message + try + { + whoAmIResponseDecoder.decode( stream, whoAmIResponseContainer ); + } + catch ( DecoderException de ) + { + fail(); + } + + WhoAmIResponseDecorator whoAmIResponse = ( (WhoAmIResponseContainer ) whoAmIResponseContainer ).getWhoAmIResponse(); + + assertNotNull( whoAmIResponse.getAuthzId() ); + + // Check the encoding + try + { + ByteBuffer bb = whoAmIResponse.encodeInternal(); + + String encodedPdu = Strings.dumpBytes( bb.array() ); + + assertEquals( encodedPdu, decodedPdu ); + } + catch ( EncoderException ee ) + { + ee.printStackTrace(); + fail( ee.getMessage() ); + } + } +}