use std::io::Read;
use log::warn;
use testresult::TestResult;
use voa_core::{
Voa,
identifiers::{Context, CustomContext, Mode, Os, Purpose, Role, Technology},
};
#[test]
fn list_verifiers() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/usr/local/share/voa/arch/packages/default/openpgp/"),
crate::TestObject::File("/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp"),
crate::TestObject::Path("/etc/voa/arch/packages/default/openpgp/"),
crate::TestObject::SymLink(
"/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp",
"/etc/voa/arch/packages/default/openpgp/foo.pgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Default,
Technology::Openpgp,
);
warn!("Found verifiers: {verifiers:#?}");
assert_eq!(verifiers.len(), 1);
crate::compare_expected(
&verifiers,
&["/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp"],
);
let (_, vec) = verifiers.iter().next().unwrap();
assert_eq!(vec.len(), 2);
let voa_loc = vec[0].voa_location();
assert_eq!(*voa_loc.technology(), Technology::Openpgp);
Ok(())
}
#[test]
fn illegal_file_for_load_path() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::File("/etc/voa"), crate::TestObject::Path("/usr/local/share/voa/arch/packages/default/openpgp/"),
crate::TestObject::File("/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp"),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Default,
Technology::Openpgp,
);
warn!("Found verifiers: {verifiers:#?}");
assert_eq!(verifiers.len(), 1);
crate::compare_expected(
&verifiers,
&["/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp"],
);
Ok(())
}
#[test]
fn illegal_dir_for_verifier() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[crate::TestObject::Path(
"/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp",
) ];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Default,
Technology::Openpgp,
);
assert!(verifiers.is_empty());
Ok(())
}
#[test]
fn illegal_dir_at_verifier_symlink() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/usr/local/share/voa/arch/packages/custom/openpgp/foo.pgp"),
crate::TestObject::Path("/etc/voa/arch/packages/default/openpgp/"),
crate::TestObject::SymLink(
"/usr/local/share/voa/arch/packages/custom/openpgp/foo.pgp",
"/etc/voa/arch/packages/default/openpgp/foo.pgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Default,
Technology::Openpgp,
);
assert!(verifiers.is_empty());
Ok(())
}
#[test]
fn invalid_verifier_symlink() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/usr/local/share/voa/arch/packages/default/openpgp/"),
crate::TestObject::File("/tmp/foo.pgp"),
crate::TestObject::SymLink(
"/tmp/foo.pgp",
"/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Default,
Technology::Openpgp,
);
assert!(verifiers.is_empty());
Ok(())
}
#[test]
fn invalid_dir_symlink() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/usr/local/share/voa/arch/packages/default/openpgp/"),
crate::TestObject::File("/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp"),
crate::TestObject::Path("/etc/voa/arch/packages/"),
crate::TestObject::Path("/tmp/custom/"),
crate::TestObject::SymLink("/tmp/custom/", "/etc/voa/arch/packages/custom"),
crate::TestObject::SymLink(
"/usr/local/share/voa/arch/packages/default/openpgp/",
"/tmp/custom/openpgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Custom(CustomContext::new("custom".parse()?)),
Technology::Openpgp,
);
assert!(verifiers.is_empty());
Ok(())
}
#[test]
fn invalid_file_at_symlink() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/usr/local/share/voa/arch/packages/default/"),
crate::TestObject::File("/usr/local/share/voa/arch/packages/default/openpgp"),
crate::TestObject::Path("/etc/voa/arch/packages/custom/"),
crate::TestObject::SymLink(
"/usr/local/share/voa/arch/packages/default/openpgp",
"/etc/voa/arch/packages/custom/openpgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Custom(CustomContext::new("custom".parse()?)),
Technology::Openpgp,
);
assert!(verifiers.is_empty());
Ok(())
}
#[test]
fn invalid_fifo() -> TestResult {
use std::ffi::CString;
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/usr/local/share/voa/arch/packages/default/openpgp"),
crate::TestObject::Path("/etc/voa/arch/packages/default/openpgp/"),
crate::TestObject::SymLink(
"/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp",
"/etc/voa/arch/packages/default/openpgp/foo.pgp",
),
];
crate::setup(SETUP)?;
let verifier_file = "/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp";
let c_str = CString::new(verifier_file).unwrap();
let c_chr = c_str.as_ptr();
let mode = 0o644 | libc::S_IFIFO;
let dev = libc::makedev(0, 0);
unsafe {
let errno = libc::mknod(c_chr, mode, dev);
if errno == -1 {
let c_str = CString::new("mknod").unwrap();
libc::perror(c_str.as_ptr());
}
};
eprintln!("made FIFO node");
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Default,
Technology::Openpgp,
);
assert!(verifiers.is_empty());
Ok(())
}
#[test]
fn masking() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/etc/voa/arch/packages/default/openpgp/"),
crate::TestObject::File("/etc/voa/arch/packages/default/openpgp/foo.pgp"),
crate::TestObject::File("/etc/voa/arch/packages/default/openpgp/bar.pgp"),
crate::TestObject::Path("/usr/local/share/voa/arch/packages/default/openpgp/"),
crate::TestObject::File("/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp"),
crate::TestObject::Path("/run/voa/arch/packages/default/openpgp/"),
crate::TestObject::SymLink(
"/dev/null",
"/run/voa/arch/packages/default/openpgp/foo.pgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Default,
Technology::Openpgp,
);
warn!("Found verifiers: {verifiers:#?}");
assert_eq!(verifiers.len(), 1);
crate::compare_expected(
&verifiers,
&["/etc/voa/arch/packages/default/openpgp/bar.pgp"],
);
Ok(())
}
#[test]
fn ineffective_masking() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/etc/voa/arch/packages/default/openpgp/"),
crate::TestObject::File("/etc/voa/arch/packages/default/openpgp/foo.pgp"),
crate::TestObject::Path("/usr/local/share/voa/arch/packages/default/openpgp/"),
crate::TestObject::SymLink(
"/dev/null",
"/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Default,
Technology::Openpgp,
);
warn!("Found verifiers: {verifiers:#?}");
assert_eq!(verifiers.len(), 1);
crate::compare_expected(
&verifiers,
&["/etc/voa/arch/packages/default/openpgp/foo.pgp"],
);
Ok(())
}
#[test]
fn masking_warn_for_directory() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/etc/voa/arch/packages/default/"),
crate::TestObject::Path("/usr/local/share/voa/arch/packages/default/openpgp/"),
crate::TestObject::File("/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp"),
crate::TestObject::SymLink("/dev/null", "/etc/voa/arch/packages/default/openpgp"),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Default,
Technology::Openpgp,
);
warn!("Found verifiers: {verifiers:#?}");
assert_eq!(verifiers.len(), 1);
crate::compare_expected(
&verifiers,
&["/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp"],
);
Ok(())
}
#[test]
fn symlink_multihop_file() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/etc/voa/arch/packages/default/openpgp/"),
crate::TestObject::Path("/etc/voa/arch/packages/custom1/openpgp/"),
crate::TestObject::Path("/etc/voa/arch/packages/custom2/openpgp/"),
crate::TestObject::File("/etc/voa/arch/packages/default/openpgp/foo.pgp"),
crate::TestObject::SymLink(
"/etc/voa/arch/packages/default/openpgp/foo.pgp",
"/etc/voa/arch/packages/custom1/openpgp/foo.pgp",
),
crate::TestObject::SymLink(
"/etc/voa/arch/packages/custom1/openpgp/foo.pgp",
"/etc/voa/arch/packages/custom2/openpgp/foo.pgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Custom(CustomContext::new("custom2".parse()?)),
Technology::Openpgp,
);
warn!("Found verifiers: {verifiers:#?}");
assert_eq!(verifiers.len(), 1);
crate::compare_expected(
&verifiers,
&["/etc/voa/arch/packages/default/openpgp/foo.pgp"],
);
Ok(())
}
#[test]
fn symlink_cycle_file() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/etc/voa/arch/packages/custom1/openpgp/"),
crate::TestObject::Path("/etc/voa/arch/packages/custom2/openpgp/"),
crate::TestObject::SymLink(
"/etc/voa/arch/packages/custom2/openpgp/foo.pgp",
"/etc/voa/arch/packages/custom1/openpgp/foo.pgp",
),
crate::TestObject::SymLink(
"/etc/voa/arch/packages/custom1/openpgp/foo.pgp",
"/etc/voa/arch/packages/custom2/openpgp/foo.pgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Custom(CustomContext::new("custom2".parse()?)),
Technology::Openpgp,
);
assert!(verifiers.is_empty());
Ok(())
}
#[test]
fn symlink_multihop_dir() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/etc/voa/arch/packages/default/openpgp/"),
crate::TestObject::Path("/etc/voa/arch/packages/custom1/"),
crate::TestObject::Path("/etc/voa/arch/packages/custom2/"),
crate::TestObject::File("/etc/voa/arch/packages/default/openpgp/foo.pgp"),
crate::TestObject::SymLink(
"/etc/voa/arch/packages/default/openpgp",
"/etc/voa/arch/packages/custom1/openpgp",
),
crate::TestObject::SymLink(
"/etc/voa/arch/packages/custom1/openpgp",
"/etc/voa/arch/packages/custom2/openpgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Custom(CustomContext::new("custom2".parse()?)),
Technology::Openpgp,
);
warn!("Found verifiers: {verifiers:#?}");
assert_eq!(verifiers.len(), 1);
crate::compare_expected(
&verifiers,
&["/etc/voa/arch/packages/default/openpgp/foo.pgp"],
);
Ok(())
}
#[test]
fn symlink_cycle_dir() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/etc/voa/arch/packages/custom1/"),
crate::TestObject::Path("/etc/voa/arch/packages/custom2/"),
crate::TestObject::SymLink(
"/etc/voa/arch/packages/custom2/openpgp",
"/etc/voa/arch/packages/custom1/openpgp",
),
crate::TestObject::SymLink(
"/etc/voa/arch/packages/custom1/openpgp",
"/etc/voa/arch/packages/custom2/openpgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Custom(CustomContext::new("custom2".parse()?)),
Technology::Openpgp,
);
assert!(verifiers.is_empty());
Ok(())
}
#[test]
fn symlink_between_load_paths_valid() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/usr/local/share/voa/arch/packages/default/openpgp/"),
crate::TestObject::File("/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp"),
crate::TestObject::Path("/etc/voa/arch/packages/custom1/"),
crate::TestObject::SymLink(
"/usr/local/share/voa/arch/packages/default/openpgp",
"/etc/voa/arch/packages/custom1/openpgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Custom(CustomContext::new("custom1".parse()?)),
Technology::Openpgp,
);
warn!("Found verifiers: {verifiers:#?}");
assert_eq!(verifiers.len(), 1);
crate::compare_expected(
&verifiers,
&["/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp"],
);
Ok(())
}
#[test]
fn symlink_between_load_paths_invalid() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/etc/voa/arch/packages/default/openpgp/"),
crate::TestObject::File("/etc/voa/arch/packages/default/openpgp/foo.pgp"),
crate::TestObject::Path("/usr/local/share/voa/arch/packages/custom1/"),
crate::TestObject::SymLink(
"/etc/voa/arch/packages/default/openpgp",
"/usr/local/share/voa/arch/packages/custom1/openpgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Custom(CustomContext::new("custom1".parse()?)),
Technology::Openpgp,
);
warn!("Found verifiers: {verifiers:#?}");
assert!(verifiers.is_empty());
Ok(())
}
#[test]
fn relative_symlink_between_load_paths_valid() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/usr/local/share/voa/arch/packages/default/openpgp/"),
crate::TestObject::File("/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp"),
crate::TestObject::Path("/etc/voa/arch/packages/custom1/"),
crate::TestObject::SymLink(
"../../../../../../usr/local/share/voa/arch/packages/default/openpgp",
"/etc/voa/arch/packages/custom1/openpgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Custom(CustomContext::new("custom1".parse()?)),
Technology::Openpgp,
);
warn!("Found verifiers: {verifiers:#?}");
assert_eq!(verifiers.len(), 1);
crate::compare_expected(
&verifiers,
&["/usr/local/share/voa/arch/packages/default/openpgp/foo.pgp"],
);
Ok(())
}
#[test]
fn relative_symlink_between_load_paths_invalid() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/etc/voa/arch/packages/default/openpgp/"),
crate::TestObject::File("/etc/voa/arch/packages/default/openpgp/foo.pgp"),
crate::TestObject::Path("/usr/local/share/voa/arch/packages/custom1/"),
crate::TestObject::SymLink(
"../../../../../../../../etc/voa/arch/packages/default/openpgp",
"/usr/local/share/voa/arch/packages/custom1/openpgp",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Custom(CustomContext::new("custom1".parse()?)),
Technology::Openpgp,
);
warn!("Found verifiers: {verifiers:#?}");
assert!(verifiers.is_empty());
Ok(())
}
#[test]
fn read_verifier() -> TestResult {
crate::init_logger();
const SETUP: &[crate::TestObject] = &[
crate::TestObject::Path("/etc/voa/arch/packages/default/openpgp/"),
crate::TestObject::FileWithContent(
"/etc/voa/arch/packages/default/openpgp/foo.pgp",
b"hello world",
),
];
crate::setup(SETUP)?;
let voa = Voa::new();
let mut verifiers = voa.lookup(
Os::new("arch".parse()?, None, None, None, None),
Purpose::new(Role::Packages, Mode::ArtifactVerifier),
Context::Default,
Technology::Openpgp,
);
warn!("Found verifiers: {verifiers:#?}");
assert_eq!(verifiers.len(), 1);
let mut verifier = &verifiers
.first_entry()
.unwrap()
.get()
.first()
.unwrap()
.open()?;
let mut s = String::new();
let _ = verifier.read_to_string(&mut s)?;
assert_eq!(s, "hello world");
Ok(())
}