Skip to main content

verifyos_cli/rules/
core.rs

1use miette::Diagnostic;
2use serde::{Deserialize, Serialize};
3
4pub const RULESET_VERSION: &str = "0.1.0";
5
6#[derive(Debug, thiserror::Error, Diagnostic)]
7pub enum RuleError {
8    #[error(transparent)]
9    #[diagnostic(transparent)]
10    Entitlements(#[from] crate::rules::entitlements::EntitlementsError),
11
12    #[error(transparent)]
13    #[diagnostic(transparent)]
14    Provisioning(#[from] crate::parsers::provisioning_profile::ProvisioningError),
15
16    #[error(transparent)]
17    #[diagnostic(transparent)]
18    MachO(#[from] crate::parsers::macho_parser::MachOError),
19}
20
21#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
22pub enum Severity {
23    Error,
24    Warning,
25    Info,
26}
27
28#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
29pub enum RuleStatus {
30    Pass,
31    Fail,
32    Error,
33    Skip,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct RuleReport {
38    pub status: RuleStatus,
39    pub message: Option<String>,
40    pub evidence: Option<String>,
41}
42
43#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
44pub enum RuleCategory {
45    Privacy,
46    Signing,
47    Bundling,
48    Entitlements,
49    Ats,
50    ThirdParty,
51    Permissions,
52    Metadata,
53    Other,
54}
55
56// Stub for now. Will hold the path to the app and the parsed Info.plist
57pub struct ArtifactContext<'a> {
58    pub app_bundle_path: &'a std::path::Path,
59    pub info_plist: Option<&'a crate::parsers::plist_reader::InfoPlist>,
60}
61
62pub trait AppStoreRule {
63    fn id(&self) -> &'static str;
64    fn name(&self) -> &'static str;
65    fn category(&self) -> RuleCategory;
66    fn severity(&self) -> Severity;
67    fn recommendation(&self) -> &'static str;
68    fn evaluate(&self, artifact: &ArtifactContext) -> Result<RuleReport, RuleError>;
69}