AsRef in SetuidCommandRunner
This commit is contained in:
parent
8bcd03c7da
commit
466b4cb994
3 changed files with 11 additions and 22 deletions
|
|
@ -1,4 +1,3 @@
|
||||||
use std::borrow::Cow;
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::ffi::OsStr;
|
use std::ffi::OsStr;
|
||||||
use std::io::{Result as IoResult, Write};
|
use std::io::{Result as IoResult, Write};
|
||||||
|
|
@ -73,19 +72,13 @@ impl CommandRunner for StdCommandRunner {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct SetuidCommandRunner<'a, C>
|
pub struct SetuidCommandRunner<'a, U: AsRef<str>, C: CommandRunner> {
|
||||||
where
|
|
||||||
C: 'a + CommandRunner,
|
|
||||||
{
|
|
||||||
command_runner: &'a C,
|
command_runner: &'a C,
|
||||||
user_name: Cow<'a, str>,
|
user_name: U,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, C> SetuidCommandRunner<'a, C>
|
impl<'a, U: AsRef<str>, C: CommandRunner> SetuidCommandRunner<'a, U, C> {
|
||||||
where
|
pub fn new(user_name: U, command_runner: &'a C) -> Self {
|
||||||
C: 'a + CommandRunner,
|
|
||||||
{
|
|
||||||
pub fn new(user_name: Cow<'a, str>, command_runner: &'a C) -> SetuidCommandRunner<'a, C> {
|
|
||||||
SetuidCommandRunner {
|
SetuidCommandRunner {
|
||||||
command_runner,
|
command_runner,
|
||||||
user_name,
|
user_name,
|
||||||
|
|
@ -122,20 +115,17 @@ impl<'a> Drop for TempSetEnv<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, C> CommandRunner for SetuidCommandRunner<'a, C>
|
impl<'a, U: AsRef<str>, C: CommandRunner> CommandRunner for SetuidCommandRunner<'a, U, C> {
|
||||||
where
|
|
||||||
C: 'a + CommandRunner,
|
|
||||||
{
|
|
||||||
fn run_with_args_and_stdin(
|
fn run_with_args_and_stdin(
|
||||||
&self,
|
&self,
|
||||||
program: &str,
|
program: &str,
|
||||||
args: &[&OsStr],
|
args: &[&OsStr],
|
||||||
input: &str,
|
input: &str,
|
||||||
) -> IoResult<Output> {
|
) -> IoResult<Output> {
|
||||||
let uid = get_user_by_name(&self.user_name)
|
let uid = get_user_by_name(self.user_name.as_ref())
|
||||||
.expect("User does not exist")
|
.expect("User does not exist")
|
||||||
.uid();
|
.uid();
|
||||||
let set_home = TempSetEnv::new("HOME", format!("/home/{}", self.user_name));
|
let set_home = TempSetEnv::new("HOME", format!("/home/{}", self.user_name.as_ref()));
|
||||||
let set_dbus = TempSetEnv::new("XDG_RUNTIME_DIR", format!("/run/user/{}", uid));
|
let set_dbus = TempSetEnv::new("XDG_RUNTIME_DIR", format!("/run/user/{}", uid));
|
||||||
//println!("{} {:?}", program, args);
|
//println!("{} {:?}", program, args);
|
||||||
let mut child = Command::new(program)
|
let mut child = Command::new(program)
|
||||||
|
|
@ -192,8 +182,7 @@ where
|
||||||
) -> IoResult<Output> {
|
) -> IoResult<Output> {
|
||||||
let raw_new_args = [self.user_name, "-s", "/usr/bin/env", "--", program];
|
let raw_new_args = [self.user_name, "-s", "/usr/bin/env", "--", program];
|
||||||
let mut new_args: Vec<&OsStr> = raw_new_args.iter().map(|s| s.as_ref()).collect();
|
let mut new_args: Vec<&OsStr> = raw_new_args.iter().map(|s| s.as_ref()).collect();
|
||||||
let old_args: Vec<&OsStr> = args.iter().map(|s| s.as_ref()).collect();
|
new_args.extend_from_slice(args);
|
||||||
new_args.extend_from_slice(&old_args);
|
|
||||||
self
|
self
|
||||||
.command_runner
|
.command_runner
|
||||||
.run_with_args_and_stdin("su", &new_args, input)
|
.run_with_args_and_stdin("su", &new_args, input)
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ impl Policy for DefaultPolicy {}
|
||||||
|
|
||||||
pub struct SymbolFactory<'a, C: 'a + CommandRunner, R: 'a + SymbolRunner, P: 'a + Policy> {
|
pub struct SymbolFactory<'a, C: 'a + CommandRunner, R: 'a + SymbolRunner, P: 'a + Policy> {
|
||||||
command_runner: &'a C,
|
command_runner: &'a C,
|
||||||
acme_command_runner: SetuidCommandRunner<'a, C>,
|
acme_command_runner: SetuidCommandRunner<'a, Cow<'a, str>, C>,
|
||||||
symbol_runner: &'a R,
|
symbol_runner: &'a R,
|
||||||
policy: &'a P,
|
policy: &'a P,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -62,8 +62,8 @@ pub struct UserService<'a, C: AsRef<str>, R: CommandRunner> {
|
||||||
config: FileSymbol<C, PathBuf>,
|
config: FileSymbol<C, PathBuf>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, R: CommandRunner> UserService<'a, String, SetuidCommandRunner<'a, R>> {
|
impl<'a, R: CommandRunner> UserService<'a, String, SetuidCommandRunner<'a, Cow<'a, str>, R>> {
|
||||||
pub fn new_nodejs<'b: 'a>(
|
pub fn new_nodejs(
|
||||||
home: Cow<'a, Path>,
|
home: Cow<'a, Path>,
|
||||||
user_name: Cow<'a, str>,
|
user_name: Cow<'a, str>,
|
||||||
service_name: &'a str,
|
service_name: &'a str,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue