From cfe55be4369857339008ef2fc3140745a561428a Mon Sep 17 00:00:00 2001 From: Evan DeLaney Date: Sun, 3 Dec 2023 14:35:12 -0500 Subject: [PATCH] feature: Support iCloud Keychain --- src/iosMain/kotlin/com/liftric/kvault/KVault.kt | 3 ++- src/iosMain/kotlin/com/liftric/kvault/impl/KVaultImpl.kt | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/iosMain/kotlin/com/liftric/kvault/KVault.kt b/src/iosMain/kotlin/com/liftric/kvault/KVault.kt index b78b1c8..fe55aa7 100644 --- a/src/iosMain/kotlin/com/liftric/kvault/KVault.kt +++ b/src/iosMain/kotlin/com/liftric/kvault/KVault.kt @@ -5,5 +5,6 @@ import com.liftric.kvault.impl.KVaultImpl fun KVault( serviceName: String? = null, accessGroup: String? = null, + synchronizable: Boolean = false, accessibility: KVaultImpl.Accessible = KVaultImpl.Accessible.WhenUnlocked -): KVault = KVaultImpl(serviceName, accessGroup, accessibility) +): KVault = KVaultImpl(serviceName, accessGroup, synchronizable, accessibility) diff --git a/src/iosMain/kotlin/com/liftric/kvault/impl/KVaultImpl.kt b/src/iosMain/kotlin/com/liftric/kvault/impl/KVaultImpl.kt index 392d431..48db40c 100644 --- a/src/iosMain/kotlin/com/liftric/kvault/impl/KVaultImpl.kt +++ b/src/iosMain/kotlin/com/liftric/kvault/impl/KVaultImpl.kt @@ -41,6 +41,7 @@ import platform.Security.kSecAttrAccessibleWhenUnlocked import platform.Security.kSecAttrAccessibleWhenUnlockedThisDeviceOnly import platform.Security.kSecAttrAccount import platform.Security.kSecAttrService +import platform.Security.kSecAttrSynchronizable import platform.Security.kSecClass import platform.Security.kSecClassGenericPassword import platform.Security.kSecMatchLimit @@ -59,12 +60,14 @@ import platform.posix.memcpy * * @param serviceName Name of the service. Used to categories entries. * @param accessGroup Name of the access group. Used to share entries between apps. + * @param synchronizable If true, the entries will be synced with iCloud. * @param accessibility Level of the accessibility for the Keychain instance. * @constructor Initiates a Keychain with the given parameters. */ actual open class KVaultImpl( private val serviceName: String? = null, private val accessGroup: String? = null, + private val synchronizable: Boolean = false, private val accessibility: Accessible = Accessible.WhenUnlocked ): KVault { /** @@ -358,7 +361,8 @@ actual open class KVaultImpl( private fun context(vararg values: Any?, block: Context.(List) -> T): T { val standard = mapOf( kSecAttrService to CFBridgingRetain(serviceName), - kSecAttrAccessGroup to CFBridgingRetain(accessGroup) + kSecAttrAccessGroup to CFBridgingRetain(accessGroup), + kSecAttrSynchronizable to if (synchronizable) kCFBooleanTrue else kCFBooleanFalse ) val custom = arrayOf(*values).map { CFBridgingRetain(it) } return block.invoke(Context(standard), custom).apply {