sddl 0.1.0

a library to parse and analyse SDDL Strings
Documentation
use std::str::FromStr;
use enumflags2::make_bitflags;
use crate::Error;
use crate::constants;
use crate::AccessMask;
use crate::AccessMaskFlag;

grammar;

extern {
    type Error = Error;
}

pub AccessMask: crate::AccessMask = {
    <s:SingleAccessMask*> => s.into_iter().fold(crate::AccessMask::empty(), |v, a| v|a ),
    <n:Number> =>? Ok(crate::AccessMask::try_from(n).map_err(|e| Error::from(e))?),
};

SingleAccessMask: crate::AccessMask = {
    "GR" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::GENERIC_READ)),
    "GW" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::GENERIC_WRITE)),
    "GX" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::GENERIC_EXECUTE)),
    "GA" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::GENERIC_ALL)),
    "MA" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::MAXIMUM_ALLOWED)),
    "AS" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::ACCESS_SYSTEM_SECURITY)),
    "WO" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::WRITE_OWNER)),
    "WD" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::WRITE_DACL)),
    "RC" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::READ_CONTROL)),
    "SD" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::STANDARD_DELETE)),
    "CR" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::CONTROL_ACCESS)),

    "CA" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_CONTROL_ACCESS),
    "LO" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_LIST_OBJECT),
    "DT" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_DELETE_TREE),
    "WP" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_WRITE_PROP),
    "RP" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_READ_PROP),
    "SW" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_SELF),
    "LC" => AccessMask::from_bitflag(constants::ADS_RIGHT_ACTRL_DS_LIST),
    "DC" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_DELETE_CHILD),
    "CC" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_CREATE_CHILD),
    "NW" => AccessMask::from_bitflag(constants::SYSTEM_MANDATORY_LABEL_NO_WRITE_UP),
    "NR" => AccessMask::from_bitflag(constants::SYSTEM_MANDATORY_LABEL_NO_READ_UP),
    "NX" => AccessMask::from_bitflag(constants::SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP),
    "FA" => constants::FILE_ALL,
    "FR" => constants::FILE_READ,
    "FW" => constants::FILE_WRITE,
    "FX" => constants::FILE_EXECUTE,
    "KA" => constants::KEY_ALL,
    "KR" => constants::KEY_READ,
    "KW" => constants::KEY_WRITE,
    "KX" => constants::KEY_EXECUTE,

    "SY" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::SYNCHRONIZE))
}

Number: u32 = {
    <s:r#"0x[0-9a-fA-F]+"#> => {
        u32::from_str_radix(&s[2..], 16).unwrap()
    },
    <s:r#"0[0-7]+"#> => {
        u32::from_str_radix(s, 8).unwrap()
    },
    <s:r#"[1-9][0-9]*"#> => {
        u32::from_str(s).unwrap()
    }
}