@@ -3,15 +3,15 @@ use picky::oids;
33use picky_asn1:: wrapper:: ExplicitContextTag1 ;
44use picky_krb:: constants:: gss_api:: { ACCEPT_COMPLETE , AP_REQ_TOKEN_ID } ;
55use picky_krb:: constants:: key_usages:: { AP_REQ_AUTHENTICATOR , TICKET_REP } ;
6- use picky_krb:: constants:: types:: NT_PRINCIPAL ;
6+ use picky_krb:: constants:: types:: { NT_ENTERPRISE , NT_PRINCIPAL } ;
77use picky_krb:: crypto:: CipherSuite ;
8- use picky_krb:: data_types:: { Authenticator , EncTicketPart , PrincipalName } ;
8+ use picky_krb:: data_types:: { Authenticator , EncTicketPart , KerberosStringAsn1 , PrincipalName } ;
99use picky_krb:: gss_api:: {
1010 ApplicationTag0 , GssApiNegInit , KrbMessage , MechTypeList , NegTokenInit , NegTokenTarg , NegTokenTarg1 ,
1111} ;
1212use picky_krb:: messages:: { ApReq , TgtReq } ;
1313
14- use crate :: { Error , ErrorKind , Result } ;
14+ use crate :: { Error , ErrorKind , Result , Username } ;
1515
1616/// Extract TGT request and mech types from the first token returned by the Kerberos client.
1717#[ instrument( ret, level = "trace" ) ]
@@ -170,17 +170,24 @@ pub(super) fn select_mech_type(mech_list: &MechTypeList) -> Result<ObjectIdentif
170170 ) )
171171}
172172
173- /// Extract username from the [PrincipalName].
174- pub ( super ) fn extract_username ( cname : & PrincipalName ) -> Result < String > {
173+ /// Constructs [Username] from the client's [PrincipalName] and realm.
174+ pub ( super ) fn client_upn ( cname : & PrincipalName , crealm : & KerberosStringAsn1 ) -> Result < Username > {
175+ let username = cname
176+ . name_string
177+ . 0
178+ . 0
179+ . first ( )
180+ . map ( |name| name. to_string ( ) )
181+ . ok_or_else ( || Error :: new ( ErrorKind :: InvalidToken , "missing cname value in token" ) ) ?;
182+
175183 let name_type = & cname. name_type . 0 . 0 ;
176184 if name_type == & [ NT_PRINCIPAL ] {
177- cname
178- . name_string
179- . 0
180- . 0
181- . first ( )
182- . map ( |name| name. to_string ( ) )
183- . ok_or_else ( || Error :: new ( ErrorKind :: InvalidToken , "missing cname value in token" ) )
185+ Ok ( Username :: new_upn (
186+ & username,
187+ & crealm. 0 . to_string ( ) . to_ascii_lowercase ( ) ,
188+ ) ?)
189+ } else if name_type == & [ NT_ENTERPRISE ] {
190+ Ok ( Username :: parse ( & username) ?)
184191 } else {
185192 Err ( Error :: new (
186193 ErrorKind :: InvalidToken ,
0 commit comments