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.changePwdData;
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.changePwdData.actions.ChangePasswdDataInit;
30 import org.apache.directory.shared.kerberos.codec.changePwdData.actions.StoreNewPassword;
31 import org.apache.directory.shared.kerberos.codec.changePwdData.actions.StoreTargName;
32 import org.apache.directory.shared.kerberos.codec.changePwdData.actions.StoreTargRealm;
33
34
35 /**
36 * This class implements the ChangePasswdData message. All the actions are declared
37 * in this class. As it is a singleton, these declaration are only done once. If
38 * an action is to be added or modified, this is where the work is to be done !
39 *
40 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
41 */
42 public final class ChangePasswdDataGrammar extends AbstractGrammar<ChangePasswdDataContainer>
43 {
44 /** The instance of grammar. ChangePasswdDataGrammar is a singleton */
45 private static Grammar<ChangePasswdDataContainer> instance = new ChangePasswdDataGrammar();
46
47
48 /**
49 * Creates a new ChangePasswdDataGrammar object.
50 */
51 @SuppressWarnings("unchecked")
52 private ChangePasswdDataGrammar()
53 {
54 setName( ChangePasswdDataGrammar.class.getName() );
55
56 // Create the transitions table
57 super.transitions = new GrammarTransition[ChangePasswdDataStatesEnum.LAST_CHNGPWD_STATE.ordinal()][256];
58
59 // ============================================================================================
60 // ChangePasswdData
61 // ============================================================================================
62 // --------------------------------------------------------------------------------------------
63 // Transition from START to ChangePasswdData SEQ
64 // --------------------------------------------------------------------------------------------
65 // This is the starting state :
66 // ChangePasswdData ::= SEQUENCE ...
67 super.transitions[ChangePasswdDataStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
68 new GrammarTransition<ChangePasswdDataContainer>(
69 ChangePasswdDataStatesEnum.START_STATE,
70 ChangePasswdDataStatesEnum.CHNGPWD_SEQ_STATE,
71 UniversalTag.SEQUENCE,
72 new ChangePasswdDataInit() );
73
74 // --------------------------------------------------------------------------------------------
75 // Transition from ChangePasswdData-SEQ to newPasswd tag
76 // --------------------------------------------------------------------------------------------
77 // ChangePasswdData ::= SEQUENCE {
78 // newPasswd [0]
79 super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_SEQ_STATE.ordinal()][KerberosConstants.CHNGPWD_NEWPWD_TAG] =
80 new GrammarTransition<ChangePasswdDataContainer>(
81 ChangePasswdDataStatesEnum.CHNGPWD_SEQ_STATE,
82 ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_TAG_STATE,
83 KerberosConstants.CHNGPWD_NEWPWD_TAG,
84 new CheckNotNullLength<ChangePasswdDataContainer>() );
85
86 // --------------------------------------------------------------------------------------------
87 // Transition from newPasswd tag to newPasswd
88 // --------------------------------------------------------------------------------------------
89 // ChangePasswdData ::= SEQUENCE {
90 // newPasswd [0] OCTET STRING,
91 super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_TAG_STATE.ordinal()][UniversalTag.OCTET_STRING
92 .getValue()] =
93 new GrammarTransition<ChangePasswdDataContainer>(
94 ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_TAG_STATE,
95 ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_STATE,
96 UniversalTag.OCTET_STRING,
97 new StoreNewPassword() );
98
99 // --------------------------------------------------------------------------------------------
100 // Transition from newPasswd to targName tag
101 // --------------------------------------------------------------------------------------------
102 // ChangePasswdData ::= SEQUENCE {
103 // newPasswd [0] OCTET STRING,
104 // targName [1] PrincipalName OPTIONAL,
105 super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_STATE.ordinal()][KerberosConstants.CHNGPWD_TARGNAME_TAG] =
106 new GrammarTransition<ChangePasswdDataContainer>(
107 ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_STATE,
108 ChangePasswdDataStatesEnum.CHNGPWD_TARGNAME_TAG_STATE,
109 KerberosConstants.CHNGPWD_TARGNAME_TAG,
110 new StoreTargName() );
111
112 // --------------------------------------------------------------------------------------------
113 // Transition from targName to targRealm tag
114 // --------------------------------------------------------------------------------------------
115 // ChangePasswdData ::= SEQUENCE {
116 // ...
117 // targName [1] PrincipalName OPTIONAL,
118 // targRealm [2]
119 super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_TARGNAME_TAG_STATE.ordinal()][KerberosConstants.CHNGPWD_TARGREALM_TAG] =
120 new GrammarTransition<ChangePasswdDataContainer>(
121 ChangePasswdDataStatesEnum.CHNGPWD_TARGNAME_TAG_STATE,
122 ChangePasswdDataStatesEnum.CHNGPWD_TARGREALM_TAG_STATE,
123 KerberosConstants.CHNGPWD_TARGREALM_TAG,
124 new CheckNotNullLength<ChangePasswdDataContainer>() );
125
126 // --------------------------------------------------------------------------------------------
127 // Transition from targRealm tag to targRealm
128 // --------------------------------------------------------------------------------------------
129 // ChangePasswdData ::= SEQUENCE {
130 // ...
131 // targName [1] PrincipalName OPTIONAL,
132 // targRealm [2] Realm OPTIONAL
133 super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_TARGREALM_TAG_STATE.ordinal()][UniversalTag.GENERAL_STRING
134 .getValue()] =
135 new GrammarTransition<ChangePasswdDataContainer>(
136 ChangePasswdDataStatesEnum.CHNGPWD_TARGREALM_TAG_STATE,
137 ChangePasswdDataStatesEnum.CHNGPWD_TARGREALM_STATE,
138 UniversalTag.GENERAL_STRING,
139 new StoreTargRealm() );
140
141 // --------------------------------------------------------------------------------------------
142 // Transition from newPasswd to targRealm tag
143 // --------------------------------------------------------------------------------------------
144 // ChangePasswdData ::= SEQUENCE {
145 // newPasswd [0] OCTET STRING,
146 // targRealm [2]
147 super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_STATE.ordinal()][KerberosConstants.CHNGPWD_TARGREALM_TAG] =
148 new GrammarTransition<ChangePasswdDataContainer>(
149 ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_STATE,
150 ChangePasswdDataStatesEnum.CHNGPWD_TARGREALM_TAG_STATE,
151 KerberosConstants.CHNGPWD_TARGREALM_TAG,
152 new CheckNotNullLength<ChangePasswdDataContainer>() );
153 }
154
155
156 /**
157 * Get the instance of this grammar
158 *
159 * @return An instance on the ChangePasswdData Grammar
160 */
161 public static Grammar<ChangePasswdDataContainer> getInstance()
162 {
163 return instance;
164 }
165 }