SOSAccountGetSet.m [plain text]
//
// SOSAccountGetSet.c
// Security
//
//
#include "SOSAccountPriv.h"
#include <utilities/SecCFWrappers.h>
#import <Security/SecureObjectSync/SOSAccountTrust.h>
#import <Security/SecureObjectSync/SOSAccountTrustClassic.h>
//
// MARK: Generic Value manipulation
//
static inline bool SOSAccountEnsureExpansion(SOSAccount* account, CFErrorRef *error) {
if (!account.trust.expansion) {
account.trust.expansion = [NSMutableDictionary dictionary];
}
return SecAllocationError(((__bridge CFDictionaryRef)account.trust.expansion), error, CFSTR("Can't Alloc Account Expansion dictionary"));
}
bool SOSAccountClearValue(SOSAccount* account, CFStringRef key, CFErrorRef *error) {
bool success = SOSAccountEnsureExpansion(account, error);
if(!success){
return success;
}
[account.trust.expansion removeObjectForKey: (__bridge NSString* _Nonnull)(key)];
return success;
}
bool SOSAccountSetValue(SOSAccount* account, CFStringRef key, CFTypeRef value, CFErrorRef *error) {
if (value == NULL) return SOSAccountClearValue(account, key, error);
bool success = SOSAccountEnsureExpansion(account, error);
if(!success)
return success;
[account.trust.expansion setObject:(__bridge id _Nonnull)(value) forKey:(__bridge NSString* _Nonnull)(key)];
return success;
}
//
// MARK: UUID
CFStringRef SOSAccountCopyUUID(SOSAccount* account) {
CFStringRef uuid = CFRetainSafe(asString(SOSAccountGetValue(account, kSOSAccountUUID, NULL), NULL));
if (uuid == NULL) {
CFUUIDRef newID = CFUUIDCreate(kCFAllocatorDefault);
uuid = CFUUIDCreateString(kCFAllocatorDefault, newID);
CFErrorRef setError = NULL;
if (!SOSAccountSetValue(account, kSOSAccountUUID, uuid, &setError)) {
secerror("Failed to set UUID: }
CFReleaseNull(setError);
CFReleaseNull(newID);
}
return uuid;
}
void SOSAccountEnsureUUID(SOSAccount* account) {
CFStringRef uuid = SOSAccountCopyUUID(account);
CFReleaseNull(uuid);
}