@@ -149,6 +149,61 @@ impl IdProvider for HimmelblauMultiProvider {
149
149
Ok ( ( ) )
150
150
}
151
151
152
+ async fn unix_user_access (
153
+ & self ,
154
+ id : & Id ,
155
+ scopes : Vec < String > ,
156
+ old_token : Option < & UserToken > ,
157
+ tpm : & mut tpm:: BoxedDynTpm ,
158
+ machine_key : & tpm:: MachineKey ,
159
+ ) -> Result < UnixUserToken , IdpError > {
160
+ let account_id = match old_token {
161
+ Some ( token) => token. spn . clone ( ) ,
162
+ None => id. to_string ( ) . clone ( ) ,
163
+ } ;
164
+ match split_username ( & account_id) {
165
+ Some ( ( _sam, domain) ) => {
166
+ let providers = self . providers . read ( ) . await ;
167
+ match providers. get ( domain) {
168
+ Some ( provider) => {
169
+ provider
170
+ . unix_user_access ( id, scopes, old_token, tpm, machine_key)
171
+ . await
172
+ }
173
+ None => Err ( IdpError :: NotFound ) ,
174
+ }
175
+ }
176
+ None => Err ( IdpError :: NotFound ) ,
177
+ }
178
+ }
179
+
180
+ async fn unix_user_prt_cookie (
181
+ & self ,
182
+ id : & Id ,
183
+ old_token : Option < & UserToken > ,
184
+ tpm : & mut tpm:: BoxedDynTpm ,
185
+ machine_key : & tpm:: MachineKey ,
186
+ ) -> Result < String , IdpError > {
187
+ let account_id = match old_token {
188
+ Some ( token) => token. spn . clone ( ) ,
189
+ None => id. to_string ( ) . clone ( ) ,
190
+ } ;
191
+ match split_username ( & account_id) {
192
+ Some ( ( _sam, domain) ) => {
193
+ let providers = self . providers . read ( ) . await ;
194
+ match providers. get ( domain) {
195
+ Some ( provider) => {
196
+ provider
197
+ . unix_user_prt_cookie ( id, old_token, tpm, machine_key)
198
+ . await
199
+ }
200
+ None => Err ( IdpError :: NotFound ) ,
201
+ }
202
+ }
203
+ None => Err ( IdpError :: NotFound ) ,
204
+ }
205
+ }
206
+
152
207
async fn unix_user_get (
153
208
& self ,
154
209
id : & Id ,
@@ -491,6 +546,61 @@ impl IdProvider for HimmelblauProvider {
491
546
}
492
547
}
493
548
549
+ async fn unix_user_access (
550
+ & self ,
551
+ id : & Id ,
552
+ scopes : Vec < String > ,
553
+ old_token : Option < & UserToken > ,
554
+ tpm : & mut tpm:: BoxedDynTpm ,
555
+ machine_key : & tpm:: MachineKey ,
556
+ ) -> Result < UnixUserToken , IdpError > {
557
+ /* Use the prt mem cache to refresh the user token */
558
+ let account_id = match old_token {
559
+ Some ( token) => token. spn . clone ( ) ,
560
+ None => id. to_string ( ) . clone ( ) ,
561
+ } ;
562
+ let prt = self . refresh_cache . refresh_token ( & account_id) . await ?;
563
+ self . client
564
+ . write ( )
565
+ . await
566
+ . exchange_prt_for_access_token (
567
+ & prt,
568
+ scopes. iter ( ) . map ( |s| s. as_ref ( ) ) . collect ( ) ,
569
+ None ,
570
+ tpm,
571
+ machine_key,
572
+ )
573
+ . await
574
+ . map_err ( |e| {
575
+ error ! ( "{:?}" , e) ;
576
+ IdpError :: BadRequest
577
+ } )
578
+ }
579
+
580
+ async fn unix_user_prt_cookie (
581
+ & self ,
582
+ id : & Id ,
583
+ old_token : Option < & UserToken > ,
584
+ tpm : & mut tpm:: BoxedDynTpm ,
585
+ machine_key : & tpm:: MachineKey ,
586
+ ) -> Result < String , IdpError > {
587
+ /* Use the prt mem cache to refresh the user token */
588
+ let account_id = match old_token {
589
+ Some ( token) => token. spn . clone ( ) ,
590
+ None => id. to_string ( ) . clone ( ) ,
591
+ } ;
592
+ let prt = self . refresh_cache . refresh_token ( & account_id) . await ?;
593
+ self . client
594
+ . write ( )
595
+ . await
596
+ . acquire_prt_sso_cookie ( & prt, tpm, machine_key)
597
+ . await
598
+ . map_err ( |e| {
599
+ error ! ( "Failed to request prt cookie: {:?}" , e) ;
600
+ IdpError :: BadRequest
601
+ } )
602
+ }
603
+
494
604
async fn unix_user_get (
495
605
& self ,
496
606
id : & Id ,
@@ -555,7 +665,10 @@ impl IdProvider for HimmelblauProvider {
555
665
displayname: "" . to_string( ) ,
556
666
shell: Some ( config. get_shell( Some ( & self . domain) ) ) ,
557
667
groups,
558
- sshkeys: vec![ ] ,
668
+ tenant_id: Uuid :: parse_str( & self . tenant_id) . map_err( |e| {
669
+ error!( "{:?}" , e) ;
670
+ IdpError :: BadRequest
671
+ } ) ?,
559
672
valid: true ,
560
673
} ) ;
561
674
} else {
@@ -1344,7 +1457,6 @@ impl HimmelblauProvider {
1344
1457
groups = vec ! [ ] ;
1345
1458
}
1346
1459
} ;
1347
- let sshkeys: Vec < String > = vec ! [ ] ;
1348
1460
let valid = true ;
1349
1461
let idmap = self . idmap . read ( ) . await ;
1350
1462
let gidnumber = match config. get_id_attr_map ( ) {
@@ -1376,7 +1488,10 @@ impl HimmelblauProvider {
1376
1488
displayname : value. id_token . name . clone ( ) ,
1377
1489
shell : Some ( config. get_shell ( Some ( & self . domain ) ) ) ,
1378
1490
groups,
1379
- sshkeys,
1491
+ tenant_id : Uuid :: parse_str ( & self . tenant_id ) . map_err ( |e| {
1492
+ error ! ( "{:?}" , e) ;
1493
+ IdpError :: BadRequest
1494
+ } ) ?,
1380
1495
valid,
1381
1496
} )
1382
1497
}
0 commit comments