@@ -165,7 +165,7 @@ impl CredentialInjectionKdc {
165165 }
166166
167167 pub ( crate ) fn krb_kdc ( & self ) -> Option < & crate :: target_addr:: TargetAddr > {
168- self . connection_options . as_ref ( ) ?. krb_kdc . as_ref ( )
168+ self . connection_options . as_ref ( ) ?. krb_kdc ( )
169169 }
170170
171171 /// Selects the CredSSP acceptor backend Gateway should present to the RDP client.
@@ -445,7 +445,7 @@ fn random_32_bytes() -> Vec<u8> {
445445/// live here, and the two are keyed by the same JTI but never reach into each other. Resolution
446446/// reads the provisioning store passed in by the caller.
447447#[ derive( Debug , Clone ) ]
448- pub struct CredentialService {
448+ pub struct CredentialInjectionKdcService {
449449 sessions : Arc < Mutex < HashMap < Uuid , CachedSession > > > ,
450450}
451451
@@ -460,13 +460,13 @@ struct CachedSession {
460460 session : Arc < CredentialInjectionKdcSession > ,
461461}
462462
463- impl Default for CredentialService {
463+ impl Default for CredentialInjectionKdcService {
464464 fn default ( ) -> Self {
465465 Self :: new ( )
466466 }
467467}
468468
469- impl CredentialService {
469+ impl CredentialInjectionKdcService {
470470 pub fn new ( ) -> Self {
471471 Self {
472472 sessions : Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ,
@@ -541,11 +541,8 @@ impl CredentialService {
541541 } ) ?;
542542
543543 let proxy_username = app_credential_username ( & mapping. proxy ) . to_owned ( ) ;
544- // Atomic get-or-derive under the lock: guarantees a single session wins per JTI even under
545- // concurrent calls. A cached session is reused only when it was derived for this exact
546- // provisioning entry — a re-provisioning produces a new entry, so its stale session is
547- // dropped and re-derived here. Derivation is fast (a few hundred bytes of OsRng), so holding
548- // the lock across it is acceptable.
544+ // Hold the lock across derive so one session wins per JTI; reuse only if the cached session
545+ // was derived for this exact entry (re-provisioning yields a new entry, forcing a re-derive).
549546 let session = {
550547 let mut sessions = self . sessions . lock ( ) ;
551548 let reuse = sessions. get ( & jti) . and_then ( |cached| {
@@ -584,7 +581,7 @@ impl CredentialService {
584581}
585582
586583pub struct CleanupTask {
587- pub service : CredentialService ,
584+ pub service : CredentialInjectionKdcService ,
588585}
589586
590587#[ async_trait]
@@ -600,7 +597,7 @@ impl Task for CleanupTask {
600597}
601598
602599#[ instrument( skip_all) ]
603- async fn cleanup_task ( service : CredentialService , mut shutdown_signal : ShutdownSignal ) {
600+ async fn cleanup_task ( service : CredentialInjectionKdcService , mut shutdown_signal : ShutdownSignal ) {
604601 use tokio:: time:: { Duration , sleep} ;
605602
606603 const TASK_INTERVAL : Duration = Duration :: from_secs ( 60 * 15 ) ; // 15 minutes
@@ -719,7 +716,7 @@ mod tests {
719716
720717 #[ test]
721718 fn service_kdc_for_rejects_expired_credential_entry ( ) {
722- let service = CredentialService :: new ( ) ;
719+ let service = CredentialInjectionKdcService :: new ( ) ;
723720 let jti = Uuid :: new_v4 ( ) ;
724721
725722 // Negative TTL: entry is born already expired. `TokenKeyedStore::get` does not
@@ -738,7 +735,7 @@ mod tests {
738735
739736 #[ test]
740737 fn service_kdc_for_returns_same_session_under_concurrent_calls ( ) {
741- let service = CredentialService :: new ( ) ;
738+ let service = CredentialInjectionKdcService :: new ( ) ;
742739 let jti = Uuid :: new_v4 ( ) ;
743740 let provisioning = provisioned_store ( jti, "target" , time:: Duration :: minutes ( 5 ) ) ;
744741
@@ -758,7 +755,7 @@ mod tests {
758755
759756 #[ test]
760757 fn service_kdc_for_ignores_cached_session_from_a_gone_entry ( ) {
761- let service = CredentialService :: new ( ) ;
758+ let service = CredentialInjectionKdcService :: new ( ) ;
762759 let jti = Uuid :: new_v4 ( ) ;
763760
764761 // Simulate the race called out by Codex: a previous provisioning's session is still cached,
@@ -784,7 +781,7 @@ mod tests {
784781
785782 #[ test]
786783 fn service_kdc_for_rederives_session_after_reprovisioning ( ) {
787- let service = CredentialService :: new ( ) ;
784+ let service = CredentialInjectionKdcService :: new ( ) ;
788785 let jti = Uuid :: new_v4 ( ) ;
789786 let provisioning = provisioned_store ( jti, "target" , time:: Duration :: minutes ( 5 ) ) ;
790787
@@ -816,7 +813,7 @@ mod tests {
816813
817814 #[ test]
818815 fn service_sweep_orphans_drops_sessions_with_no_credential_entry ( ) {
819- let service = CredentialService :: new ( ) ;
816+ let service = CredentialInjectionKdcService :: new ( ) ;
820817 let jti = Uuid :: new_v4 ( ) ;
821818
822819 {
@@ -889,7 +886,7 @@ mod tests {
889886
890887 #[ test]
891888 fn service_kdc_for_rejects_unknown_jti ( ) {
892- let service = CredentialService :: new ( ) ;
889+ let service = CredentialInjectionKdcService :: new ( ) ;
893890 let provisioning = ProvisioningStore :: new ( ) ;
894891
895892 assert ! (
@@ -903,7 +900,7 @@ mod tests {
903900
904901 #[ test]
905902 fn service_kdc_for_rejects_non_injection_entry ( ) {
906- let service = CredentialService :: new ( ) ;
903+ let service = CredentialInjectionKdcService :: new ( ) ;
907904 let provisioning = ProvisioningStore :: new ( ) ;
908905 let jti = Uuid :: new_v4 ( ) ;
909906
@@ -922,7 +919,7 @@ mod tests {
922919
923920 #[ test]
924921 fn service_kdc_for_lazily_extracts_target_hostname_from_entry_token ( ) {
925- let service = CredentialService :: new ( ) ;
922+ let service = CredentialInjectionKdcService :: new ( ) ;
926923 let jti = Uuid :: new_v4 ( ) ;
927924 let provisioning = provisioned_store ( jti, "target" , time:: Duration :: minutes ( 5 ) ) ;
928925
@@ -936,7 +933,7 @@ mod tests {
936933 #[ test]
937934 fn provisioning_and_credential_service_share_target_options ( ) {
938935 let provisioning = ProvisioningStore :: new ( ) ;
939- let service = CredentialService :: new ( ) ;
936+ let service = CredentialInjectionKdcService :: new ( ) ;
940937 let jti = Uuid :: new_v4 ( ) ;
941938 let token = association_token ( jti) ;
942939 let krb_kdc = crate :: target_addr:: TargetAddr :: parse ( "tcp://kdc.example.invalid:88" , Some ( 88 ) )
@@ -946,9 +943,7 @@ mod tests {
946943 . insert (
947944 token. clone ( ) ,
948945 Some ( cleartext_mapping_with_target_username ( "target@example.invalid" ) ) ,
949- Some ( TargetConnectionOptions {
950- krb_kdc : Some ( krb_kdc. clone ( ) ) ,
951- } ) ,
946+ Some ( TargetConnectionOptions :: new ( Some ( krb_kdc. clone ( ) ) ) . expect ( "supported KDC scheme" ) ) ,
952947 time:: Duration :: minutes ( 5 ) ,
953948 )
954949 . expect ( "provisioning entry inserts" ) ;
@@ -959,7 +954,7 @@ mod tests {
959954 . value
960955 . connection_options
961956 . as_ref( )
962- . and_then( |options| options. krb_kdc. as_ref ( ) ) ,
957+ . and_then( |options| options. krb_kdc( ) ) ,
963958 Some ( & krb_kdc)
964959 ) ;
965960
0 commit comments