/* -------------------------------------------------------------------------- Function: GetNumberOfItemsBeingSynced Description: Determine the number of items being synced. NOTE: This uses the SOSDataSourceFactoryRef instead of calling the SecItem interface because the SecItem interface requires an entitlement but the SOSDataSourceFactoryRef does not. -------------------------------------------------------------------------- */ static int64_t GetNumberOfItemsBeingSynced() { __block int64_t result = 0; SOSDataSourceFactoryRef dsFactRef = SecItemDataSourceFactoryGetDefault(); CFArrayRef ds_names = dsFactRef->copy_names(dsFactRef); if (ds_names) { CFArrayForEach(ds_names, ^(const void *value) { if (isString(value)) { SOSManifestRef manifestRef = NULL; SOSDataSourceRef ds = dsFactRef->create_datasource(dsFactRef, value, NULL); if (ds) { manifestRef = SOSDataSourceCopyManifest(ds, NULL); if (manifestRef) result += SOSManifestGetCount(manifestRef); } CFReleaseSafe(manifestRef); SOSDataSourceRelease(ds, NULL); } }); }
CFDataRef SecOTRSessionCreateRemote_internal(CFDataRef publicAccountData, CFDataRef publicPeerId, CFDataRef privateAccountData, CFErrorRef *error) { SOSDataSourceFactoryRef ds = SecItemDataSourceFactoryGetDefault(); SOSAccountRef privateAccount = NULL; SOSAccountRef publicAccount = NULL; CFStringRef publicKeyString = NULL; SecKeyRef privateKeyRef = NULL; SecKeyRef publicKeyRef = NULL; SecOTRFullIdentityRef privateIdentity = NULL; SecOTRPublicIdentityRef publicIdentity = NULL; CFDataRef result = NULL; SecOTRSessionRef ourSession = NULL; require_quiet(ds, fail); require_quiet(publicPeerId, fail); privateAccount = (privateAccountData == NULL) ? CFRetainSafe(SOSKeychainAccountGetSharedAccount()) : SOSAccountCreateFromData(kCFAllocatorDefault, privateAccountData, ds, error); require_quiet(privateAccount, fail); privateKeyRef = SOSAccountCopyDeviceKey(privateAccount, error); require_quiet(privateKeyRef, fail); CFReleaseNull(privateAccount); privateIdentity = SecOTRFullIdentityCreateFromSecKeyRef(kCFAllocatorDefault, privateKeyRef, error); require_quiet(privateIdentity, fail); CFReleaseNull(privateKeyRef); publicKeyString = CFStringCreateFromExternalRepresentation(kCFAllocatorDefault, publicPeerId, kCFStringEncodingUTF8); require_quiet(publicKeyString, fail); publicAccount = (publicAccountData == NULL) ? CFRetainSafe(SOSKeychainAccountGetSharedAccount()) : SOSAccountCreateFromData(kCFAllocatorDefault, publicAccountData, ds, error); require_quiet(publicAccount, fail); publicKeyRef = SOSAccountCopyPublicKeyForPeer(publicAccount, publicKeyString, error); require_quiet(publicKeyRef, fail); CFReleaseNull(publicAccount); publicIdentity = SecOTRPublicIdentityCreateFromSecKeyRef(kCFAllocatorDefault, publicKeyRef, error); require_quiet(publicIdentity, fail); CFReleaseNull(publicKeyRef); ourSession = SecOTRSessionCreateFromID(kCFAllocatorDefault, privateIdentity, publicIdentity); CFMutableDataRef exportSession = CFDataCreateMutable(kCFAllocatorDefault, 0); SecOTRSAppendSerialization(ourSession, exportSession); result = exportSession; exportSession = NULL; fail: CFReleaseNull(ourSession); CFReleaseNull(publicKeyString); CFReleaseNull(privateAccount); CFReleaseNull(publicAccount); CFReleaseNull(privateKeyRef); CFReleaseNull(publicKeyRef); CFReleaseNull(publicIdentity); CFReleaseNull(privateIdentity); return result; }