diff options
Diffstat (limited to 'vendor/security-framework-sys/src/keychain.rs')
| -rw-r--r-- | vendor/security-framework-sys/src/keychain.rs | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/vendor/security-framework-sys/src/keychain.rs b/vendor/security-framework-sys/src/keychain.rs new file mode 100644 index 00000000..1413e3aa --- /dev/null +++ b/vendor/security-framework-sys/src/keychain.rs @@ -0,0 +1,194 @@ +#[cfg(target_os = "macos")] +use core_foundation_sys::base::CFTypeRef; +use core_foundation_sys::base::{Boolean, CFTypeID, OSStatus}; +use std::os::raw::{c_char, c_uint, c_void}; + +#[cfg(target_os = "macos")] +use crate::base::SecKeychainItemRef; +use crate::base::{SecAccessRef, SecKeychainRef}; + +pub const SEC_KEYCHAIN_SETTINGS_VERS1: c_uint = 1; + +#[repr(C)] +pub struct SecKeychainSettings { + pub version: c_uint, + pub lockOnSleep: Boolean, + pub useLockInterval: Boolean, + pub lockInterval: c_uint, +} + +/// Like Apple's headers, it assumes Little Endian, +/// as there are no supported Big Endian machines any more :( +macro_rules! char_lit { + ($e:expr) => { + ($e[3] as u32) + (($e[2] as u32) << 8) + (($e[1] as u32) << 16) + (($e[0] as u32) << 24) + }; +} + +macro_rules! char_lit_swapped { + ($e:expr) => { + ($e[0] as u32) + (($e[1] as u32) << 8) + (($e[2] as u32) << 16) + (($e[3] as u32) << 24) + }; +} + +#[repr(u32)] +#[derive(Copy, Clone, Eq, PartialEq, Debug)] +#[allow(clippy::upper_case_acronyms)] +pub enum SecProtocolType { + FTP = char_lit!(b"ftp "), + FTPAccount = char_lit!(b"ftpa"), + HTTP = char_lit!(b"http"), + IRC = char_lit!(b"irc "), + NNTP = char_lit!(b"nntp"), + POP3 = char_lit!(b"pop3"), + SMTP = char_lit!(b"smtp"), + SOCKS = char_lit!(b"sox "), + IMAP = char_lit!(b"imap"), + LDAP = char_lit!(b"ldap"), + AppleTalk = char_lit!(b"atlk"), + AFP = char_lit!(b"afp "), + Telnet = char_lit!(b"teln"), + SSH = char_lit!(b"ssh "), + FTPS = char_lit!(b"ftps"), + HTTPS = char_lit!(b"htps"), + HTTPProxy = char_lit!(b"htpx"), + HTTPSProxy = char_lit!(b"htsx"), + FTPProxy = char_lit!(b"ftpx"), + CIFS = char_lit!(b"cifs"), + SMB = char_lit!(b"smb "), + RTSP = char_lit!(b"rtsp"), + RTSPProxy = char_lit!(b"rtsx"), + DAAP = char_lit!(b"daap"), + EPPC = char_lit!(b"eppc"), + IPP = char_lit!(b"ipp "), + NNTPS = char_lit!(b"ntps"), + LDAPS = char_lit!(b"ldps"), + TelnetS = char_lit!(b"tels"), + IMAPS = char_lit!(b"imps"), + IRCS = char_lit!(b"ircs"), + POP3S = char_lit!(b"pops"), + CVSpserver = char_lit!(b"cvsp"), + SVN = char_lit!(b"svn "), + Any = 0, +} + +#[repr(u32)] +#[derive(Copy, Clone, Eq, PartialEq, Debug)] +#[allow(clippy::upper_case_acronyms)] +pub enum SecAuthenticationType { + // [sic] Apple has got two related enums each with a different endianness! + NTLM = char_lit_swapped!(b"ntlm"), + MSN = char_lit_swapped!(b"msna"), + DPA = char_lit_swapped!(b"dpaa"), + RPA = char_lit_swapped!(b"rpaa"), + HTTPBasic = char_lit_swapped!(b"http"), + HTTPDigest = char_lit_swapped!(b"httd"), + HTMLForm = char_lit_swapped!(b"form"), + Default = char_lit_swapped!(b"dflt"), + Any = 0, +} + +#[repr(i32)] +#[derive(Copy, Clone, Eq, PartialEq, Debug)] +pub enum SecPreferencesDomain { + User = 0, + System = 1, + Common = 2, + Dynamic = 3, +} + +extern "C" { + pub fn SecKeychainGetTypeID() -> CFTypeID; + pub fn SecKeychainCopyDefault(keychain: *mut SecKeychainRef) -> OSStatus; + pub fn SecKeychainCopyDomainDefault( + domain: SecPreferencesDomain, + keychain: *mut SecKeychainRef, + ) -> OSStatus; + pub fn SecKeychainCreate( + pathName: *const c_char, + passwordLength: c_uint, + password: *const c_void, + promptUser: Boolean, + initialAccess: SecAccessRef, + keychain: *mut SecKeychainRef, + ) -> OSStatus; + pub fn SecKeychainOpen(pathName: *const c_char, keychain: *mut SecKeychainRef) -> OSStatus; + pub fn SecKeychainUnlock( + keychain: SecKeychainRef, + passwordLength: c_uint, + password: *const c_void, + usePassword: Boolean, + ) -> OSStatus; + #[cfg(target_os = "macos")] + pub fn SecKeychainFindGenericPassword( + keychainOrArray: CFTypeRef, + serviceNameLength: u32, + serviceName: *const c_char, + accountNameLength: u32, + accountName: *const c_char, + passwordLength: *mut u32, + passwordData: *mut *mut c_void, + itemRef: *mut SecKeychainItemRef, + ) -> OSStatus; + + #[cfg(target_os = "macos")] + pub fn SecKeychainFindInternetPassword( + keychainOrArray: CFTypeRef, + serverNameLength: u32, + serverName: *const c_char, + securityDomainLength: u32, + securityDomain: *const c_char, + accountNameLength: u32, + accountName: *const c_char, + pathLength: u32, + path: *const c_char, + port: u16, + protocol: SecProtocolType, + authenticationType: SecAuthenticationType, + passwordLength: *mut u32, + passwordData: *mut *mut c_void, + itemRef: *mut SecKeychainItemRef, + ) -> OSStatus; + + #[cfg(target_os = "macos")] + pub fn SecKeychainAddGenericPassword( + keychain: SecKeychainRef, + serviceNameLength: u32, + serviceName: *const c_char, + accountNameLength: u32, + accountName: *const c_char, + passwordLength: u32, + passwordData: *const c_void, + itemRef: *mut SecKeychainItemRef, + ) -> OSStatus; + + #[cfg(target_os = "macos")] + pub fn SecKeychainAddInternetPassword( + keychain: SecKeychainRef, + serverNameLength: u32, + serverName: *const c_char, + securityDomainLength: u32, + securityDomain: *const c_char, + accountNameLength: u32, + accountName: *const c_char, + pathLength: u32, + path: *const c_char, + port: u16, + protocol: SecProtocolType, + authenticationType: SecAuthenticationType, + passwordLength: u32, + passwordData: *const c_void, + itemRef: *mut SecKeychainItemRef, + ) -> OSStatus; + + pub fn SecKeychainSetSettings( + keychain: SecKeychainRef, + newSettings: *const SecKeychainSettings, + ) -> OSStatus; + + #[cfg(target_os = "macos")] + pub fn SecKeychainGetUserInteractionAllowed(state: *mut Boolean) -> OSStatus; + + #[cfg(target_os = "macos")] + pub fn SecKeychainSetUserInteractionAllowed(state: Boolean) -> OSStatus; +} |
