@@ -7,6 +7,7 @@ use chrono::Duration;
77use konst:: primitive:: parse_i64;
88use konst:: { iter, option, result, slice, string, unwrap_ctx} ;
99use libc:: PATH_MAX ;
10+ use nix:: unistd:: User ;
1011use rar_common:: database:: options:: {
1112 EnvBehavior , Level , PathBehavior , SAuthentication , SBounding , SPathOptions , SPrivileged ,
1213 STimeout , TimestampType ,
@@ -283,7 +284,9 @@ impl<'a> DEnvOptions<'a> {
283284 & self ,
284285 env_vars : impl IntoIterator < Item = ( impl Into < String > , impl Into < String > ) > ,
285286 env_path : impl IntoIterator < Item = impl AsRef < str > > ,
286- target : & Cred ,
287+ current_user : & Cred ,
288+ target : Option < User > ,
289+ command : String ,
287290 ) -> SrResult < HashMap < String , String > > {
288291 let mut final_set = match self . default_behavior {
289292 EnvBehavior :: Inherit => {
@@ -329,16 +332,21 @@ impl<'a> DEnvOptions<'a> {
329332 }
330333 } ) ,
331334 ) ;
332- final_set. insert ( "LOGNAME" . into ( ) , target. user . name . clone ( ) ) ;
333- final_set. insert ( "USER" . into ( ) , target. user . name . clone ( ) ) ;
334- final_set. insert ( "HOME" . into ( ) , target. user . dir . to_string_lossy ( ) . to_string ( ) ) ;
335- final_set
336- . entry ( "TERM" . into ( ) )
337- . or_insert_with ( || "unknown" . into ( ) ) ;
335+ let target_user = target. unwrap_or_else ( || current_user. user . clone ( ) ) ;
336+ final_set. insert ( "LOGNAME" . into ( ) , target_user. name . clone ( ) ) ;
337+ final_set. insert ( "USER" . into ( ) , target_user. name . clone ( ) ) ;
338+ final_set. insert ( "HOME" . into ( ) , target_user. dir . to_string_lossy ( ) . to_string ( ) ) ;
338339 final_set. insert (
339340 "SHELL" . into ( ) ,
340- target . user . shell . to_string_lossy ( ) . to_string ( ) ,
341+ target_user . shell . to_string_lossy ( ) . to_string ( ) ,
341342 ) ;
343+ final_set. insert ( "RAR_UID" . into ( ) , current_user. user . uid . to_string ( ) ) ;
344+ final_set. insert ( "RAR_GID" . into ( ) , current_user. user . gid . to_string ( ) ) ;
345+ final_set. insert ( "RAR_USER" . into ( ) , current_user. user . name . clone ( ) ) ;
346+ final_set. insert ( "RAR_COMMAND" . into ( ) , command) ;
347+ final_set
348+ . entry ( "TERM" . into ( ) )
349+ . or_insert_with ( || "unknown" . into ( ) ) ;
342350 final_set. extend (
343351 self . set
344352 . iter ( )
@@ -1065,16 +1073,15 @@ mod tests {
10651073 ] ;
10661074 let env_path = vec ! [ "/usr/local/bin" , "/usr/bin" ] ;
10671075 let target = Cred :: builder ( ) . build ( ) ;
1068- let result = env_options. calc_final_env ( env_vars, & env_path, & target) ;
1076+ let result = env_options. calc_final_env ( env_vars, & env_path, & target, None , String :: new ( ) ) ;
10691077 assert ! (
10701078 result. is_ok( ) ,
10711079 "Failed to calculate final env {}" ,
10721080 result. unwrap_err( )
10731081 ) ;
10741082 let final_env = result. unwrap ( ) ;
10751083 assert_eq ! ( final_env. get( "PATH" ) . unwrap( ) , "/usr/local/bin:/usr/bin" ) ;
1076- assert_eq ! ( * final_env. get( "LOGNAME" ) . unwrap( ) , target. user. name) ;
1077- assert_eq ! ( * final_env. get( "USER" ) . unwrap( ) , target. user. name) ;
1084+ assert_eq ! ( * final_env. get( "RAR_USER" ) . unwrap( ) , target. user. name) ;
10781085 assert_eq ! (
10791086 * final_env. get( "HOME" ) . unwrap( ) ,
10801087 target. user. dir. to_string_lossy( )
@@ -1107,7 +1114,7 @@ mod tests {
11071114 ] ;
11081115 let env_path = vec ! [ "/usr/local/bin" , "/usr/bin" ] ;
11091116 let target = Cred :: builder ( ) . build ( ) ;
1110- let result = env_options. calc_final_env ( env_vars, & env_path, & target) ;
1117+ let result = env_options. calc_final_env ( env_vars, & env_path, & target, None , String :: new ( ) ) ;
11111118 assert ! (
11121119 result. is_ok( ) ,
11131120 "Failed to calculate final env {}" ,
@@ -1149,7 +1156,7 @@ mod tests {
11491156 ] ;
11501157 let env_path = vec ! [ "/usr/local/bin" , "/usr/bin" ] ;
11511158 let target = Cred :: builder ( ) . build ( ) ;
1152- let result = env_options. calc_final_env ( env_vars, & env_path, & target) ;
1159+ let result = env_options. calc_final_env ( env_vars, & env_path, & target, None , String :: new ( ) ) ;
11531160 assert ! ( result. is_err( ) ) ;
11541161 }
11551162
0 commit comments