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.krbCred;
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.krbCred.actions.CheckMsgType;
030import org.apache.directory.shared.kerberos.codec.krbCred.actions.KrbCredInit;
031import org.apache.directory.shared.kerberos.codec.krbCred.actions.StoreEncPart;
032import org.apache.directory.shared.kerberos.codec.krbCred.actions.StorePvno;
033import org.apache.directory.shared.kerberos.codec.krbCred.actions.StoreTickets;
034import org.slf4j.Logger;
035import org.slf4j.LoggerFactory;
036
037
038/**
039 * This class implements the KrbCred structure. All the actions are declared
040 * in this class. As it is a singleton, these declaration are only done once. If
041 * an action is to be added or modified, this is where the work is to be done !
042 *
043 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
044 */
045public final class KrbCredGrammar extends AbstractGrammar<KrbCredContainer>
046{
047    /** The logger */
048    static final Logger LOG = LoggerFactory.getLogger( KrbCredGrammar.class );
049
050    /** A speedup for logger */
051    static final boolean IS_DEBUG = LOG.isDebugEnabled();
052
053    /** The instance of grammar. KrbCredCredGrammar is a singleton */
054    private static Grammar<KrbCredContainer> instance = new KrbCredGrammar();
055
056
057    /**
058     * Creates a new KrbCredGrammar object.
059     */
060    @SuppressWarnings("unchecked")
061    private KrbCredGrammar()
062    {
063        setName( KrbCredGrammar.class.getName() );
064
065        // Create the transitions table
066        super.transitions = new GrammarTransition[KrbCredStatesEnum.LAST_KRB_CRED_STATE.ordinal()][256];
067
068        // ============================================================================================
069        // KrbCred
070        // ============================================================================================
071
072        super.transitions[KrbCredStatesEnum.START_STATE.ordinal()][KerberosConstants.KRB_CRED_TAG] =
073            new GrammarTransition<KrbCredContainer>(
074                KrbCredStatesEnum.START_STATE, KrbCredStatesEnum.KRB_CRED_TAG_STATE, KerberosConstants.KRB_CRED_TAG,
075                new KrbCredInit() );
076
077        super.transitions[KrbCredStatesEnum.KRB_CRED_TAG_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
078            new GrammarTransition<KrbCredContainer>(
079                KrbCredStatesEnum.KRB_CRED_TAG_STATE,
080                KrbCredStatesEnum.KRB_CRED_SEQ_TAG_STATE,
081                UniversalTag.SEQUENCE,
082                new CheckNotNullLength<KrbCredContainer>() );
083
084        super.transitions[KrbCredStatesEnum.KRB_CRED_SEQ_TAG_STATE.ordinal()][KerberosConstants.KRB_CRED_PVNO_TAG] =
085            new GrammarTransition<KrbCredContainer>(
086                KrbCredStatesEnum.KRB_CRED_SEQ_TAG_STATE,
087                KrbCredStatesEnum.KRB_CRED_PVNO_TAG_STATE,
088                KerberosConstants.KRB_CRED_PVNO_TAG,
089                new CheckNotNullLength<KrbCredContainer>() );
090
091        super.transitions[KrbCredStatesEnum.KRB_CRED_PVNO_TAG_STATE.ordinal()][UniversalTag.INTEGER.getValue()] =
092            new GrammarTransition<KrbCredContainer>(
093                KrbCredStatesEnum.KRB_CRED_PVNO_TAG_STATE,
094                KrbCredStatesEnum.KRB_CRED_PVNO_STATE,
095                UniversalTag.INTEGER,
096                new StorePvno() );
097
098        super.transitions[KrbCredStatesEnum.KRB_CRED_PVNO_STATE.ordinal()][KerberosConstants.KRB_CRED_MSGTYPE_TAG] =
099            new GrammarTransition<KrbCredContainer>(
100                KrbCredStatesEnum.KRB_CRED_PVNO_STATE,
101                KrbCredStatesEnum.KRB_CRED_MSGTYPE_TAG_STATE,
102                KerberosConstants.KRB_CRED_MSGTYPE_TAG,
103                new CheckNotNullLength<KrbCredContainer>() );
104
105        super.transitions[KrbCredStatesEnum.KRB_CRED_MSGTYPE_TAG_STATE.ordinal()][UniversalTag.INTEGER.getValue()] =
106            new GrammarTransition<KrbCredContainer>(
107                KrbCredStatesEnum.KRB_CRED_MSGTYPE_TAG_STATE,
108                KrbCredStatesEnum.KRB_CRED_MSGTYPE_STATE,
109                UniversalTag.INTEGER,
110                new CheckMsgType() );
111
112        super.transitions[KrbCredStatesEnum.KRB_CRED_MSGTYPE_STATE.ordinal()][KerberosConstants.KRB_CRED_TICKETS_TAG] =
113            new GrammarTransition<KrbCredContainer>(
114                KrbCredStatesEnum.KRB_CRED_MSGTYPE_STATE,
115                KrbCredStatesEnum.KRB_CRED_TICKETS_TAG_STATE,
116                KerberosConstants.KRB_CRED_TICKETS_TAG,
117                new CheckNotNullLength<KrbCredContainer>() );
118
119        super.transitions[KrbCredStatesEnum.KRB_CRED_TICKETS_TAG_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
120            new GrammarTransition<KrbCredContainer>(
121                KrbCredStatesEnum.KRB_CRED_TICKETS_TAG_STATE,
122                KrbCredStatesEnum.KRB_CRED_TICKETS_STATE,
123                UniversalTag.SEQUENCE,
124                new CheckNotNullLength<KrbCredContainer>() );
125
126        super.transitions[KrbCredStatesEnum.KRB_CRED_TICKETS_STATE.ordinal()][KerberosConstants.TICKET_TAG] =
127            new GrammarTransition<KrbCredContainer>(
128                KrbCredStatesEnum.KRB_CRED_TICKETS_STATE,
129                KrbCredStatesEnum.KRB_CRED_TICKETS_STATE,
130                KerberosConstants.TICKET_TAG,
131                new StoreTickets() );
132
133        super.transitions[KrbCredStatesEnum.KRB_CRED_TICKETS_STATE.ordinal()][KerberosConstants.KRB_CRED_ENCPART_TAG] =
134            new GrammarTransition<KrbCredContainer>(
135                KrbCredStatesEnum.KRB_CRED_TICKETS_STATE,
136                KrbCredStatesEnum.KRB_CRED_ENCPART_TAG_STATE,
137                KerberosConstants.KRB_CRED_ENCPART_TAG,
138                new StoreEncPart() );
139    }
140
141
142    /**
143     * Get the instance of this grammar
144     *
145     * @return An instance on the KrbCredInfo Grammar
146     */
147    public static Grammar<KrbCredContainer> getInstance()
148    {
149        return instance;
150    }
151}