warg_server/policy/record/
mod.rs1use thiserror::Error;
3use warg_protocol::{package::PackageRecord, registry::PackageName, ProtoEnvelope};
4
5mod authorization;
6pub use authorization::*;
7
8#[derive(Debug, Error)]
10pub enum RecordPolicyError {
11 #[error("unauthorized operation:: {0}")]
16 Unauthorized(String),
17 #[error("record was rejected by policy: {0}")]
19 Rejection(String),
20}
21
22pub type RecordPolicyResult<T> = Result<T, RecordPolicyError>;
24
25pub trait RecordPolicy: Send + Sync {
27 fn check(
29 &self,
30 name: &PackageName,
31 record: &ProtoEnvelope<PackageRecord>,
32 ) -> RecordPolicyResult<()>;
33}
34
35#[derive(Default)]
40pub struct RecordPolicyCollection {
41 policies: Vec<Box<dyn RecordPolicy>>,
42}
43
44impl RecordPolicyCollection {
45 pub fn new() -> Self {
47 Self::default()
48 }
49
50 pub fn push(&mut self, policy: impl RecordPolicy + 'static) {
52 self.policies.push(Box::new(policy));
53 }
54}
55
56impl RecordPolicy for RecordPolicyCollection {
57 fn check(
58 &self,
59 name: &PackageName,
60 record: &ProtoEnvelope<PackageRecord>,
61 ) -> RecordPolicyResult<()> {
62 for policy in &self.policies {
63 policy.check(name, record)?;
64 }
65
66 Ok(())
67 }
68}