1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.shared.kerberos.codec.actions;
21
22
23 import org.apache.directory.api.asn1.DecoderException;
24 import org.apache.directory.api.asn1.ber.Asn1Container;
25 import org.apache.directory.api.asn1.ber.grammar.GrammarAction;
26 import org.apache.directory.api.asn1.ber.tlv.BerValue;
27 import org.apache.directory.api.asn1.ber.tlv.IntegerDecoder;
28 import org.apache.directory.api.asn1.ber.tlv.IntegerDecoderException;
29 import org.apache.directory.api.asn1.ber.tlv.TLV;
30 import org.apache.directory.api.i18n.I18n;
31 import org.apache.directory.api.util.Strings;
32 import org.apache.directory.shared.kerberos.KerberosMessageType;
33 import org.apache.directory.shared.kerberos.codec.kdcRep.KdcRepContainer;
34 import org.apache.directory.shared.kerberos.codec.kdcReq.KdcReqContainer;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38
39
40
41
42
43
44 public abstract class AbstractReadMsgType<E extends Asn1Container> extends GrammarAction<E>
45 {
46
47 private static final Logger LOG = LoggerFactory.getLogger( AbstractReadMsgType.class );
48
49
50 private KerberosMessageType msgType = null;
51
52
53
54
55
56 public AbstractReadMsgType( String name )
57 {
58 super( name );
59 }
60
61
62
63
64
65 public AbstractReadMsgType( String name, KerberosMessageType msgType )
66 {
67 super( name );
68 this.msgType = msgType;
69 }
70
71
72
73
74
75 public final void action( E container ) throws DecoderException
76 {
77 TLV tlv = container.getCurrentTLV();
78
79
80 if ( tlv.getLength() != 1 )
81 {
82 LOG.error( I18n.err( I18n.ERR_01308_ZERO_LENGTH_TLV ) );
83
84
85 throw new DecoderException( I18n.err( I18n.ERR_01309_EMPTY_TLV ) );
86 }
87
88 BerValue value = tlv.getValue();
89
90 try
91 {
92 int msgTypeValue = IntegerDecoder.parse( value );
93
94 if ( msgType != null )
95 {
96 if ( msgType.getValue() == msgTypeValue )
97 {
98 LOG.debug( "msg-type : {}", msgType );
99
100 return;
101 }
102
103 String message = I18n.err( I18n.ERR_05102_INVALID_MESSAGE_ID, Strings.dumpBytes( value.getData() ) );
104 LOG.error( message );
105
106
107 throw new DecoderException( message );
108 }
109 else
110 {
111 KerberosMessageType messageType = KerberosMessageType.getTypeByValue( msgTypeValue );
112
113 if ( ( container instanceof KdcReqContainer )
114 && ( ( ( KdcReqContainer ) container ).getKdcReq().getMessageType() == messageType ) )
115 {
116 return;
117 }
118 else if ( ( container instanceof KdcRepContainer )
119 && ( ( ( KdcRepContainer ) container ).getKdcRep().getMessageType() == messageType ) )
120 {
121 return;
122 }
123
124 String message = I18n.err( I18n.ERR_05102_INVALID_MESSAGE_ID, Strings.dumpBytes( value.getData() ) );
125 LOG.error( message );
126
127
128 throw new DecoderException( message );
129 }
130 }
131 catch ( IntegerDecoderException ide )
132 {
133 LOG.error( I18n.err( I18n.ERR_05102_INVALID_MESSAGE_ID, Strings.dumpBytes( value.getData() ), ide
134 .getLocalizedMessage() ) );
135
136
137 throw new DecoderException( ide.getMessage() );
138 }
139 }
140 }