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.server.kerberos.shared.io.decoder;
21  
22  
23  import java.io.IOException;
24  import java.nio.ByteBuffer;
25  import java.util.Enumeration;
26  
27  import org.apache.directory.server.kerberos.shared.messages.ErrorMessage;
28  import org.apache.directory.server.kerberos.shared.messages.ErrorMessageModifier;
29  import org.apache.directory.server.kerberos.shared.messages.value.KerberosPrincipalModifier;
30  import org.apache.directory.shared.asn1.der.ASN1InputStream;
31  import org.apache.directory.shared.asn1.der.DERApplicationSpecific;
32  import org.apache.directory.shared.asn1.der.DEREncodable;
33  import org.apache.directory.shared.asn1.der.DERGeneralString;
34  import org.apache.directory.shared.asn1.der.DERGeneralizedTime;
35  import org.apache.directory.shared.asn1.der.DERInteger;
36  import org.apache.directory.shared.asn1.der.DEROctetString;
37  import org.apache.directory.shared.asn1.der.DERSequence;
38  import org.apache.directory.shared.asn1.der.DERTaggedObject;
39  
40  
41  /**
42   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
43   * @version $Rev$, $Date$
44   */
45  public class ErrorMessageDecoder
46  {
47      /**
48       * Decodes a {@link ByteBuffer} into an {@link ErrorMessage}.
49       * 
50       * KRB-ERROR       ::= [APPLICATION 30] SEQUENCE
51       *
52       * @param in
53       * @return The {@link ErrorMessage}.
54       * @throws IOException
55       */
56      public ErrorMessage decode( ByteBuffer in ) throws IOException
57      {
58          ASN1InputStream ais = new ASN1InputStream( in );
59  
60          DERApplicationSpecific app = ( DERApplicationSpecific ) ais.readObject();
61  
62          DERSequence errorMessage = ( DERSequence ) app.getObject();
63  
64          return decodeErrorMessageSequence( errorMessage );
65      }
66  
67  
68      /*
69       KRB-ERROR       ::= [APPLICATION 30] SEQUENCE {
70       pvno            [0] INTEGER (5),
71       msg-type        [1] INTEGER (30),
72       ctime           [2] KerberosTime OPTIONAL,
73       cusec           [3] Microseconds OPTIONAL,
74       stime           [4] KerberosTime,
75       susec           [5] Microseconds,
76       error-code      [6] Int32,
77       crealm          [7] Realm OPTIONAL,
78       cname           [8] PrincipalName OPTIONAL,
79       realm           [9] Realm -- service realm --,
80       sname           [10] PrincipalName -- service name --,
81       e-text          [11] KerberosString OPTIONAL,
82       e-data          [12] OCTET STRING OPTIONAL
83       }
84       */
85      private ErrorMessage decodeErrorMessageSequence( DERSequence sequence )
86      {
87          ErrorMessageModifier errorModifier = new ErrorMessageModifier();
88          KerberosPrincipalModifier clientModifier = new KerberosPrincipalModifier();
89          KerberosPrincipalModifier serverModifier = new KerberosPrincipalModifier();
90  
91          for ( Enumeration<DEREncodable> e = sequence.getObjects(); e.hasMoreElements(); )
92          {
93              DERTaggedObject object = ( DERTaggedObject ) e.nextElement();
94              int tag = object.getTagNo();
95              DEREncodable derObject = object.getObject();
96  
97              switch ( tag )
98              {
99                  case 0:
100                     // DERInteger tag0 = ( DERInteger ) derObject;
101                     // int pvno = tag0.intValue();
102                     break;
103                 case 1:
104                     // DERInteger tag1 = ( DERInteger ) derObject;
105                     // msgType = MessageType.getTypeByOrdinal( tag1.intValue() );
106                     break;
107                 case 2:
108                     DERGeneralizedTime tag2 = ( DERGeneralizedTime ) derObject;
109                     errorModifier.setClientTime( KerberosTimeDecoder.decode( tag2 ) );
110                     break;
111                 case 3:
112                     DERInteger tag3 = ( DERInteger ) derObject;
113                     errorModifier.setClientMicroSecond( tag3.intValue() );
114                     break;
115                 case 4:
116                     DERGeneralizedTime tag4 = ( DERGeneralizedTime ) derObject;
117                     errorModifier.setServerTime( KerberosTimeDecoder.decode( tag4 ) );
118                     break;
119                 case 5:
120                     DERInteger tag5 = ( DERInteger ) derObject;
121                     errorModifier.setServerMicroSecond( tag5.intValue() );
122                     break;
123                 case 6:
124                     DERInteger tag6 = ( DERInteger ) derObject;
125                     errorModifier.setErrorCode( tag6.intValue() );
126                     break;
127                 case 7:
128                     DERGeneralString tag7 = ( DERGeneralString ) derObject;
129                     clientModifier.setRealm( tag7.getString() );
130                     break;
131                 case 8:
132                     DERSequence tag8 = ( DERSequence ) derObject;
133                     clientModifier.setPrincipalName( PrincipalNameDecoder.decode( tag8 ) );
134                     break;
135                 case 9:
136                     DERGeneralString tag9 = ( DERGeneralString ) derObject;
137                     serverModifier.setRealm( tag9.getString() );
138                     break;
139                 case 10:
140                     DERSequence tag10 = ( DERSequence ) derObject;
141                     serverModifier.setPrincipalName( PrincipalNameDecoder.decode( tag10 ) );
142                     break;
143                 case 11:
144                     DERGeneralString tag11 = ( DERGeneralString ) derObject;
145                     errorModifier.setExplanatoryText( tag11.getString() );
146                     break;
147                 case 12:
148                     DEROctetString tag12 = ( DEROctetString ) derObject;
149                     errorModifier.setExplanatoryData( tag12.getOctets() );
150                     break;
151             }
152         }
153 
154         errorModifier.setClientPrincipal( clientModifier.getKerberosPrincipal() );
155         errorModifier.setServerPrincipal( serverModifier.getKerberosPrincipal() );
156 
157         return errorModifier.getErrorMessage();
158     }
159 }