1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
43
44
45 public class ErrorMessageDecoder
46 {
47
48
49
50
51
52
53
54
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
70
71
72
73
74
75
76
77
78
79
80
81
82
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
101
102 break;
103 case 1:
104
105
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 }