1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.shared.kerberos.components;
21
22
23 import java.nio.BufferOverflowException;
24 import java.nio.ByteBuffer;
25 import java.text.ParseException;
26 import java.util.ArrayList;
27 import java.util.List;
28
29 import javax.security.auth.kerberos.KerberosPrincipal;
30
31 import org.apache.directory.api.asn1.Asn1Object;
32 import org.apache.directory.api.asn1.EncoderException;
33 import org.apache.directory.api.asn1.ber.tlv.BerValue;
34 import org.apache.directory.api.asn1.ber.tlv.TLV;
35 import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
36 import org.apache.directory.api.util.Strings;
37 import org.apache.directory.server.i18n.I18n;
38 import org.apache.directory.shared.kerberos.KerberosUtils;
39 import org.apache.directory.shared.kerberos.codec.types.PrincipalNameType;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42
43
44
45
46
47
48
49
50
51
52
53
54 public class PrincipalName implements Asn1Object
55 {
56
57 private static final Logger LOG = LoggerFactory.getLogger( PrincipalName.class );
58
59
60 private static final boolean IS_DEBUG = LOG.isDebugEnabled();
61
62
63 private PrincipalNameType nameType;
64
65
66 private List<String> nameString = new ArrayList<>();
67
68
69 private String realm;
70
71
72 private List<byte[]> nameBytes;
73
74
75 private int principalNameSeqLength;
76 private int principalTypeTagLength;
77 private int principalTypeLength;
78 private int principalStringsTagLength;
79 private int principalStringsSeqLength;
80
81
82
83
84
85 public PrincipalName()
86 {
87 }
88
89
90
91
92
93
94
95
96
97
98 public PrincipalName( KerberosPrincipal principal )
99 {
100 try
101 {
102 nameString = KerberosUtils.getNames( principal );
103 realm = principal.getRealm();
104 }
105 catch ( ParseException pe )
106 {
107 nameString = KerberosUtils.EMPTY_PRINCIPAL_NAME;
108 }
109
110 this.nameType = PrincipalNameType.getTypeByValue( principal.getNameType() );
111 }
112
113
114
115
116
117
118
119
120
121 public PrincipalName( String nameString, PrincipalNameType nameType ) throws ParseException
122 {
123 this.nameString = KerberosUtils.getNames( nameString );
124 this.nameType = nameType;
125 }
126
127
128
129
130
131
132
133
134
135 public PrincipalName( String[] nameParts, int nameType )
136 {
137 if ( nameParts == null || nameParts.length == 0 )
138 {
139 throw new IllegalArgumentException( "Empty name parts" );
140 }
141
142 List<String> nameComponents = new ArrayList<>();
143 for ( String np : nameParts )
144 {
145 nameComponents.add( np );
146 }
147
148 this.nameString = nameComponents;
149 this.nameType = PrincipalNameType.getTypeByValue( nameType );
150 }
151
152
153
154
155
156
157
158
159 public PrincipalName( String nameString, int nameType )
160 {
161 try
162 {
163 this.nameString = KerberosUtils.getNames( nameString );
164 }
165 catch ( ParseException pe )
166 {
167 throw new IllegalArgumentException( pe );
168 }
169
170 this.nameType = PrincipalNameType.getTypeByValue( nameType );
171 }
172
173
174
175
176
177
178
179 public PrincipalNameType getNameType()
180 {
181 return nameType;
182 }
183
184
185
186
187
188
189 public void setNameType( PrincipalNameType nameType )
190 {
191 this.nameType = nameType;
192 }
193
194
195
196
197
198
199 public void setNameType( int nameType )
200 {
201 this.nameType = PrincipalNameType.getTypeByValue( nameType );
202 }
203
204
205
206
207
208
209 public void setRealm( String realm )
210 {
211 this.realm = realm;
212 }
213
214
215
216
217
218
219 public String getRealm()
220 {
221 return realm;
222 }
223
224
225
226
227
228
229
230 public List<String> getNames()
231 {
232 return nameString;
233 }
234
235
236
237
238
239 public String getNameString()
240 {
241 if ( ( nameString == null ) || nameString.isEmpty() )
242 {
243 return "";
244 }
245 else
246 {
247 StringBuilder sb = new StringBuilder();
248 boolean isFirst = true;
249
250 for ( String name : nameString )
251 {
252 if ( isFirst )
253 {
254 isFirst = false;
255 }
256 else
257 {
258 sb.append( '/' );
259 }
260
261 sb.append( name );
262 }
263
264 return sb.toString();
265 }
266 }
267
268
269
270
271
272
273 public void addName( String name )
274 {
275 if ( nameString == null )
276 {
277 nameString = new ArrayList<>();
278 }
279
280 nameString.add( name );
281 }
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308 public int computeLength()
309 {
310
311 principalTypeLength = BerValue.getNbBytes( nameType.getValue() );
312 principalTypeTagLength = 1 + 1 + principalTypeLength;
313
314 principalNameSeqLength = 1 + TLV.getNbBytes( principalTypeTagLength ) + principalTypeTagLength;
315
316
317 if ( ( nameString == null ) || nameString.isEmpty() )
318 {
319 principalStringsSeqLength = 0;
320 }
321 else
322 {
323 principalStringsSeqLength = 0;
324 nameBytes = new ArrayList<>( nameString.size() );
325
326 for ( String name : nameString )
327 {
328 if ( name != null )
329 {
330 byte[] bytes = Strings.getBytesUtf8( name );
331 nameBytes.add( bytes );
332 principalStringsSeqLength += 1 + TLV.getNbBytes( bytes.length ) + bytes.length;
333 }
334 else
335 {
336 nameBytes.add( Strings.EMPTY_BYTES );
337 principalStringsSeqLength += 1 + 1;
338 }
339 }
340 }
341
342 principalStringsTagLength = 1 + TLV.getNbBytes( principalStringsSeqLength ) + principalStringsSeqLength;
343 principalNameSeqLength += 1 + TLV.getNbBytes( principalStringsTagLength ) + principalStringsTagLength;
344
345
346 return 1 + TLV.getNbBytes( principalNameSeqLength ) + principalNameSeqLength;
347 }
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369 public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
370 {
371 if ( buffer == null )
372 {
373 throw new EncoderException( I18n.err( I18n.ERR_148 ) );
374 }
375
376 try
377 {
378
379 buffer.put( UniversalTag.SEQUENCE.getValue() );
380 buffer.put( TLV.getBytes( principalNameSeqLength ) );
381
382
383 buffer.put( ( byte ) 0xA0 );
384 buffer.put( TLV.getBytes( principalTypeTagLength ) );
385 BerValue.encode( buffer, nameType.getValue() );
386
387
388 buffer.put( ( byte ) 0xA1 );
389 buffer.put( TLV.getBytes( principalStringsTagLength ) );
390
391
392 buffer.put( UniversalTag.SEQUENCE.getValue() );
393
394 if ( ( nameString == null ) || nameString.isEmpty() )
395 {
396 buffer.put( ( byte ) 0x00 );
397 }
398 else
399 {
400 buffer.put( TLV.getBytes( principalStringsSeqLength ) );
401
402
403 for ( byte[] name : nameBytes )
404 {
405 buffer.put( UniversalTag.GENERAL_STRING.getValue() );
406
407 if ( ( name == null ) || ( name.length == 0 ) )
408 {
409 buffer.put( ( byte ) 0x00 );
410 }
411 else
412 {
413 buffer.put( TLV.getBytes( name.length ) );
414 buffer.put( name );
415 }
416 }
417 }
418 }
419 catch ( BufferOverflowException boe )
420 {
421 LOG.error( I18n.err( I18n.ERR_146, 1 + TLV.getNbBytes( principalNameSeqLength )
422 + principalNameSeqLength, buffer.capacity() ) );
423 throw new EncoderException( I18n.err( I18n.ERR_138 ), boe );
424 }
425
426 if ( IS_DEBUG )
427 {
428 LOG.debug( "PrinipalName encoding : {}", Strings.dumpBytes( buffer.array() ) );
429 LOG.debug( "PrinipalName initial value : {}", this );
430 }
431
432 return buffer;
433 }
434
435
436
437
438
439 public String toString()
440 {
441 StringBuilder sb = new StringBuilder();
442
443 sb.append( "{ " );
444
445 sb.append( "name-type: " ).append( nameType.name() );
446
447 if ( ( nameString != null ) && !nameString.isEmpty() )
448 {
449 sb.append( ", name-string : <" );
450 boolean isFirst = true;
451
452 for ( String name : nameString )
453 {
454 if ( isFirst )
455 {
456 isFirst = false;
457 }
458 else
459 {
460 sb.append( ", " );
461 }
462
463 sb.append( '\'' ).append( name ).append( '\'' );
464 }
465
466 sb.append( ">" );
467 }
468 else
469 {
470 sb.append( " no name-string" );
471 }
472
473 if ( realm != null )
474 {
475 sb.append( "realm: " ).append( realm );
476 }
477
478 sb.append( " }" );
479
480 return sb.toString();
481 }
482
483
484 @Override
485 public int hashCode()
486 {
487 final int prime = 31;
488 int result = 1;
489 result = prime * result + ( ( nameString == null ) ? 0 : nameString.hashCode() );
490 result = prime * result + ( ( nameType == null ) ? 0 : nameType.hashCode() );
491 return result;
492 }
493
494
495
496
497
498 @Override
499 public boolean equals( Object obj )
500 {
501 if ( this == obj )
502 {
503 return true;
504 }
505
506 if ( !( obj instanceof PrincipalName ) )
507 {
508 return false;
509 }
510
511 PrincipalName./../../../org/apache/directory/shared/kerberos/components/PrincipalName.html#PrincipalName">PrincipalName other = ( PrincipalName ) obj;
512
513 if ( nameString == null )
514 {
515 if ( other.nameString != null )
516 {
517 return false;
518 }
519 }
520 else if ( !nameString.equals( other.nameString ) )
521 {
522 return false;
523 }
524
525 return nameType == other.nameType;
526 }
527
528 }