dosu 0.0.2

Rust port of OpenBSD's doas
Documentation
use std::collections::HashMap;
use dosu::{Action, Options, config};

#[test]
fn test_config_line_parser_simple() {
    let simple_bytes = include_bytes!("configs/simple_doas.conf");
    let (_, rule) = config::config_line_parser(simple_bytes.as_ref()).unwrap();

    assert_eq!(rule.action(), Action::Permit);
    assert_eq!(rule.options(), &[]);
    assert_eq!(rule.ident(), b"user".as_ref());
    assert_eq!(rule.target(), None);
    assert_eq!(rule.cmd(), None);
    assert_eq!(rule.cmd_args(), None);
    assert_eq!(rule.envlist(), &HashMap::new());
}

#[test]
fn test_config_line_parser_options() {
    let options_bytes = include_bytes!("configs/options_doas.conf");
    let (rem, rule) = config::config_line_parser(options_bytes.as_ref()).unwrap();
    let user = b"user".as_ref();

    assert_eq!(rule.action(), Action::Permit);
    assert_eq!(rule.options(), &[Options::KeepEnv]);
    assert_eq!(rule.ident(), user);
    assert_eq!(rule.target(), None);
    assert_eq!(rule.cmd(), None);
    assert_eq!(rule.cmd_args(), None);
    assert_eq!(rule.envlist(), &HashMap::new());

    let (rem, rule) = config::config_line_parser(rem).unwrap();

    assert_eq!(rule.action(), Action::Permit);
    assert_eq!(rule.options(), &[Options::NoLog]);
    assert_eq!(rule.ident(), user);
    assert_eq!(rule.target(), None);
    assert_eq!(rule.cmd(), None);
    assert_eq!(rule.cmd_args(), None);
    assert_eq!(rule.envlist(), &HashMap::new());

    let (rem, rule) = config::config_line_parser(rem).unwrap();

    assert_eq!(rule.action(), Action::Permit);
    assert_eq!(rule.options(), &[Options::NoPass]);
    assert_eq!(rule.ident(), user);
    assert_eq!(rule.target(), None);
    assert_eq!(rule.cmd(), None);
    assert_eq!(rule.cmd_args(), None);
    assert_eq!(rule.envlist(), &HashMap::new());

    let (rem, rule) = config::config_line_parser(rem).unwrap();

    assert_eq!(rule.action(), Action::Permit);
    assert_eq!(rule.options(), &[Options::Persist]);
    assert_eq!(rule.ident(), user);
    assert_eq!(rule.target(), None);
    assert_eq!(rule.cmd(), None);
    assert_eq!(rule.cmd_args(), None);
    assert_eq!(rule.envlist(), &HashMap::new());

    let (rem, rule) = config::config_line_parser(rem).unwrap();

    assert_eq!(rule.action(), Action::Permit);
    assert_eq!(rule.options(), &[Options::KeepEnv, Options::NoLog]);
    assert_eq!(rule.ident(), user);
    assert_eq!(rule.target(), None);
    assert_eq!(rule.cmd(), None);
    assert_eq!(rule.cmd_args(), None);
    assert_eq!(rule.envlist(), &HashMap::new());

    let (rem, rule) = config::config_line_parser(rem).unwrap();

    assert_eq!(rule.action(), Action::Permit);
    assert_eq!(rule.options(), &[Options::KeepEnv, Options::NoLog, Options::NoPass]);
    assert_eq!(rule.ident(), user);
    assert_eq!(rule.target(), None);
    assert_eq!(rule.cmd(), None);
    assert_eq!(rule.cmd_args(), None);
    assert_eq!(rule.envlist(), &HashMap::new());

    let (rem, rule) = config::config_line_parser(rem).unwrap();

    assert_eq!(rule.action(), Action::Permit);
    assert_eq!(rule.options(), &[Options::KeepEnv, Options::NoLog, Options::NoPass, Options::Persist]);
    assert_eq!(rule.ident(), user);
    assert_eq!(rule.target(), None);
    assert_eq!(rule.cmd(), None);
    assert_eq!(rule.cmd_args(), None);
    assert_eq!(rule.envlist(), &HashMap::new());

    let (_, rule) = config::config_line_parser(rem).unwrap();

    assert_eq!(rule.action(), Action::Permit);
    assert_eq!(rule.options(), &[Options::KeepEnv, Options::NoLog, Options::NoPass, Options::Persist, Options::SetEnv]);
    assert_eq!(rule.ident(), user);
    assert_eq!(rule.target(), None);
    assert_eq!(rule.cmd(), None);
    assert_eq!(rule.cmd_args(), None);

    let envlist = rule.envlist();
    assert_eq!(envlist[b"PATH".as_ref()], Vec::new());
}

#[test]
fn test_config_line_parser_target() {
    let target_bytes = include_bytes!("configs/target_doas.conf");
    let (_, rule) = config::config_line_parser(target_bytes.as_ref()).unwrap();

    assert_eq!(rule.action(), Action::Permit);
    assert_eq!(rule.options(), &[]);
    assert_eq!(rule.ident(), b"user".as_ref());
    assert_eq!(rule.target(), Some(b"root".as_ref()));
    assert_eq!(rule.cmd(), None);
    assert_eq!(rule.cmd_args(), None);
    assert_eq!(rule.envlist(), &HashMap::new());
}

#[test]
fn test_config_line_parser_cmd() {
    let cmd_bytes = include_bytes!("configs/cmd_doas.conf");
    let (rem, rule) = config::config_line_parser(cmd_bytes.as_ref()).unwrap();

    assert_eq!(rule.action(), Action::Permit);
    assert_eq!(rule.options(), &[]);
    assert_eq!(rule.ident(), b"user".as_ref());
    assert_eq!(rule.target(), None);
    assert_eq!(rule.cmd(), Some(b"su".as_ref()));
    assert_eq!(rule.cmd_args(), None);
    assert_eq!(rule.envlist(), &HashMap::new());

    let (_, rule) = config::config_line_parser(rem).unwrap();

    assert_eq!(rule.action(), Action::Permit);
    assert_eq!(rule.options(), &[]);
    assert_eq!(rule.ident(), b"user".as_ref());
    assert_eq!(rule.target(), None);
    assert_eq!(rule.cmd(), Some(b"su".as_ref()));
    assert_eq!(rule.cmd_args(), Some([b"-l".as_ref().to_vec(), b"root".as_ref().to_vec()].as_ref()));
    assert_eq!(rule.envlist(), &HashMap::new());
}