001/*
002 *  Licensed to the Apache Software Foundation (ASF) under one
003 *  or more contributor license agreements.  See the NOTICE file
004 *  distributed with this work for additional information
005 *  regarding copyright ownership.  The ASF licenses this file
006 *  to you under the Apache License, Version 2.0 (the
007 *  "License"); you may not use this file except in compliance
008 *  with the License.  You may obtain a copy of the License at
009 *
010 *    http://www.apache.org/licenses/LICENSE-2.0
011 *
012 *  Unless required by applicable law or agreed to in writing,
013 *  software distributed under the License is distributed on an
014 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 *  KIND, either express or implied.  See the License for the
016 *  specific language governing permissions and limitations
017 *  under the License.
018 *
019 */
020package org.apache.directory.shared.kerberos.codec.encTicketPart;
021
022
023import org.apache.directory.api.asn1.actions.CheckNotNullLength;
024import org.apache.directory.api.asn1.ber.grammar.AbstractGrammar;
025import org.apache.directory.api.asn1.ber.grammar.Grammar;
026import org.apache.directory.api.asn1.ber.grammar.GrammarTransition;
027import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
028import org.apache.directory.shared.kerberos.KerberosConstants;
029import org.apache.directory.shared.kerberos.codec.encTicketPart.actions.EncTicketPartInit;
030import org.apache.directory.shared.kerberos.codec.encTicketPart.actions.StoreAuthTime;
031import org.apache.directory.shared.kerberos.codec.encTicketPart.actions.StoreAuthorizationData;
032import org.apache.directory.shared.kerberos.codec.encTicketPart.actions.StoreCName;
033import org.apache.directory.shared.kerberos.codec.encTicketPart.actions.StoreCRealm;
034import org.apache.directory.shared.kerberos.codec.encTicketPart.actions.StoreCaddr;
035import org.apache.directory.shared.kerberos.codec.encTicketPart.actions.StoreEndTime;
036import org.apache.directory.shared.kerberos.codec.encTicketPart.actions.StoreFlags;
037import org.apache.directory.shared.kerberos.codec.encTicketPart.actions.StoreKey;
038import org.apache.directory.shared.kerberos.codec.encTicketPart.actions.StoreRenewtill;
039import org.apache.directory.shared.kerberos.codec.encTicketPart.actions.StoreStartTime;
040import org.apache.directory.shared.kerberos.codec.encTicketPart.actions.StoreTransited;
041import org.slf4j.Logger;
042import org.slf4j.LoggerFactory;
043
044
045/**
046 * This class implements the EncTicketPart structure. All the actions are declared
047 * in this class. As it is a singleton, these declaration are only done once. If
048 * an action is to be added or modified, this is where the work is to be done !
049 *
050 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
051 */
052public final class EncTicketPartGrammar extends AbstractGrammar<EncTicketPartContainer>
053{
054    /** The logger */
055    static final Logger LOG = LoggerFactory.getLogger( EncTicketPartGrammar.class );
056
057    /** A speedup for logger */
058    static final boolean IS_DEBUG = LOG.isDebugEnabled();
059
060    /** The instance of grammar. EncTicketPartGrammar is a singleton */
061    private static Grammar<EncTicketPartContainer> instance = new EncTicketPartGrammar();
062
063
064    /**
065     * Creates a new EncTicketPartGrammar object.
066     */
067    @SuppressWarnings("unchecked")
068    private EncTicketPartGrammar()
069    {
070        setName( EncTicketPartGrammar.class.getName() );
071
072        // Create the transitions table
073        super.transitions = new GrammarTransition[EncTicketPartStatesEnum.LAST_ENC_TICKET_PART_STATE.ordinal()][256];
074
075        // ============================================================================================
076        // EncTicketPart
077        // ============================================================================================
078        super.transitions[EncTicketPartStatesEnum.START_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_TAG] =
079            new GrammarTransition<EncTicketPartContainer>(
080                EncTicketPartStatesEnum.START_STATE,
081                EncTicketPartStatesEnum.ENC_TICKET_PART_TAG_STATE,
082                KerberosConstants.ENC_TICKET_PART_TAG,
083                new EncTicketPartInit() );
084
085        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_TAG_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
086            new GrammarTransition<EncTicketPartContainer>(
087                EncTicketPartStatesEnum.ENC_TICKET_PART_TAG_STATE,
088                EncTicketPartStatesEnum.ENC_TICKET_PART_SEQ_STATE,
089                UniversalTag.SEQUENCE,
090                new CheckNotNullLength<EncTicketPartContainer>() );
091
092        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_SEQ_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_FLAGS_TAG] =
093            new GrammarTransition<EncTicketPartContainer>(
094                EncTicketPartStatesEnum.ENC_TICKET_PART_SEQ_STATE,
095                EncTicketPartStatesEnum.ENC_TICKET_PART_FLAGS_TAG_STATE,
096                KerberosConstants.ENC_TICKET_PART_FLAGS_TAG,
097                new CheckNotNullLength<EncTicketPartContainer>() );
098
099        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_FLAGS_TAG_STATE.ordinal()][UniversalTag.BIT_STRING
100            .getValue()] =
101            new GrammarTransition<EncTicketPartContainer>(
102                EncTicketPartStatesEnum.ENC_TICKET_PART_FLAGS_TAG_STATE,
103                EncTicketPartStatesEnum.ENC_TICKET_PART_FLAGS_STATE,
104                UniversalTag.BIT_STRING,
105                new StoreFlags() );
106
107        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_FLAGS_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_KEY_TAG] =
108            new GrammarTransition<EncTicketPartContainer>(
109                EncTicketPartStatesEnum.ENC_TICKET_PART_FLAGS_STATE,
110                EncTicketPartStatesEnum.ENC_TICKET_PART_KEY_TAG_STATE,
111                KerberosConstants.ENC_TICKET_PART_KEY_TAG,
112                new StoreKey() );
113
114        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_KEY_TAG_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_CREALM_TAG] =
115            new GrammarTransition<EncTicketPartContainer>(
116                EncTicketPartStatesEnum.ENC_TICKET_PART_KEY_TAG_STATE,
117                EncTicketPartStatesEnum.ENC_TICKET_PART_CREALM_TAG_STATE,
118                KerberosConstants.ENC_TICKET_PART_CREALM_TAG,
119                new CheckNotNullLength<EncTicketPartContainer>() );
120
121        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_CREALM_TAG_STATE.ordinal()][UniversalTag.GENERAL_STRING
122            .getValue()] =
123            new GrammarTransition<EncTicketPartContainer>(
124                EncTicketPartStatesEnum.ENC_TICKET_PART_CREALM_TAG_STATE,
125                EncTicketPartStatesEnum.ENC_TICKET_PART_CREALM_STATE,
126                UniversalTag.GENERAL_STRING,
127                new StoreCRealm() );
128
129        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_CREALM_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_CNAME_TAG] =
130            new GrammarTransition<EncTicketPartContainer>(
131                EncTicketPartStatesEnum.ENC_TICKET_PART_CREALM_STATE,
132                EncTicketPartStatesEnum.ENC_TICKET_PART_CNAME_TAG_STATE,
133                KerberosConstants.ENC_TICKET_PART_CNAME_TAG,
134                new StoreCName() );
135
136        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_CNAME_TAG_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_TRANSITED_TAG] =
137            new GrammarTransition<EncTicketPartContainer>(
138                EncTicketPartStatesEnum.ENC_TICKET_PART_CNAME_TAG_STATE,
139                EncTicketPartStatesEnum.ENC_TICKET_PART_TRANSITED_TAG_STATE,
140                KerberosConstants.ENC_TICKET_PART_TRANSITED_TAG,
141                new StoreTransited() );
142
143        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_TRANSITED_TAG_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_AUTHTIME_TAG] =
144            new GrammarTransition<EncTicketPartContainer>(
145                EncTicketPartStatesEnum.ENC_TICKET_PART_TRANSITED_TAG_STATE,
146                EncTicketPartStatesEnum.ENC_TICKET_PART_AUTHTIME_TAG_STATE,
147                KerberosConstants.ENC_TICKET_PART_AUTHTIME_TAG,
148                new CheckNotNullLength<EncTicketPartContainer>() );
149
150        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_AUTHTIME_TAG_STATE.ordinal()][UniversalTag.GENERALIZED_TIME
151            .getValue()] =
152            new GrammarTransition<EncTicketPartContainer>(
153                EncTicketPartStatesEnum.ENC_TICKET_PART_AUTHTIME_TAG_STATE,
154                EncTicketPartStatesEnum.ENC_TICKET_PART_AUTHTIME_STATE,
155                UniversalTag.GENERALIZED_TIME,
156                new StoreAuthTime() );
157
158        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_AUTHTIME_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_STARTTIME_TAG] =
159            new GrammarTransition<EncTicketPartContainer>(
160                EncTicketPartStatesEnum.ENC_TICKET_PART_AUTHTIME_STATE,
161                EncTicketPartStatesEnum.ENC_TICKET_PART_STARTTIME_TAG_STATE,
162                KerberosConstants.ENC_TICKET_PART_STARTTIME_TAG,
163                new CheckNotNullLength<EncTicketPartContainer>() );
164
165        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_STARTTIME_TAG_STATE.ordinal()][UniversalTag.GENERALIZED_TIME
166            .getValue()] =
167            new GrammarTransition<EncTicketPartContainer>(
168                EncTicketPartStatesEnum.ENC_TICKET_PART_STARTTIME_TAG_STATE,
169                EncTicketPartStatesEnum.ENC_TICKET_PART_STARTTIME_STATE,
170                UniversalTag.GENERALIZED_TIME,
171                new StoreStartTime() );
172
173        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_STARTTIME_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_ENDTIME_TAG] =
174            new GrammarTransition<EncTicketPartContainer>(
175                EncTicketPartStatesEnum.ENC_TICKET_PART_STARTTIME_STATE,
176                EncTicketPartStatesEnum.ENC_TICKET_PART_ENDTIME_TAG_STATE,
177                KerberosConstants.ENC_TICKET_PART_ENDTIME_TAG,
178                new CheckNotNullLength<EncTicketPartContainer>() );
179
180        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_ENDTIME_TAG_STATE.ordinal()][UniversalTag.GENERALIZED_TIME
181            .getValue()] =
182            new GrammarTransition<EncTicketPartContainer>(
183                EncTicketPartStatesEnum.ENC_TICKET_PART_ENDTIME_TAG_STATE,
184                EncTicketPartStatesEnum.ENC_TICKET_PART_ENDTIME_STATE,
185                UniversalTag.GENERALIZED_TIME,
186                new StoreEndTime() );
187
188        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_ENDTIME_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_RENEWTILL_TAG] =
189            new GrammarTransition<EncTicketPartContainer>(
190                EncTicketPartStatesEnum.ENC_TICKET_PART_ENDTIME_STATE,
191                EncTicketPartStatesEnum.ENC_TICKET_PART_RENEWTILL_TAG_STATE,
192                KerberosConstants.ENC_TICKET_PART_RENEWTILL_TAG,
193                new CheckNotNullLength<EncTicketPartContainer>() );
194
195        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_RENEWTILL_TAG_STATE.ordinal()][UniversalTag.GENERALIZED_TIME
196            .getValue()] =
197            new GrammarTransition<EncTicketPartContainer>(
198                EncTicketPartStatesEnum.ENC_TICKET_PART_RENEWTILL_TAG_STATE,
199                EncTicketPartStatesEnum.ENC_TICKET_PART_RENEWTILL_STATE,
200                UniversalTag.GENERALIZED_TIME,
201                new StoreRenewtill() );
202
203        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_RENEWTILL_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_CADDR_TAG] =
204            new GrammarTransition<EncTicketPartContainer>(
205                EncTicketPartStatesEnum.ENC_TICKET_PART_RENEWTILL_STATE,
206                EncTicketPartStatesEnum.ENC_TICKET_PART_CADDR_TAG_STATE,
207                KerberosConstants.ENC_TICKET_PART_CADDR_TAG,
208                new StoreCaddr() );
209
210        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_CADDR_TAG_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_AUTHORIZATION_DATA_TAG] =
211            new GrammarTransition<EncTicketPartContainer>(
212                EncTicketPartStatesEnum.ENC_TICKET_PART_CADDR_TAG_STATE,
213                EncTicketPartStatesEnum.ENC_TICKET_PART_AUTHZ_DATA_TAG_STATE,
214                KerberosConstants.ENC_TICKET_PART_AUTHORIZATION_DATA_TAG,
215                new StoreAuthorizationData() );
216
217        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_AUTHTIME_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_ENDTIME_TAG] =
218            new GrammarTransition<EncTicketPartContainer>(
219                EncTicketPartStatesEnum.ENC_TICKET_PART_AUTHTIME_STATE,
220                EncTicketPartStatesEnum.ENC_TICKET_PART_ENDTIME_TAG_STATE,
221                KerberosConstants.ENC_TICKET_PART_ENDTIME_TAG,
222                new CheckNotNullLength<EncTicketPartContainer>() );
223
224        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_ENDTIME_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_CADDR_TAG] =
225            new GrammarTransition<EncTicketPartContainer>(
226                EncTicketPartStatesEnum.ENC_TICKET_PART_ENDTIME_STATE,
227                EncTicketPartStatesEnum.ENC_TICKET_PART_CADDR_TAG_STATE,
228                KerberosConstants.ENC_TICKET_PART_CADDR_TAG,
229                new StoreCaddr() );
230
231        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_ENDTIME_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_AUTHORIZATION_DATA_TAG] =
232            new GrammarTransition<EncTicketPartContainer>(
233                EncTicketPartStatesEnum.ENC_TICKET_PART_ENDTIME_STATE,
234                EncTicketPartStatesEnum.ENC_TICKET_PART_AUTHZ_DATA_TAG_STATE,
235                KerberosConstants.ENC_TICKET_PART_AUTHORIZATION_DATA_TAG,
236                new StoreAuthorizationData() );
237
238        super.transitions[EncTicketPartStatesEnum.ENC_TICKET_PART_RENEWTILL_STATE.ordinal()][KerberosConstants.ENC_TICKET_PART_AUTHORIZATION_DATA_TAG] =
239            new GrammarTransition<EncTicketPartContainer>(
240                EncTicketPartStatesEnum.ENC_TICKET_PART_RENEWTILL_STATE,
241                EncTicketPartStatesEnum.ENC_TICKET_PART_AUTHZ_DATA_TAG_STATE,
242                KerberosConstants.ENC_TICKET_PART_AUTHORIZATION_DATA_TAG,
243                new StoreAuthorizationData() );
244    }
245
246
247    /**
248     * Get the instance of this grammar
249     *
250     * @return An instance on the EncTicketPart Grammar
251     */
252    public static Grammar<EncTicketPartContainer> getInstance()
253    {
254        return instance;
255    }
256}