Skip to main content

security/
policy.rs

1use serde_json::Value;
2
3use crate::bridge::{self, Handle};
4use crate::error::Result;
5
6pub type RevocationFlags = u32;
7
8#[derive(Debug)]
9pub struct Policy {
10    handle: Handle,
11}
12
13impl Policy {
14    pub(crate) fn from_handle(handle: Handle) -> Self {
15        Self { handle }
16    }
17
18    pub(crate) fn handle(&self) -> &Handle {
19        &self.handle
20    }
21
22    pub fn basic_x509() -> Result<Self> {
23        let mut status = 0;
24        let mut error = std::ptr::null_mut();
25        let raw = unsafe { bridge::security_policy_create_basic_x509(&mut status, &mut error) };
26        bridge::required_handle("security_policy_create_basic_x509", raw, status, error)
27            .map(Self::from_handle)
28    }
29
30    pub fn ssl(server: bool, hostname: Option<&str>) -> Result<Self> {
31        let hostname = hostname.map(bridge::cstring).transpose()?;
32        let mut status = 0;
33        let mut error = std::ptr::null_mut();
34        let raw = unsafe {
35            bridge::security_policy_create_ssl(
36                server,
37                hostname
38                    .as_ref()
39                    .map_or(std::ptr::null(), |value| value.as_c_str().as_ptr()),
40                &mut status,
41                &mut error,
42            )
43        };
44        bridge::required_handle("security_policy_create_ssl", raw, status, error)
45            .map(Self::from_handle)
46    }
47
48    pub fn revocation(flags: RevocationFlags) -> Result<Self> {
49        let mut status = 0;
50        let mut error = std::ptr::null_mut();
51        let raw = unsafe { bridge::security_policy_create_revocation(flags, &mut status, &mut error) };
52        bridge::required_handle("security_policy_create_revocation", raw, status, error)
53            .map(Self::from_handle)
54    }
55
56    pub fn properties(&self) -> Result<Value> {
57        let mut status = 0;
58        let mut error = std::ptr::null_mut();
59        let raw = unsafe {
60            bridge::security_policy_copy_properties(self.handle.as_ptr(), &mut status, &mut error)
61        };
62        bridge::required_json("security_policy_copy_properties", raw, status, error)
63    }
64}