use super::{AclFacts, DocAclFacts};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum DocPreviewExposure {
Denied,
MetadataNoIndex,
PublicIndexable,
}
impl DocPreviewExposure {
pub const fn as_str(self) -> &'static str {
match self {
Self::Denied => "denied",
Self::MetadataNoIndex => "metadata_no_index",
Self::PublicIndexable => "public_indexable",
}
}
pub const fn is_allowed(self) -> bool {
!matches!(self, Self::Denied)
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum DocPreviewBasis {
Missing,
SharingDisabled,
Public,
Document,
Workspace,
Disabled,
}
impl DocPreviewBasis {
pub const fn as_str(self) -> &'static str {
match self {
Self::Missing => "missing",
Self::SharingDisabled => "sharing_disabled",
Self::Public => "public",
Self::Document => "document",
Self::Workspace => "workspace",
Self::Disabled => "disabled",
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct DocPreviewDecision {
pub exposure: DocPreviewExposure,
pub basis: DocPreviewBasis,
}
pub fn evaluate_workspace_preview(facts: &AclFacts) -> DocPreviewDecision {
if !facts.sharing_enabled {
return DocPreviewDecision {
exposure: DocPreviewExposure::Denied,
basis: DocPreviewBasis::SharingDisabled,
};
}
if facts.workspace_public {
return DocPreviewDecision {
exposure: DocPreviewExposure::PublicIndexable,
basis: DocPreviewBasis::Public,
};
}
if facts.url_preview_enabled {
return DocPreviewDecision {
exposure: DocPreviewExposure::MetadataNoIndex,
basis: DocPreviewBasis::Workspace,
};
}
DocPreviewDecision {
exposure: DocPreviewExposure::Denied,
basis: DocPreviewBasis::Disabled,
}
}
pub fn evaluate_doc_preview(doc: Option<&DocAclFacts>, workspace_preview_enabled: bool) -> DocPreviewDecision {
let Some(doc) = doc else {
return DocPreviewDecision {
exposure: DocPreviewExposure::Denied,
basis: DocPreviewBasis::Missing,
};
};
if !doc.sharing_enabled {
return DocPreviewDecision {
exposure: DocPreviewExposure::Denied,
basis: DocPreviewBasis::SharingDisabled,
};
}
if doc.visibility_public && matches!(doc.public_role, Some(super::DocRole::External)) {
return DocPreviewDecision {
exposure: DocPreviewExposure::PublicIndexable,
basis: DocPreviewBasis::Public,
};
}
if doc.preview_enabled {
return DocPreviewDecision {
exposure: DocPreviewExposure::MetadataNoIndex,
basis: DocPreviewBasis::Document,
};
}
if workspace_preview_enabled {
return DocPreviewDecision {
exposure: DocPreviewExposure::MetadataNoIndex,
basis: DocPreviewBasis::Workspace,
};
}
DocPreviewDecision {
exposure: DocPreviewExposure::Denied,
basis: DocPreviewBasis::Disabled,
}
}
#[cfg(test)]
#[path = "../tests/access_control/preview/tests.rs"]
mod tests;