2 * Copyright (c) 2016 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
25 // SOSBackupInformation.c
29 #include "SOSBackupInformation.h"
30 #include "SOSAccountPriv.h"
31 #include <CoreFoundation/CFNumber.h>
32 #include <utilities/SecCFWrappers.h>
34 const CFStringRef kSOSBkpInfoStatus
= CFSTR("BkpInfoStatus");
35 const CFStringRef kSOSBkpInfoBSKB
= CFSTR("BkpInfoBSKB");
36 const CFStringRef kSOSBkpInfoRKBG
= CFSTR("BkpInfoRKBG");
38 CFDictionaryRef
SOSBackupInformation(SOSAccountTransactionRef txn
, CFErrorRef
*error
) {
39 CFNumberRef status
= NULL
;
41 __block
bool havebskbcontent
= false;
42 CFMutableDictionaryRef retval
= CFDictionaryCreateMutableForCFTypes(kCFAllocatorDefault
);
43 require_action_quiet(txn
&& txn
->account
, errOut
, ibkpInfoStatus
= noTxnorAcct
);
44 require_action_quiet(retval
, errOut
, ibkpInfoStatus
= noAlloc
);
45 require_action_quiet(txn
, errOut
, ibkpInfoStatus
= noTxnorAcct
);
46 SOSAccountRef account
= txn
->account
;
47 require_action_quiet(account
->user_public
&& account
->user_public_trusted
, errOut
, ibkpInfoStatus
= noTrustedPubKey
);
48 CFMutableDictionaryRef bskbders
= CFDictionaryCreateMutableForCFTypes(kCFAllocatorDefault
);
49 SOSAccountForEachRing(account
, ^SOSRingRef(CFStringRef name
, SOSRingRef ring
) {
50 if(SOSRingGetType(ring
) == kSOSRingBackup
) {
51 CFDataRef bskbder
= SOSRingGetPayload(ring
, NULL
);
52 if(bskbder
) CFDictionaryAddValue(bskbders
, name
, bskbder
);
53 havebskbcontent
= true;
54 } else if(SOSRingGetType(ring
) == kSOSRingRecovery
) {
55 CFDataRef rkbgder
= SOSRingGetPayload(ring
, NULL
);
56 if(rkbgder
) CFDictionaryAddValue(retval
, kSOSBkpInfoRKBG
, rkbgder
);
58 return NULL
; // we're reporting - never changing the ring
61 ibkpInfoStatus
= noError
;
62 CFDictionaryAddValue(retval
, kSOSBkpInfoBSKB
, bskbders
);
64 ibkpInfoStatus
= noBSKBs
;
66 CFReleaseNull(bskbders
);
69 status
= CFNumberCreate(kCFAllocatorDefault
, kCFNumberIntType
, &ibkpInfoStatus
);
70 CFDictionaryAddValue(retval
, kSOSBkpInfoStatus
, status
);
71 CFReleaseNull(status
);