/ keychain / SecureObjectSync / SOSAccountGetSet.m
SOSAccountGetSet.m
 1  //
 2  //  SOSAccountGetSet.c
 3  //  Security
 4  //
 5  //
 6  
 7  #include "SOSAccountPriv.h"
 8  
 9  #include <utilities/SecCFWrappers.h>
10  
11  #import "keychain/SecureObjectSync/SOSAccountTrust.h"
12  #import "keychain/SecureObjectSync/SOSAccountTrustClassic.h"
13  
14  //
15  // MARK: Generic Value manipulation
16  //
17  
18  static inline bool SOSAccountEnsureExpansion(SOSAccount* account, CFErrorRef *error) {
19      
20      if (!account.trust.expansion) {
21          account.trust.expansion = [NSMutableDictionary dictionary];
22      }
23  
24      return SecAllocationError(((__bridge CFDictionaryRef)account.trust.expansion), error, CFSTR("Can't Alloc Account Expansion dictionary"));
25  }
26  
27  bool SOSAccountClearValue(SOSAccount* account, CFStringRef key, CFErrorRef *error) {
28      bool success = SOSAccountEnsureExpansion(account, error);
29      if(!success){
30          return success;
31      }
32  
33      [account.trust.expansion removeObjectForKey: (__bridge NSString* _Nonnull)(key)];
34  
35      return success;
36  }
37  
38  bool SOSAccountSetValue(SOSAccount* account, CFStringRef key, CFTypeRef value, CFErrorRef *error) {
39      if (value == NULL) return SOSAccountClearValue(account, key, error);
40  
41      bool success = SOSAccountEnsureExpansion(account, error);
42      if(!success)
43          return success;
44  
45      [account.trust.expansion setObject:(__bridge id _Nonnull)(value) forKey:(__bridge NSString* _Nonnull)(key)];
46  
47      return success;
48  }
49  
50  //
51  // MARK: UUID
52  CFStringRef SOSAccountCopyUUID(SOSAccount* account) {
53      CFStringRef uuid = CFRetainSafe(asString(SOSAccountGetValue(account, kSOSAccountUUID, NULL), NULL));
54      if (uuid == NULL) {
55          CFUUIDRef newID = CFUUIDCreate(kCFAllocatorDefault);
56          uuid = CFUUIDCreateString(kCFAllocatorDefault, newID);
57  
58          CFErrorRef setError = NULL;
59          if (!SOSAccountSetValue(account, kSOSAccountUUID, uuid, &setError)) {
60              secerror("Failed to set UUID: %@ (%@)", uuid, setError);
61          }
62          CFReleaseNull(setError);
63          CFReleaseNull(newID);
64      }
65      return uuid;
66  }
67  
68  void SOSAccountEnsureUUID(SOSAccount* account) {
69      CFStringRef uuid = SOSAccountCopyUUID(account);
70      CFReleaseNull(uuid);
71  }
72