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.ticket;
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.ticket.actions.StoreEncPart;
030import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreRealm;
031import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreSName;
032import org.apache.directory.shared.kerberos.codec.ticket.actions.StoreTktVno;
033import org.apache.directory.shared.kerberos.codec.ticket.actions.TicketInit;
034
035
036/**
037 * This class implements the Ticket message. All the actions are declared
038 * in this class. As it is a singleton, these declaration are only done once. If
039 * an action is to be added or modified, this is where the work is to be done !
040 *
041 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
042 */
043public final class TicketGrammar extends AbstractGrammar<TicketContainer>
044{
045    /** The instance of grammar. TicketGrammar is a singleton */
046    private static Grammar<TicketContainer> instance = new TicketGrammar();
047
048
049    /**
050     * Creates a new TicketGrammar object.
051     */
052    @SuppressWarnings("unchecked")
053    private TicketGrammar()
054    {
055        setName( TicketGrammar.class.getName() );
056
057        // Create the transitions table
058        super.transitions = new GrammarTransition[TicketStatesEnum.LAST_TICKET_STATE.ordinal()][256];
059
060        // ============================================================================================
061        // Ticket
062        // ============================================================================================
063        // --------------------------------------------------------------------------------------------
064        // Transition from START to Ticket
065        // --------------------------------------------------------------------------------------------
066        // This is the starting state :
067        // Ticket          ::= [APPLICATION 1] ...
068        super.transitions[TicketStatesEnum.START_STATE.ordinal()][KerberosConstants.TICKET_TAG] =
069            new GrammarTransition<TicketContainer>(
070                TicketStatesEnum.START_STATE,
071                TicketStatesEnum.TICKET_STATE,
072                KerberosConstants.TICKET_TAG,
073                new TicketInit() );
074
075        // --------------------------------------------------------------------------------------------
076        // Transition from Ticket to Ticket-SEQ
077        // --------------------------------------------------------------------------------------------
078        // Ticket          ::= [APPLICATION 1] SEQUENCE {
079        super.transitions[TicketStatesEnum.TICKET_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
080            new GrammarTransition<TicketContainer>(
081                TicketStatesEnum.TICKET_STATE,
082                TicketStatesEnum.TICKET_SEQ_STATE,
083                UniversalTag.SEQUENCE,
084                new CheckNotNullLength<TicketContainer>() );
085
086        // --------------------------------------------------------------------------------------------
087        // Transition from Ticket-SEQ to tkt-vno tag
088        // --------------------------------------------------------------------------------------------
089        // Ticket          ::= [APPLICATION 1] SEQUENCE {
090        //         tkt-vno         [0]
091        super.transitions[TicketStatesEnum.TICKET_SEQ_STATE.ordinal()][KerberosConstants.TICKET_TKT_VNO_TAG] =
092            new GrammarTransition<TicketContainer>(
093                TicketStatesEnum.TICKET_SEQ_STATE,
094                TicketStatesEnum.TICKET_VNO_TAG_STATE,
095                KerberosConstants.TICKET_TKT_VNO_TAG,
096                new CheckNotNullLength<TicketContainer>() );
097
098        // --------------------------------------------------------------------------------------------
099        // 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}