apple_security/
access_control.rs

1//! Access Control support.
2
3use std::ptr::{self, null};
4
5use core_foundation::base::{TCFType, CFOptionFlags, kCFAllocatorDefault};
6use apple_security_sys::access_control::{SecAccessControlGetTypeID, SecAccessControlCreateWithFlags};
7use apple_security_sys::base::{SecAccessControlRef, errSecParam};
8use crate::base::{Error, Result};
9
10declare_TCFType! {
11    /// A type representing sec access control settings.
12    SecAccessControl, SecAccessControlRef
13}
14impl_TCFType!(
15    SecAccessControl,
16    SecAccessControlRef,
17    SecAccessControlGetTypeID
18);
19
20unsafe impl Sync for SecAccessControl {}
21unsafe impl Send for SecAccessControl {}
22
23impl SecAccessControl {
24    /// Create `AccessControl` object from flags
25    pub fn create_with_flags(flags: CFOptionFlags) -> Result<Self> {
26        unsafe {
27            let access_control = SecAccessControlCreateWithFlags(
28                kCFAllocatorDefault,
29                null(),
30                flags,
31                ptr::null_mut(),
32            );
33            if access_control.is_null() {
34                Err(Error::from_code(errSecParam))
35            } else {
36                Ok(Self::wrap_under_create_rule(access_control))
37            }
38        }
39    }
40}