View Javadoc
1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License.
18   *
19   */
20  package org.apache.directory.shared.kerberos.codec.krbSafeBody;
21  
22  
23  import org.apache.directory.api.asn1.actions.CheckNotNullLength;
24  import org.apache.directory.api.asn1.ber.grammar.AbstractGrammar;
25  import org.apache.directory.api.asn1.ber.grammar.Grammar;
26  import org.apache.directory.api.asn1.ber.grammar.GrammarTransition;
27  import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
28  import org.apache.directory.shared.kerberos.KerberosConstants;
29  import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.KrbSafeBodyInit;
30  import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.StoreRecipientAddress;
31  import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.StoreSenderAddress;
32  import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.StoreSeqNumber;
33  import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.StoreTimestamp;
34  import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.StoreUsec;
35  import org.apache.directory.shared.kerberos.codec.krbSafeBody.actions.StoreUserData;
36  import org.slf4j.Logger;
37  import org.slf4j.LoggerFactory;
38  
39  
40  /**
41   * This class implements the KRB-SAFE-BODY structure. All the actions are declared
42   * in this class. As it is a singleton, these declaration are only done once. If
43   * an action is to be added or modified, this is where the work is to be done !
44   *
45   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
46   */
47  public final class KrbSafeBodyGrammar extends AbstractGrammar<KrbSafeBodyContainer>
48  {
49      /** The logger */
50      static final Logger LOG = LoggerFactory.getLogger( KrbSafeBodyGrammar.class );
51  
52      /** A speedup for logger */
53      static final boolean IS_DEBUG = LOG.isDebugEnabled();
54  
55      /** The instance of grammar. KrbSafeBodyGrammar is a singleton */
56      private static Grammar<KrbSafeBodyContainer> instance = new KrbSafeBodyGrammar();
57  
58  
59      /**
60       * Creates a new KrbSafeBodyGrammar object.
61       */
62      @SuppressWarnings("unchecked")
63      private KrbSafeBodyGrammar()
64      {
65          setName( KrbSafeBodyGrammar.class.getName() );
66  
67          // Create the transitions table
68          super.transitions = new GrammarTransition[KrbSafeBodyStatesEnum.LAST_KRB_SAFE_BODY_STATE.ordinal()][256];
69  
70          // ============================================================================================
71          // KrbSafeBody
72          // ============================================================================================
73          // --------------------------------------------------------------------------------------------
74          // Transition from KrbSafeBody init to KrbSafeBody seq
75          // --------------------------------------------------------------------------------------------
76          // KRB-SAFE-BODY   ::= SEQUENCE {
77          super.transitions[KrbSafeBodyStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
78              new GrammarTransition<KrbSafeBodyContainer>(
79                  KrbSafeBodyStatesEnum.START_STATE,
80                  KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_TAG_STATE,
81                  UniversalTag.SEQUENCE,
82                  new KrbSafeBodyInit() );
83  
84          // --------------------------------------------------------------------------------------------
85          // Transition from KrbSafeBody seq to user-data tag
86          // --------------------------------------------------------------------------------------------
87          // KRB-SAFE-BODY   ::= SEQUENCE {
88          // user-data       [0]
89          super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_TAG_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_USER_DATA_TAG] =
90              new GrammarTransition<KrbSafeBodyContainer>(
91                  KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_TAG_STATE,
92                  KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_TAG_STATE,
93                  KerberosConstants.KRB_SAFE_BODY_USER_DATA_TAG,
94                  new CheckNotNullLength<KrbSafeBodyContainer>() );
95  
96          // --------------------------------------------------------------------------------------------
97          // Transition from user-data tag to user-data value
98          // --------------------------------------------------------------------------------------------
99          // KRB-SAFE-BODY   ::= SEQUENCE {
100         // user-data       [0] OCTET STRING
101         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_TAG_STATE.ordinal()][UniversalTag.OCTET_STRING
102             .getValue()] =
103             new GrammarTransition<KrbSafeBodyContainer>(
104                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_TAG_STATE,
105                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE,
106                 UniversalTag.OCTET_STRING,
107                 new StoreUserData() );
108 
109         // --------------------------------------------------------------------------------------------
110         // Transition from user-data value to timestamp tag
111         // --------------------------------------------------------------------------------------------
112         // KRB-SAFE-BODY   ::= SEQUENCE {
113         // timestamp       [1]
114         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_TIMESTAMP_TAG] =
115             new GrammarTransition<KrbSafeBodyContainer>(
116                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE,
117                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_TIMESTAMP_TAG_STATE,
118                 KerberosConstants.KRB_SAFE_BODY_TIMESTAMP_TAG,
119                 new CheckNotNullLength<KrbSafeBodyContainer>() );
120 
121         // --------------------------------------------------------------------------------------------
122         // Transition from timestamp tag to timestamp value
123         // --------------------------------------------------------------------------------------------
124         // KRB-SAFE-BODY   ::= SEQUENCE {
125         // timestamp       [1] KerberosTime OPTIONAL
126         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_TIMESTAMP_TAG_STATE.ordinal()][UniversalTag.GENERALIZED_TIME
127             .getValue()] =
128             new GrammarTransition<KrbSafeBodyContainer>(
129                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_TIMESTAMP_TAG_STATE,
130                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_TIMESTAMP_STATE,
131                 UniversalTag.GENERALIZED_TIME,
132                 new StoreTimestamp() );
133 
134         // --------------------------------------------------------------------------------------------
135         // Transition from timestamp value to usec tag
136         // --------------------------------------------------------------------------------------------
137         // KRB-SAFE-BODY   ::= SEQUENCE {
138         // usec            [2]
139         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_TIMESTAMP_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_USEC_TAG] =
140             new GrammarTransition<KrbSafeBodyContainer>(
141                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_TIMESTAMP_STATE,
142                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_TAG_STATE,
143                 KerberosConstants.KRB_SAFE_BODY_USEC_TAG,
144                 new CheckNotNullLength<KrbSafeBodyContainer>() );
145 
146         // --------------------------------------------------------------------------------------------
147         // Transition from usec tag to usec value
148         // --------------------------------------------------------------------------------------------
149         // KRB-SAFE-BODY   ::= SEQUENCE {
150         // usec            [2] Microseconds OPTIONAL
151         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_TAG_STATE.ordinal()][UniversalTag.INTEGER.getValue()] =
152             new GrammarTransition<KrbSafeBodyContainer>(
153                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_TAG_STATE,
154                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_STATE,
155                 UniversalTag.INTEGER,
156                 new StoreUsec() );
157 
158         // --------------------------------------------------------------------------------------------
159         // Transition from usec value to seq-number tag
160         // --------------------------------------------------------------------------------------------
161         // KRB-SAFE-BODY   ::= SEQUENCE {
162         // seq-number      [3]
163         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_SEQ_NUMBER_TAG] =
164             new GrammarTransition<KrbSafeBodyContainer>(
165                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_STATE,
166                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_TAG_STATE,
167                 KerberosConstants.KRB_SAFE_BODY_SEQ_NUMBER_TAG,
168                 new CheckNotNullLength<KrbSafeBodyContainer>() );
169 
170         // --------------------------------------------------------------------------------------------
171         // Transition from seq-number tag to seq-number value
172         // --------------------------------------------------------------------------------------------
173         // KRB-SAFE-BODY   ::= SEQUENCE {
174         // seq-number      [3] UInt32 OPTIONAL
175         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_TAG_STATE.ordinal()][UniversalTag.INTEGER
176             .getValue()] =
177             new GrammarTransition<KrbSafeBodyContainer>(
178                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_TAG_STATE,
179                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_STATE,
180                 UniversalTag.INTEGER,
181                 new StoreSeqNumber() );
182 
183         // --------------------------------------------------------------------------------------------
184         // Transition from seq-number to s-address tag
185         // --------------------------------------------------------------------------------------------
186         // KRB-SAFE-BODY   ::= SEQUENCE {
187         // s-address       [4] HostAddress
188         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG] =
189             new GrammarTransition<KrbSafeBodyContainer>(
190                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_STATE,
191                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SENDER_ADDRESS_TAG_STATE,
192                 KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG,
193                 new StoreSenderAddress() );
194 
195         // --------------------------------------------------------------------------------------------
196         // Transition from s-address tag to r-address tag
197         // --------------------------------------------------------------------------------------------
198         // KRB-SAFE-BODY   ::= SEQUENCE {
199         // r-address       [5] HostAddress
200         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SENDER_ADDRESS_TAG_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_RECIPIENT_ADDRESS_TAG] =
201             new GrammarTransition<KrbSafeBodyContainer>(
202                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SENDER_ADDRESS_TAG_STATE,
203                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_RECIPIENT_ADDRESS_TAG_STATE,
204                 KerberosConstants.KRB_SAFE_BODY_RECIPIENT_ADDRESS_TAG,
205                 new StoreRecipientAddress() );
206 
207         //----------------------------- OPTIONAL transitions ---------------------------
208 
209         // --------------------------------------------------------------------------------------------
210         // Transition from user-data value to usec tag
211         // --------------------------------------------------------------------------------------------
212         // KRB-SAFE-BODY   ::= SEQUENCE {
213         // usec       [2]
214         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_USEC_TAG] =
215             new GrammarTransition<KrbSafeBodyContainer>(
216                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE,
217                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_TAG_STATE,
218                 KerberosConstants.KRB_SAFE_BODY_USEC_TAG,
219                 new CheckNotNullLength<KrbSafeBodyContainer>() );
220 
221         // --------------------------------------------------------------------------------------------
222         // Transition from user-data value to seq-number tag
223         // --------------------------------------------------------------------------------------------
224         // KRB-SAFE-BODY   ::= SEQUENCE {
225         // seq-number       [3]
226         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_SEQ_NUMBER_TAG] =
227             new GrammarTransition<KrbSafeBodyContainer>(
228                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE,
229                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SEQ_NUMBER_TAG_STATE,
230                 KerberosConstants.KRB_SAFE_BODY_SEQ_NUMBER_TAG,
231                 new CheckNotNullLength<KrbSafeBodyContainer>() );
232 
233         // --------------------------------------------------------------------------------------------
234         // Transition from user-data value to s-address tag
235         // --------------------------------------------------------------------------------------------
236         // KRB-SAFE-BODY   ::= SEQUENCE {
237         // s-address       [4]
238         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG] =
239             new GrammarTransition<KrbSafeBodyContainer>(
240                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USER_DATA_STATE,
241                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SENDER_ADDRESS_TAG_STATE,
242                 KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG,
243                 new StoreSenderAddress() );
244 
245         // --------------------------------------------------------------------------------------------
246         // Transition from usec value to s-address tag
247         // --------------------------------------------------------------------------------------------
248         // KRB-SAFE-BODY   ::= SEQUENCE {
249         // s-address       [4]
250         super.transitions[KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_STATE.ordinal()][KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG] =
251             new GrammarTransition<KrbSafeBodyContainer>(
252                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_USEC_STATE,
253                 KrbSafeBodyStatesEnum.KRB_SAFE_BODY_SENDER_ADDRESS_TAG_STATE,
254                 KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG,
255                 new StoreSenderAddress() );
256     }
257 
258 
259     /**
260      * Get the instance of this grammar
261      *
262      * @return An instance on the KRB-SAFE-BODY Grammar
263      */
264     public static Grammar<KrbSafeBodyContainer> getInstance()
265     {
266         return instance;
267     }
268 }