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
);