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 OctagonAnalyticsCoreFollowupStatus
;
50 extern NSString
* const OctagonAnalyticsCoreFollowupFailureCount
;
51 extern NSString
* const OctagonAnalyticsCoreFollowupLastFailureTime
;
52 extern NSString
* const OctagonAnalyticsPrerecordPending
;
53 extern NSString
* const OctagonAnalyticsCDPStateRun
;
55 extern NSString
* const OctagonAnalyticsKVSProvisioned
;
56 extern NSString
* const OctagonAnalyticsKVSEnabled
;
57 extern NSString
* const OctagonAnalyticsKeychainSyncProvisioned
;
58 extern NSString
* const OctagonAnalyticsKeychainSyncEnabled
;
59 extern NSString
* const OctagonAnalyticsCloudKitProvisioned
;
60 extern NSString
* const OctagonAnalyticsCloudKitEnabled
;
62 @
class CKKSKeychainView
;
64 @protocol CKKSAnalyticsFailableEvent
<NSObject
>
66 typedef NSString
<CKKSAnalyticsFailableEvent
> CKKSAnalyticsFailableEvent
;
67 extern CKKSAnalyticsFailableEvent
* const CKKSEventProcessIncomingQueueClassA
;
68 extern CKKSAnalyticsFailableEvent
* const CKKSEventProcessIncomingQueueClassC
;
69 extern CKKSAnalyticsFailableEvent
* const CKKSEventProcessOutgoingQueue
;
70 extern CKKSAnalyticsFailableEvent
* const CKKSEventUploadChanges
;
71 extern CKKSAnalyticsFailableEvent
* const CKKSEventStateError
;
72 extern CKKSAnalyticsFailableEvent
* const CKKSEventProcessHealKeyHierarchy
;
73 extern CKKSAnalyticsFailableEvent
* const CKKSEventProcessReencryption
;
75 extern CKKSAnalyticsFailableEvent
* const OctagonEventPreflightBottle
;
76 extern CKKSAnalyticsFailableEvent
* const OctagonEventLaunchBottle
;
77 extern CKKSAnalyticsFailableEvent
* const OctagonEventScrubBottle
;
78 extern CKKSAnalyticsFailableEvent
* const OctagonEventSignIn
;
79 extern CKKSAnalyticsFailableEvent
* const OctagonEventSignOut
;
80 extern CKKSAnalyticsFailableEvent
* const OctagonEventRestoreBottle
;
81 extern CKKSAnalyticsFailableEvent
* const OctagonEventRamp
;
82 extern CKKSAnalyticsFailableEvent
* const OctagonEventBottleCheck
;
83 extern CKKSAnalyticsFailableEvent
* const OctagonEventCoreFollowUp
;
84 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpdateBottle
;
86 extern CKKSAnalyticsFailableEvent
* const OctagonEventRecoverBottle
;
87 extern CKKSAnalyticsFailableEvent
* const OctagonEventFetchAllBottles
;
88 extern CKKSAnalyticsFailableEvent
* const OctagonEventFetchEscrowContents
;
90 extern CKKSAnalyticsFailableEvent
* const OctagonEventRestoredSignedBottlePeer
;
91 extern CKKSAnalyticsFailableEvent
* const OctagonEventRestoredOctagonPeerEncryptionKey
;
92 extern CKKSAnalyticsFailableEvent
* const OctagonEventRestoredOctagonPeerSigningKey
;
93 extern CKKSAnalyticsFailableEvent
* const OctagonEventRestoreComplete
;
95 /* Initial health check */
96 extern CKKSAnalyticsFailableEvent
* const OctagonEventCheckTrustState
;
98 /* Outer calls as seen by the client */
99 extern CKKSAnalyticsFailableEvent
* const OctagonEventBottledPeerRestore
;
100 extern CKKSAnalyticsFailableEvent
* const OctagonEventFetchEscrowContents
;
101 extern CKKSAnalyticsFailableEvent
* const OctagonEventResetAndEstablish
;
102 extern CKKSAnalyticsFailableEvent
* const OctagonEventEstablish
;
103 extern CKKSAnalyticsFailableEvent
* const OctagonEventLeaveClique
;
104 extern CKKSAnalyticsFailableEvent
* const OctagonEventRemoveFriendsInClique
;
105 extern CKKSAnalyticsFailableEvent
* const OctagonEventRecoveryKey
;
107 /* Inner calls as seen by TPH and securityd */
109 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradeFetchDeviceIDs
;
110 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradeSetAllowList
;
111 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradeSilentEscrow
;
112 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradePreapprovedJoin
;
113 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradePreflightPreapprovedJoin
;
114 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradePrepare
;
115 extern CKKSAnalyticsFailableEvent
* const OctagonEventUpgradePreapprovedJoinAfterPairing
;
117 /* inner: join with voucher */
118 extern CKKSAnalyticsFailableEvent
* const OctagonEventJoinWithVoucher
;
120 /* inner: join with bottle */
121 extern CKKSAnalyticsFailableEvent
* const OctagonEventVoucherWithBottle
;
123 /* inner: join with recovery key */
124 extern CKKSAnalyticsFailableEvent
* const OctagonEventVoucherWithRecoveryKey
;
125 extern CKKSAnalyticsFailableEvent
* const OctagonEventJoinRecoveryKeyValidationFailed
;
126 extern CKKSAnalyticsFailableEvent
* const OctagonEventJoinRecoveryKeyFailed
;
127 extern CKKSAnalyticsFailableEvent
* const OctagonEventJoinRecoveryKeyCircleReset
;
128 extern CKKSAnalyticsFailableEvent
* const OctagonEventJoinRecoveryKeyCircleResetFailed
;
129 extern CKKSAnalyticsFailableEvent
* const OctagonEventJoinRecoveryKeyEnrollFailed
;
131 /* inner: set recovery key */
132 extern CKKSAnalyticsFailableEvent
* const OctagonEventSetRecoveryKey
;
133 extern CKKSAnalyticsFailableEvent
* const OctagonEventSetRecoveryKeyValidationFailed
;
136 extern CKKSAnalyticsFailableEvent
* const OctagonEventReset
;
139 extern CKKSAnalyticsFailableEvent
* const OctagonEventPrepareIdentity
;
141 /* inner: establish */
142 extern CKKSAnalyticsFailableEvent
* const OctagonEventEstablishIdentity
;
144 /* inner: fetchviews */
145 extern CKKSAnalyticsFailableEvent
* const OctagonEventFetchViews
;
148 extern CKKSAnalyticsFailableEvent
* const OctagonEventStateTransition
;
150 /* become untrusted */
151 extern CKKSAnalyticsFailableEvent
* const OctagonEventCheckTrustForCFU
;
153 /* watchOS only: pairing with companion */
154 extern CKKSAnalyticsFailableEvent
* const OctagonEventCompanionPairing
;
156 /* trust state from trusted peers helper*/
157 extern CKKSAnalyticsFailableEvent
* const OctagonEventTPHHealthCheckStatus
;
159 @protocol CKKSAnalyticsSignpostEvent
<NSObject
>
161 typedef NSString
<CKKSAnalyticsSignpostEvent
> CKKSAnalyticsSignpostEvent
;
162 extern CKKSAnalyticsSignpostEvent
* const CKKSEventPushNotificationReceived
;
163 extern CKKSAnalyticsSignpostEvent
* const CKKSEventItemAddedToOutgoingQueue
;
164 extern CKKSAnalyticsSignpostEvent
* const CKKSEventReachabilityTimerExpired
;
165 extern CKKSAnalyticsSignpostEvent
* const CKKSEventMissingLocalItemsFound
;
167 @protocol CKKSAnalyticsActivity
<NSObject
>
169 typedef NSString
<CKKSAnalyticsActivity
> CKKSAnalyticsActivity
;
170 extern CKKSAnalyticsActivity
* const CKKSActivityOTFetchRampState
;
171 extern CKKSAnalyticsActivity
* const CKKSActivityOctagonPreflightBottle
;
172 extern CKKSAnalyticsActivity
* const CKKSActivityOctagonLaunchBottle
;
173 extern CKKSAnalyticsActivity
* const CKKSActivityOctagonRestore
;
174 extern CKKSAnalyticsActivity
* const CKKSActivityScrubBottle
;
175 extern CKKSAnalyticsActivity
* const CKKSActivityBottleCheck
;
176 extern CKKSAnalyticsActivity
* const CKKSActivityOctagonUpdateBottle
;
178 extern CKKSAnalyticsActivity
* const OctagonActivityAccountAvailable
;
179 extern CKKSAnalyticsActivity
* const OctagonActivityAccountNotAvailable
;
180 extern CKKSAnalyticsActivity
* const OctagonActivityResetAndEstablish
;
181 extern CKKSAnalyticsActivity
* const OctagonActivityEstablish
;
182 extern CKKSAnalyticsActivity
* const OctagonActivityFetchAllViableBottles
;
183 extern CKKSAnalyticsActivity
* const OctagonActivityFetchEscrowContents
;
184 extern CKKSAnalyticsActivity
* const OctagonActivityBottledPeerRestore
;
185 extern CKKSAnalyticsActivity
* const OctagonActivitySetRecoveryKey
;
186 extern CKKSAnalyticsActivity
* const OctagonActivityLeaveClique
;
187 extern CKKSAnalyticsActivity
* const OctagonActivityRemoveFriendsInClique
;
188 extern CKKSAnalyticsActivity
* const OctagonActivityJoinWithRecoveryKey
;
189 extern CKKSAnalyticsActivity
* const OctagonSOSAdapterUpdateKeys
;
192 @interface CKKSAnalytics
: SFAnalytics
194 + (instancetype
)logger
;
196 - (void)logSuccessForEvent
:(CKKSAnalyticsFailableEvent
*)event inView
:(CKKSKeychainView
*)view
;
197 - (void)logRecoverableError
:(NSError
*)error
198 forEvent
:(CKKSAnalyticsFailableEvent
*)event
199 inView
:(CKKSKeychainView
*)view
200 withAttributes
:(NSDictionary
*)attributes
;
202 - (void)logRecoverableError
:(NSError
*)error
203 forEvent
:(CKKSAnalyticsFailableEvent
*)event
204 zoneName
:(NSString
*)zoneName
205 withAttributes
:(NSDictionary
*)attributes
;
207 - (void)logRecoverableError
:(NSError
*)error
208 forEvent
:(CKKSAnalyticsFailableEvent
*)event
209 withAttributes
:(NSDictionary
*)attributes
;
211 - (void)logUnrecoverableError
:(NSError
*)error
212 forEvent
:(CKKSAnalyticsFailableEvent
*)event
213 withAttributes
:(NSDictionary
*)attributes
;
215 - (void)logUnrecoverableError
:(NSError
*)error
216 forEvent
:(CKKSAnalyticsFailableEvent
*)event
217 inView
:(CKKSKeychainView
*)view
218 withAttributes
:(NSDictionary
*)attributes
;
220 - (void)noteEvent
:(CKKSAnalyticsSignpostEvent
*)event
;
221 - (void)noteEvent
:(CKKSAnalyticsSignpostEvent
*)event inView
:(CKKSKeychainView
*)view
;
223 - (void)setDateProperty
:(NSDate
*)date forKey
:(NSString
*)key inView
:(CKKSKeychainView
*)view
;
224 - (NSDate
*)datePropertyForKey
:(NSString
*)key inView
:(CKKSKeychainView
*)view
;
228 @interface
CKKSAnalytics (UnitTesting
)
230 - (NSDate
*)dateOfLastSuccessForEvent
:(CKKSAnalyticsFailableEvent
*)event
231 inView
:(CKKSKeychainView
*)view
;
232 - (NSDictionary
*)errorChain
:(NSError
*)error
233 depth
:(NSUInteger
)depth
;
234 - (NSDictionary
*)createErrorAttributes
:(NSError
*)error
235 depth
:(NSUInteger
)depth
236 attributes
:(NSDictionary
*)attributes
;