blob: 90a552331bfcf267832f65382e7ee931ca1f9121 [file] [log] [blame]
/*
* 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.server.kerberos.protocol;
import static org.junit.Assert.fail;
import java.net.SocketAddress;
import org.apache.directory.api.asn1.DecoderException;
import org.apache.directory.api.util.Strings;
import org.apache.directory.server.kerberos.protocol.codec.MinaKerberosDecoder;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.DefaultTransportMetadata;
import org.apache.mina.core.session.IoSessionConfig;
import org.apache.mina.filter.codec.ProtocolCodecSession;
import org.junit.Before;
import org.junit.Test;
/**
* Tests decoding Kerberos requests when they arrive in fragments.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class FragmentDecoderTest
{
private static final String PACKET_1 = "000002446c8202403082023ca103020105a20302010ca38201c3308201bf308201bba103020101a28201b2048201ae6e8201aa308201a6a003020105a10302010ea20703050000000000a381ff6181fc3081f9a003020105a10d1b0b4558414d504c452e434f4da220301ea003020102a11730151b066b72627467741b0b4558414d504c452e434f4da381c03081bda003020111a281b50481b2a7f8ff7e97b294367dafcba2352df4a9ca0f92d3b634ea65186a8b2c87d0e86befbac66f7b8174f0d8bd924f2c862279993cb0cffbad517703a55bde4a0b524bea242ac5eda4c275d2b722a0748520d234e5cdfc78bb4d54d895b9682f05a7125dc42bdf810408cb4ad62b4038f547d1f375228c7fa301dbc8b849d637a65b1693595f5e55ed066704b95f0f55c5bb0ba3778e1d8a8104dfc886f57c38489a6c4c0ea1625ccf1cbad68542afed0e6709fb9fa4818e30818ba003020111a28183048180d0e2847754ac40b3332635034187eb1ede040ea0148f87f087e8246db8cce4843da15cb911be92b43155cb9218c18040c147b6a80af892662c0dd7a894ea392a4bbe5d71dfa3a2c4d5dea10301b41c5bfc4ab850ab3a75efd27d001369b052623c4d88795b498036d7c42d3517454f28198cb53eff76f6afb2646f9342a8ffe4a4693067a00703050000000000a20d1b0b4558414d504c452e434f4da31c301aa003020100a11330111b04485454501b096c6f63616c686f7374a511180f31393730303130313030303030305aa706020447611d21a814301202011202";
private static final String PACKET_2 = "0111020110020117020101020103";
private static final String COMBINED = PACKET_1 + PACKET_2;
private MinaKerberosDecoder decoder;
private ProtocolCodecSession session;
@Before
public void setup()
{
decoder = new MinaKerberosDecoder();
session = new ProtocolCodecSession();
// allow fragmentation
session.setTransportMetadata( new DefaultTransportMetadata( "mina", "dummy", false, true, SocketAddress.class,
IoSessionConfig.class, Object.class ) );
}
@Test
public void testDecodeKdcRequestFromFragments() throws Exception
{
// full packet at one
decoder.decode( session, prepareBuffer( COMBINED ), session.getDecoderOutput() );
// in fragments
decoder.decode( session, prepareBuffer( PACKET_1 ), session.getDecoderOutput() );
decoder.decode( session, prepareBuffer( PACKET_2 ), session.getDecoderOutput() );
}
@Test
public void testDecodeKdcRequestExactMaxPduSize() throws Exception
{
IoBuffer buf = prepareBuffer( COMBINED );
decoder.setMaxPduSize( buf.limit() - 4 ); // subtract 4 bytes used for prefixing length
// full packet at one
decoder.decode( session, prepareBuffer( COMBINED ), session.getDecoderOutput() );
// in fragments
decoder.decode( session, prepareBuffer( PACKET_1 ), session.getDecoderOutput() );
decoder.decode( session, prepareBuffer( PACKET_2 ), session.getDecoderOutput() );
}
@Test
public void testDecodeKdcRequestExceededMaxPduSize() throws Exception
{
IoBuffer buf = prepareBuffer( COMBINED );
decoder.setMaxPduSize( buf.limit() - 5 ); // subtract 5 bytes 'prefix length' + 1 extra byte to set to lower level
// full packet at one
try
{
decoder.decode( session, prepareBuffer( COMBINED ), session.getDecoderOutput() );
fail( "Must not decode due to max PDU size" );
}
catch ( DecoderException e )
{
}
// in fragments
try
{
decoder.setMaxPduSize( buf.limit() - 4 ); // set the MAX pdu len to the correct value
decoder.decode( session, prepareBuffer( PACKET_1 ), session.getDecoderOutput() );
// then feed a large second fragment
byte[] largeFragment = new byte[buf.limit() + 1000];
for ( int i = 0; i < largeFragment.length; i++ )
{
largeFragment[i] = ( byte ) i;
}
decoder.decode( session, IoBuffer.wrap( largeFragment ), session.getDecoderOutput() );
fail( "Must not decode due to max PDU size" );
}
catch ( DecoderException e )
{
}
}
private IoBuffer prepareBuffer( String str ) throws DecoderException
{
return IoBuffer.wrap( Strings.toByteArray( str ) );
}
}