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.ticket;
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.ticket.actions.StoreEncPart;
30  import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreRealm;
31  import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreSName;
32  import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreTktVno;
33  import org.apache.directory.shared.kerberos.codec.ticket.actions.TicketInit;
34  
35  
36  /**
37   * This class implements the Ticket message. All the actions are declared
38   * in this class. As it is a singleton, these declaration are only done once. If
39   * an action is to be added or modified, this is where the work is to be done !
40   *
41   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
42   */
43  public final class TicketGrammar extends AbstractGrammar<TicketContainer>
44  {
45      /** The instance of grammar. TicketGrammar is a singleton */
46      private static Grammar<TicketContainer> instance = new TicketGrammar();
47  
48  
49      /**
50       * Creates a new TicketGrammar object.
51       */
52      @SuppressWarnings("unchecked")
53      private TicketGrammar()
54      {
55          setName( TicketGrammar.class.getName() );
56  
57          // Create the transitions table
58          super.transitions = new GrammarTransition[TicketStatesEnum.LAST_TICKET_STATE.ordinal()][256];
59  
60          // ============================================================================================
61          // Ticket
62          // ============================================================================================
63          // --------------------------------------------------------------------------------------------
64          // Transition from START to Ticket
65          // --------------------------------------------------------------------------------------------
66          // This is the starting state :
67          // Ticket          ::= [APPLICATION 1] ...
68          super.transitions[TicketStatesEnum.START_STATE.ordinal()][KerberosConstants.TICKET_TAG] =
69              new GrammarTransition<TicketContainer>(
70                  TicketStatesEnum.START_STATE,
71                  TicketStatesEnum.TICKET_STATE,
72                  KerberosConstants.TICKET_TAG,
73                  new TicketInit() );
74  
75          // --------------------------------------------------------------------------------------------
76          // Transition from Ticket to Ticket-SEQ
77          // --------------------------------------------------------------------------------------------
78          // Ticket          ::= [APPLICATION 1] SEQUENCE {
79          super.transitions[TicketStatesEnum.TICKET_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
80              new GrammarTransition<TicketContainer>(
81                  TicketStatesEnum.TICKET_STATE,
82                  TicketStatesEnum.TICKET_SEQ_STATE,
83                  UniversalTag.SEQUENCE,
84                  new CheckNotNullLength<TicketContainer>() );
85  
86          // --------------------------------------------------------------------------------------------
87          // Transition from Ticket-SEQ to tkt-vno tag
88          // --------------------------------------------------------------------------------------------
89          // Ticket          ::= [APPLICATION 1] SEQUENCE {
90          //         tkt-vno         [0]
91          super.transitions[TicketStatesEnum.TICKET_SEQ_STATE.ordinal()][KerberosConstants.TICKET_TKT_VNO_TAG] =
92              new GrammarTransition<TicketContainer>(
93                  TicketStatesEnum.TICKET_SEQ_STATE,
94                  TicketStatesEnum.TICKET_VNO_TAG_STATE,
95                  KerberosConstants.TICKET_TKT_VNO_TAG,
96                  new CheckNotNullLength<TicketContainer>() );
97  
98          // --------------------------------------------------------------------------------------------
99          // Transition from tkt-vno tag to tkt-vno
100         // --------------------------------------------------------------------------------------------
101         // Ticket          ::= [APPLICATION 1] SEQUENCE {
102         //         tkt-vno         [0] INTEGER (5),
103         super.transitions[TicketStatesEnum.TICKET_VNO_TAG_STATE.ordinal()][UniversalTag.INTEGER.getValue()] =
104             new GrammarTransition<TicketContainer>(
105                 TicketStatesEnum.TICKET_VNO_TAG_STATE,
106                 TicketStatesEnum.TICKET_VNO_STATE,
107                 UniversalTag.INTEGER,
108                 new StoreTktVno() );
109 
110         // --------------------------------------------------------------------------------------------
111         // Transition from tkt-vno to realm tag
112         // --------------------------------------------------------------------------------------------
113         // Ticket          ::= [APPLICATION 1] SEQUENCE {
114         //         tkt-vno         [0] INTEGER (5),
115         //         realm           [1]
116         super.transitions[TicketStatesEnum.TICKET_VNO_STATE.ordinal()][KerberosConstants.TICKET_REALM_TAG] =
117             new GrammarTransition<TicketContainer>(
118                 TicketStatesEnum.TICKET_VNO_STATE,
119                 TicketStatesEnum.TICKET_REALM_TAG_STATE,
120                 KerberosConstants.TICKET_REALM_TAG,
121                 new CheckNotNullLength<TicketContainer>() );
122 
123         // --------------------------------------------------------------------------------------------
124         // Transition from realm tag to realm value
125         // --------------------------------------------------------------------------------------------
126         // Ticket          ::= [APPLICATION 1] SEQUENCE {
127         //         tkt-vno         [0] INTEGER (5),
128         //         realm           [1] Realm,
129         super.transitions[TicketStatesEnum.TICKET_REALM_TAG_STATE.ordinal()][UniversalTag.GENERAL_STRING.getValue()] =
130             new GrammarTransition<TicketContainer>(
131                 TicketStatesEnum.TICKET_REALM_TAG_STATE,
132                 TicketStatesEnum.TICKET_REALM_STATE,
133                 UniversalTag.GENERAL_STRING,
134                 new StoreRealm() );
135 
136         // --------------------------------------------------------------------------------------------
137         // Transition from realm value to sname tag
138         // --------------------------------------------------------------------------------------------
139         // Ticket          ::= [APPLICATION 1] SEQUENCE {
140         //         tkt-vno         [0] INTEGER (5),
141         //         realm           [1] Realm,
142         //         sname           [2]
143         super.transitions[TicketStatesEnum.TICKET_REALM_STATE.ordinal()][KerberosConstants.TICKET_SNAME_TAG] =
144             new GrammarTransition<TicketContainer>(
145                 TicketStatesEnum.TICKET_REALM_STATE,
146                 TicketStatesEnum.TICKET_SNAME_TAG_STATE,
147                 KerberosConstants.TICKET_SNAME_TAG,
148                 new StoreSName() );
149 
150         // --------------------------------------------------------------------------------------------
151         // Transition from sname tag to enc-part tag
152         // --------------------------------------------------------------------------------------------
153         // Ticket          ::= [APPLICATION 1] SEQUENCE {
154         //         ...
155         //         sname           [2] PrincipalName,
156         //         enc-part        [3]
157         //
158         super.transitions[TicketStatesEnum.TICKET_SNAME_TAG_STATE.ordinal()][KerberosConstants.TICKET_ENC_PART_TAG] =
159             new GrammarTransition<TicketContainer>(
160                 TicketStatesEnum.TICKET_SNAME_TAG_STATE,
161                 TicketStatesEnum.TICKET_ENC_PART_TAG_STATE,
162                 KerberosConstants.TICKET_ENC_PART_TAG,
163                 new CheckNotNullLength<TicketContainer>() );
164 
165         // --------------------------------------------------------------------------------------------
166         // Transition from enc-part tag to enc-part value
167         // --------------------------------------------------------------------------------------------
168         // Ticket          ::= [APPLICATION 1] SEQUENCE {
169         //         ...
170         //         enc-part        [3] EncryptedData
171         //
172         super.transitions[TicketStatesEnum.TICKET_SNAME_TAG_STATE.ordinal()][KerberosConstants.TICKET_ENC_PART_TAG] =
173             new GrammarTransition<TicketContainer>(
174                 TicketStatesEnum.TICKET_SNAME_TAG_STATE,
175                 TicketStatesEnum.TICKET_ENC_PART_TAG_STATE,
176                 KerberosConstants.TICKET_ENC_PART_TAG,
177                 new StoreEncPart() );
178     }
179 
180 
181     /**
182      * Get the instance of this grammar
183      *
184      * @return An instance on the Ticket Grammar
185      */
186     public static Grammar<TicketContainer> getInstance()
187     {
188         return instance;
189     }
190 }