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}