2 * Copyright (c) 2017 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@
24 #import <Foundation/Foundation.h>
27 #import "Analytics/SFAnalytics.h"
29 extern NSString
* const CKKSAnalyticsInCircle
;
30 extern NSString
* const CKKSAnalyticsHasTLKs
;
31 extern NSString
* const CKKSAnalyticsSyncedClassARecently
;
32 extern NSString
* const CKKSAnalyticsSyncedClassCRecently
;
33 extern NSString
* const CKKSAnalyticsIncomingQueueIsErrorFree
;
34 extern NSString
* const CKKSAnalyticsOutgoingQueueIsErrorFree
;
35 extern NSString
* const CKKSAnalyticsInSync
;
36 extern NSString
* const CKKSAnalyticsValidCredentials
;
37 extern NSString
* const CKKSAnalyticsLastUnlock
;
38 extern NSString
* const CKKSAnalyticsLastKeystateReady
;
39 extern NSString
* const CKKSAnalyticsLastInCircle
;
41 extern NSString
* const OctagonAnalyticsStateMachineState
;
42 extern NSString
* const OctagonAnalyticIcloudAccountState
;
43 extern NSString
* const OctagonAnalyticsTrustState
;
44 extern NSString
* const OctagonAnalyticsLastHealthCheck
;
45 extern NSString
* const OctagonAnalyticsSOSStatus
;
46 extern NSString
* const OctagonAnalyticsDateOfLastPreflightPreapprovedJoin
;
47 extern NSString
* const OctagonAnalyticsLastKeystateReady
;
48 extern NSString
* const OctagonAnalyticsLastCoreFollowup
;
49 extern NSString
* const OctagonAnalyticsCoreFollowupFailureCount
;
50 extern NSString
* const OctagonAnalyticsCoreFollowupLastFailureTime
;
51 extern NSString
* const OctagonAnalyticsPrerecordPending
;
52 extern NSString
* const OctagonAnalyticsCDPStateRun
;
54 extern NSString
* const CKKSAnalyticsLastCKKSPush
;
55 extern NSString
* const CKKSAnalyticsLastOctagonPush
;
57 extern NSString
* const OctagonAnalyticsKVSProvisioned
;
58 extern NSString
* const OctagonAnalyticsKVSEnabled
;
59 extern NSString
* const OctagonAnalyticsKeychainSyncProvisioned
;
60 extern NSString
* const OctagonAnalyticsKeychainSyncEnabled
;
61 extern NSString
* const OctagonAnalyticsCloudKitProvisioned
;
62 extern NSString
* const OctagonAnalyticsCloudKitEnabled
;
64 @
class CKKSKeychainView
;
66 @protocol CKKSAnalyticsFailableEvent
<NSObject
>
68 typedef NSString
<CKKSAnalyticsFailableEvent
> CKKSAnalyticsFailableEvent
;
69 extern CKKSAnalyticsFailableEvent
* const CKKSEventProcessIncomingQueueClassA
;
70 extern CKKSAnalyticsFailableEvent
* const CKKSEventProcessIncomingQueueClassC
;
71 extern CKKSAnalyticsFailableEvent
* const CKKSEventProcessOutgoingQueue
;
72 extern CKKSAnalyticsFailableEvent
* const CKKSEventUploadChanges
;
73 extern CKKSAnalyticsFailableEvent
* const CKKSEventStateError
;
74 extern CKKSAnalyticsFailableEvent
* const CKKSEventProcessHealKeyHierarchy
;
75 extern CKKSAnalyticsFailableEvent
* const CKKSEventProcessReencryption
;
77 extern CKKSAnalyticsFailableEvent
* const OctagonEventPreflightBottle
;
78 extern CKKSAnalyticsFailableEvent
* const OctagonEventLaunchBottle
;
79 extern CKKSAnalyticsFailableEvent
* const OctagonEventScrubBottle
;
80 extern CKKSAnalyticsFailableEvent
* const OctagonEventSignIn
;
81 extern CKKSAnalyticsFailableEvent
* const OctagonEventSignOut
;
82 extern CKKSAnalyticsFailableEvent
* const OctagonEventRestoreBottle
;
83 extern CKKSAnalyticsFailableEvent
* const OctagonEventRamp
;
84 extern CKKSAnalyticsFailableEvent
* const OctagonEventBottleCheck
;
85 extern CKKSAnalyticsFailableEvent
* const OctagonEventCoreFollowUp
;
86 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpdateBottle
;
88 extern CKKSAnalyticsFailableEvent
* const OctagonEventRecoverBottle
;
89 extern CKKSAnalyticsFailableEvent
* const OctagonEventFetchAllBottles
;
90 extern CKKSAnalyticsFailableEvent
* const OctagonEventFetchEscrowContents
;
92 extern CKKSAnalyticsFailableEvent
* const OctagonEventRestoredSignedBottlePeer
;
93 extern CKKSAnalyticsFailableEvent
* const OctagonEventRestoredOctagonPeerEncryptionKey
;
94 extern CKKSAnalyticsFailableEvent
* const OctagonEventRestoredOctagonPeerSigningKey
;
95 extern CKKSAnalyticsFailableEvent
* const OctagonEventRestoreComplete
;
97 /* Initial health check */
98 extern CKKSAnalyticsFailableEvent
* const OctagonEventCheckTrustState
;
100 /* Outer calls as seen by the client */
101 extern CKKSAnalyticsFailableEvent
* const OctagonEventBottledPeerRestore
;
102 extern CKKSAnalyticsFailableEvent
* const OctagonEventFetchEscrowContents
;
103 extern CKKSAnalyticsFailableEvent
* const OctagonEventResetAndEstablish
;
104 extern CKKSAnalyticsFailableEvent
* const OctagonEventEstablish
;
105 extern CKKSAnalyticsFailableEvent
* const OctagonEventLeaveClique
;
106 extern CKKSAnalyticsFailableEvent
* const OctagonEventRemoveFriendsInClique
;
107 extern CKKSAnalyticsFailableEvent
* const OctagonEventRecoveryKey
;
109 /* Inner calls as seen by TPH and securityd */
111 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradeFetchDeviceIDs
;
112 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradeSetAllowList
;
113 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradeSilentEscrow
;
114 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradePreapprovedJoin
;
115 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradePreflightPreapprovedJoin
;
116 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradePrepare
;
117 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradePreapprovedJoinAfterPairing
;
119 /* inner: join with voucher */
120 extern CKKSAnalyticsFailableEvent
* const OctagonEventJoinWithVoucher
;
122 /* inner: join with bottle */
123 extern CKKSAnalyticsFailableEvent
* const OctagonEventPreflightVouchWithBottle
;
124 extern CKKSAnalyticsFailableEvent
* const OctagonEventVoucherWithBottle
;
126 /* inner: join with recovery key */
127 extern CKKSAnalyticsFailableEvent
* const OctagonEventVoucherWithRecoveryKey
;
128 extern CKKSAnalyticsFailableEvent
* const OctagonEventJoinRecoveryKeyValidationFailed
;
129 extern CKKSAnalyticsFailableEvent
* const OctagonEventJoinRecoveryKeyFailed
;
130 extern CKKSAnalyticsFailableEvent
* const OctagonEventJoinRecoveryKeyCircleReset
;
131 extern CKKSAnalyticsFailableEvent
* const OctagonEventJoinRecoveryKeyCircleResetFailed
;
132 extern CKKSAnalyticsFailableEvent
* const OctagonEventJoinRecoveryKeyEnrollFailed
;
134 /* inner: set recovery key */
135 extern CKKSAnalyticsFailableEvent
* const OctagonEventSetRecoveryKey
;
136 extern CKKSAnalyticsFailableEvent
* const OctagonEventSetRecoveryKeyValidationFailed
;
139 extern CKKSAnalyticsFailableEvent
* const OctagonEventReset
;
142 extern CKKSAnalyticsFailableEvent
* const OctagonEventPrepareIdentity
;
144 /* inner: establish */
145 extern CKKSAnalyticsFailableEvent
* const OctagonEventEstablishIdentity
;
147 /* inner: fetchviews */
148 extern CKKSAnalyticsFailableEvent
* const OctagonEventFetchViews
;
151 extern CKKSAnalyticsFailableEvent
* const OctagonEventStateTransition
;
153 /* become untrusted */
154 extern CKKSAnalyticsFailableEvent
* const OctagonEventCheckTrustForCFU
;
156 /* watchOS only: pairing with companion */
157 extern CKKSAnalyticsFailableEvent
* const OctagonEventCompanionPairing
;
159 /* trust state from trusted peers helper*/
160 extern CKKSAnalyticsFailableEvent
* const OctagonEventTPHHealthCheckStatus
;
162 @protocol CKKSAnalyticsSignpostEvent
<NSObject
>
164 typedef NSString
<CKKSAnalyticsSignpostEvent
> CKKSAnalyticsSignpostEvent
;
165 extern CKKSAnalyticsSignpostEvent
* const CKKSEventPushNotificationReceived
;
166 extern CKKSAnalyticsSignpostEvent
* const CKKSEventItemAddedToOutgoingQueue
;
167 extern CKKSAnalyticsSignpostEvent
* const CKKSEventReachabilityTimerExpired
;
168 extern CKKSAnalyticsSignpostEvent
* const CKKSEventMissingLocalItemsFound
;
170 @protocol CKKSAnalyticsActivity
<NSObject
>
172 typedef NSString
<CKKSAnalyticsActivity
> CKKSAnalyticsActivity
;
173 extern CKKSAnalyticsActivity
* const CKKSActivityOTFetchRampState
;
174 extern CKKSAnalyticsActivity
* const CKKSActivityOctagonPreflightBottle
;
175 extern CKKSAnalyticsActivity
* const CKKSActivityOctagonLaunchBottle
;
176 extern CKKSAnalyticsActivity
* const CKKSActivityOctagonRestore
;
177 extern CKKSAnalyticsActivity
* const CKKSActivityScrubBottle
;
178 extern CKKSAnalyticsActivity
* const CKKSActivityBottleCheck
;
179 extern CKKSAnalyticsActivity
* const CKKSActivityOctagonUpdateBottle
;
181 extern CKKSAnalyticsActivity
* const OctagonActivityAccountAvailable
;
182 extern CKKSAnalyticsActivity
* const OctagonActivityAccountNotAvailable
;
183 extern CKKSAnalyticsActivity
* const OctagonActivityResetAndEstablish
;
184 extern CKKSAnalyticsActivity
* const OctagonActivityEstablish
;
185 extern CKKSAnalyticsActivity
* const OctagonActivityFetchAllViableBottles
;
186 extern CKKSAnalyticsActivity
* const OctagonActivityFetchEscrowContents
;
187 extern CKKSAnalyticsActivity
* const OctagonActivityBottledPeerRestore
;
188 extern CKKSAnalyticsActivity
* const OctagonActivitySetRecoveryKey
;
189 extern CKKSAnalyticsActivity
* const OctagonActivityLeaveClique
;
190 extern CKKSAnalyticsActivity
* const OctagonActivityRemoveFriendsInClique
;
191 extern CKKSAnalyticsActivity
* const OctagonActivityJoinWithRecoveryKey
;
192 extern CKKSAnalyticsActivity
* const OctagonSOSAdapterUpdateKeys
;
195 @interface CKKSAnalytics
: SFAnalytics
197 + (instancetype
)logger
;
199 - (void)logSuccessForEvent
:(CKKSAnalyticsFailableEvent
*)event inView
:(CKKSKeychainView
*)view
;
200 - (void)logRecoverableError
:(NSError
*)error
201 forEvent
:(CKKSAnalyticsFailableEvent
*)event
202 inView
:(CKKSKeychainView
*)view
203 withAttributes
:(NSDictionary
*)attributes
;
205 - (void)logRecoverableError
:(NSError
*)error
206 forEvent
:(CKKSAnalyticsFailableEvent
*)event
207 zoneName
:(NSString
*)zoneName
208 withAttributes
:(NSDictionary
*)attributes
;
210 - (void)logRecoverableError
:(NSError
*)error
211 forEvent
:(CKKSAnalyticsFailableEvent
*)event
212 withAttributes
:(NSDictionary
*)attributes
;
214 - (void)logUnrecoverableError
:(NSError
*)error
215 forEvent
:(CKKSAnalyticsFailableEvent
*)event
216 withAttributes
:(NSDictionary
*)attributes
;
218 - (void)logUnrecoverableError
:(NSError
*)error
219 forEvent
:(CKKSAnalyticsFailableEvent
*)event
220 inView
:(CKKSKeychainView
*)view
221 withAttributes
:(NSDictionary
*)attributes
;
223 - (void)noteEvent
:(CKKSAnalyticsSignpostEvent
*)event
;
224 - (void)noteEvent
:(CKKSAnalyticsSignpostEvent
*)event inView
:(CKKSKeychainView
*)view
;
226 - (void)setDateProperty
:(NSDate
*)date forKey
:(NSString
*)key inView
:(CKKSKeychainView
*)view
;
227 - (NSDate
*)datePropertyForKey
:(NSString
*)key inView
:(CKKSKeychainView
*)view
;
231 @interface
CKKSAnalytics (UnitTesting
)
233 - (NSDate
*)dateOfLastSuccessForEvent
:(CKKSAnalyticsFailableEvent
*)event
234 inView
:(CKKSKeychainView
*)view
;
235 - (NSDictionary
*)errorChain
:(NSError
*)error
236 depth
:(NSUInteger
)depth
;
237 - (NSDictionary
*)createErrorAttributes
:(NSError
*)error
238 depth
:(NSUInteger
)depth
239 attributes
:(NSDictionary
*)attributes
;